筆者是一枚程序員,同時(shí)也是個(gè)美食愛(ài)好者,一直想用技術(shù)做點(diǎn)自己的事情,剛好最近開(kāi)始研究逆向工程,實(shí)現(xiàn)下廚房作品自動(dòng)點(diǎn)贊的小功能,以后再也不用點(diǎn)贊點(diǎn)到手抽筋了,哈哈哈~
注
本文純粹用于學(xué)習(xí)研究,希望各位讀者不要用戶商業(yè)或其它非法途徑上,筆者概不負(fù)責(zé)哦~
本文是一篇關(guān)于越獄開(kāi)發(fā)的文章,以下內(nèi)容均以越獄機(jī)器為前提
筆者也是剛剛學(xué)習(xí)越獄開(kāi)發(fā),不喜勿噴,同時(shí)歡迎高手指導(dǎo),謝謝大家~
本文的參考文章如下,感謝兩位博主的分享:
一步一步實(shí)現(xiàn)iOS微信自動(dòng)搶紅包(非越獄)
iOS Security
接下來(lái)我們進(jìn)入正題,首先,我們先來(lái)研究下Hook的流程:
脫殼:
從AppStore下載應(yīng)用,并使用dumpdecrypted.dylib
脫殼,脫殼之后生成.decrypted
文件導(dǎo)出頭文件:
使用class-dump
導(dǎo)出頭文件,導(dǎo)出后可將所有頭文件放到一個(gè)XCode工程中方便閱讀分析:
分析要Hook方法,根據(jù)自己想要Hook的功能,借助Reveal工具等定位到具體的method創(chuàng)建tweak項(xiàng)目:
本文中使用theos
,修改tweak.xm文件,編寫(xiě)代碼打包,注入:
利用thoes自動(dòng)打包并注入到應(yīng)用中調(diào)試:
使用syslog
調(diào)試,修改之后重新打包
越獄開(kāi)發(fā)的大概流程如上所述,以下廚房作品自動(dòng)點(diǎn)贊功能為例,詳細(xì)步驟如下:
脫殼
準(zhǔn)備工作:
下載dumpdecrypted-master.zip,下載完成之后,解壓,進(jìn)入dumpdecrypted-master目錄下,執(zhí)行make
命令即可生成dumpdecrypted.dylib
- 從AppStore中下載下廚房的
ipa
文件,保留備用,同時(shí)在越獄手機(jī)上安裝一份
-
ssh到手機(jī)上
,在terminal中執(zhí)行如下命令:
ssh root@ip
- 在手機(jī)上打開(kāi)下廚房應(yīng)用(最好將其它應(yīng)用都關(guān)掉),在terminal中執(zhí)行如下命令,
找到mach-o文件
:
ps -e
執(zhí)行結(jié)果如下:
可看到mach-o文件路徑為:
/var/mobile/Containers/Bundle/Application/E5380AA9-7785-449C-A94E-154E9AEAB147/recipe.app/recipe
-
找到應(yīng)用document位置
,在terminal中執(zhí)行如下命令開(kāi)始cycript調(diào)試:
cycript -p recipe
然后在cycript下執(zhí)行代碼,獲取document位置
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]
執(zhí)行結(jié)果如下:
可以看到document路徑為:
/var/mobile/Containers/Data/Application/02DFAEDA-14D1-4486-8890-F239C8D29FB1/Documents
-
將dumpdecrypted.dylib放到該應(yīng)用的Document下面
使用scp將dumpdecrypted.dylib拷貝到Document目錄下面,scp命令如下:
scp dumpdecrypted.dylib root@192.168.2.3:/var/mobile/Containers/Data/Application/02DFAEDA-14D1-4486-8890-F239C8D29FB1/Documents
-
脫殼
脫殼命令如下,DocumentPath
為上面獲取到的Document目錄,machOpath
為mach-o文件的位置:
DYLD_INSERT_LIBRARIES=/DocumentPath/dumpdecrypted.dylib /machOpath
本例中執(zhí)行語(yǔ)句如下:
DYLD_INSERT_LIBRARIES=/var/mobile/Containers/Data/Application/02DFAEDA-14D1-4486-8890-F239C8D29FB1/Documents/dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/E5380AA9-7785-449C-A94E-154E9AEAB147/recipe.app/recipe
脫殼之后會(huì)在手機(jī)的當(dāng)前目錄下生成XX.decrypted
文件,一般在根目錄下:/var/root
,再次使用scp
將XX.decrypted
文件下載到本地。
class-dump導(dǎo)出頭文件
脫殼之后的文件就可以使用class-dump
將頭文件導(dǎo)出了,導(dǎo)出命令如下:
./class-dump -s -S -H ./XX.decrypted -o ./filedir
filedir
為導(dǎo)出文件夾,隨意指定,導(dǎo)出后可以在文件夾下面看到recipe的.h
文件,為了方便瀏覽可以新建一個(gè)工程并導(dǎo)入
找出要hook的方法
筆者也是越獄剛剛?cè)腴T(mén),并沒(méi)有用IDA等高級(jí)的工具,這里使用的工具有Reveal
,Charles
-
這里使用
reveal
來(lái)定位到下廚房每一餐作品頁(yè)面的Controller
在Reveal找到對(duì)應(yīng)的Controller -
定位到方法
-
找到controller為
XcfEventViewController
之后,就可以在剛剛class-dump導(dǎo)出的文件XcfEventViewController .h
中去找點(diǎn)贊的方法,但是看了一下發(fā)現(xiàn)并沒(méi)有類似favor的方法,為了確定點(diǎn)贊方法的名稱,我們使用Charles
來(lái)查看下點(diǎn)贊的接口,如圖:
charles查看點(diǎn)贊接口信息
我們發(fā)現(xiàn)URL里面有dishes和digg字段 根據(jù)這兩個(gè)單詞我們?nèi)?code>XcfEventViewController .h里面查找,發(fā)現(xiàn)并沒(méi)有相關(guān)方法,那么,根據(jù)以往經(jīng)驗(yàn),一般這種方法我們會(huì)寫(xiě)在Cell里面,那同樣適用Reveal定位到cell的名稱為
XcfNewDishGridView
果然,在
XcfNewDishGridView .h
里面找到一個(gè)名稱為diggDish
的方法,接下來(lái)在代碼中驗(yàn)證我們找到的方法是否正確
-
創(chuàng)建tweak工程
安裝thoes,并創(chuàng)建tweak工程
具體怎樣安裝不多說(shuō),詳細(xì)可以查看http://security.ios-wiki.com/issue-3-6/修改tweak.xm文件
核心代碼其實(shí)很簡(jiǎn)單,只是在collectionView:cellForItemAtIndexPath
里面調(diào)用cell的diggDish
方法:
[cell diggDish];
但是,點(diǎn)贊還需要很多條件,首先我們要定位到哪個(gè)作品,然后根據(jù)作品判斷是否符合點(diǎn)贊的條件,比如:
判斷是否已經(jīng)點(diǎn)贊過(guò)
是否會(huì)越界以防崩潰
檢查id是否合法
這些都要一步步的去思考、調(diào)試
- 打包,terminal進(jìn)入到tweak工程目錄下,執(zhí)行兩條命令:
make
make package install
deb包會(huì)自動(dòng)安裝到越獄設(shè)備上
注意,安裝theos之后THEOS_DEVICE_IP
一定要配,這個(gè)是你自己越獄設(shè)備的IP,這樣才可以通過(guò)上面的命令安裝到你的設(shè)備上
調(diào)試
打包之后有可能會(huì)有問(wèn)題,這就需要我們使用syslog
來(lái)調(diào)試找到問(wèn)題,syslog
的使用方法如下:
grep recipe /var/log/syslog
可以在代碼里使用NSLog
,這樣打印出的內(nèi)容就可以在syslog文件中看到,可以把recipe替換成任何你想要查找的文字
當(dāng)然,并不是所有的問(wèn)題都可以在syslog
中查到,一些業(yè)務(wù)問(wèn)題不大會(huì)報(bào)錯(cuò),可能比較難查找,要綜合分析,筆者碰到的問(wèn)題比如:
列表中有一些id=0的情況,這些數(shù)據(jù)應(yīng)當(dāng)排除掉,那么取到dish.id和dish.eventId發(fā)現(xiàn)都無(wú)法實(shí)現(xiàn)效果,和charles比對(duì)才發(fā)現(xiàn)id被開(kāi)發(fā)者隱藏起來(lái),通過(guò)shareObjectIdentifier
方法提供
結(jié)束
除此之外還遇到其他一些小問(wèn)題,這里就不一一給大家介紹了,在越獄開(kāi)發(fā)的過(guò)程中會(huì)碰到很多問(wèn)題,靜下心來(lái)思考總會(huì)找到辦法解決的,希望和大家一同進(jìn)步_
本例詳細(xì)的代碼可以去我的github上面下載:
github地址
同時(shí)也希望感興趣的小伙伴幫我點(diǎn)個(gè)贊哦~互相幫助,大家都懂的~~