icodetools工具地址:https://github.com/fourbrother/icodetools
一嫡意、前言
在前面已經(jīng)介紹了icodetools工具的實(shí)現(xiàn)原理和具體使用規(guī)則烁竭,關(guān)于這部分的知識點(diǎn)還不了解的同學(xué)可以去下面兩篇文章詳細(xì)查看:Android中注入代碼工具icodetools原理篇,Android中注入代碼工具icodetools完善篇戏仓。同時這個工具已經(jīng)放到github上了诽里,感興趣的同學(xué)可以下載嘗試各種app的代碼注入功能屹逛。
那么有了這兩篇文章之后疾渣,現(xiàn)在我得實(shí)際操作了,要動手操作一下這個工具冗茸,看看他到底有沒有使用價值席镀,下面就來看兩個例子,第一個例子是如何快速找到我們想要Hook的方法點(diǎn)夏漱,第二個例子是如何快速定位到應(yīng)用的二次簽名方法豪诲。
二、利用工具快速定位Hook方法
第一麻蹋、收集日志信息
這個例子咋們就直接用之前弄過的一個案例跛溉,微信搖塞子作弊器,不清楚的同學(xué)可以先去看看這篇文章:Android中微信搖塞子猜拳作弊器實(shí)現(xiàn)原理扮授。當(dāng)時如果有操作的同學(xué)會發(fā)現(xiàn)我們?yōu)榱苏业侥莻€Hook點(diǎn),廢了好多力氣才搞定的专肪,但是現(xiàn)在如果有了這個工具刹勃,我們就好辦了。
首先咋們繼續(xù)使用微信6.3.9版本嚎尤,有的同學(xué)說為什么不直接使用最新版荔仁,因?yàn)楸景咐菫榱藢Ρ戎澳欠N方式獲取hook點(diǎn)的,之前用了6.3.9版本芽死,這次一樣得用這個版本作比較呢乏梁。咋們弄到這個版本apk之后,放到icodetools工具目錄下关贵,默認(rèn)需要把a(bǔ)pk名稱改成src.apk遇骑,如果不想修改修改還得去修改腳本中的文件名,這里方便就直接改成src.apk就得了揖曾。
然后咋們運(yùn)行icodetools_1.0.bat腳本文件落萎。目錄下有兩個版本的腳本文件,是為了兼容更多的apk注入功能炭剪,默認(rèn)首先采用1.0版本進(jìn)行操作的练链。順利注入代碼之后,直接安裝apk奴拦。下面就要開始觀察日志信息了媒鼓。因?yàn)槟J(rèn)情況下日志是關(guān)閉的,而且日志的tag是jw。所以如果想開日志绿鸣,咋們還得自己手動打開日志開關(guān)疚沐。進(jìn)入/data/local/tmp目錄下,使用echo "-s 1" >log.txt命令寫入開關(guān)值即可枚驻。
但是在微信啟動的時候不建議開啟濒旦,因?yàn)橹暗奈恼轮姓f到了,微信app非常龐大再登,我們給每個類的每個方法都注入日志代碼了尔邓,所以如果你開始就開了日志,會發(fā)現(xiàn)微信可能打不開锉矢,會出現(xiàn)ANR梯嗽,打印日志太多了。所以建議開始的時候關(guān)閉日志沽损,等到了我們想要尋找hook點(diǎn)的地方在打開日志灯节,在觸發(fā)hook點(diǎn)邏輯,查看日志信息绵估。
我們想要找到搖塞子和猜拳的邏輯炎疆,所以咋們得先到聊天界面,然后打開發(fā)送搖塞子的界面国裳,這時候咋們可以打開日志了形入。但是這里又有一個地方需要思考,就是還是要先猜想一下缝左,這個搖塞子和猜拳都是隨機(jī)亿遂,所以應(yīng)該會有一個隨機(jī)數(shù)產(chǎn)生的方法,那么這個方法的返回值應(yīng)該是一個int值渺杉,當(dāng)然這個是個猜想蛇数。那么這里為了驗(yàn)證這個猜想,也是為了防止打印過多的方法日志是越,咋們再一次做一個過濾耳舅,就是限制打印日志的方法的返回值是int類型的。
這個在之前介紹過了英妓,咋們現(xiàn)在是支持這種過濾規(guī)則的挽放,所以咋們需要設(shè)置的規(guī)則為:echo "-s 1 -r int" >log.txt。這個命令是在/data/local/tmp目錄下運(yùn)行的蔓纠。其中-s 1就是代表打開日志辑畦,-r int表示只打印方法返回值是int的日志信息。有了這個規(guī)則之后腿倚,咋們就開始點(diǎn)擊屏幕的搖塞子纯出,這時候會發(fā)現(xiàn)日志還是很多的。所以為了收集更多的日志,咋們得把日志輸出到一個文件中暂筝,后面就可以慢慢分析了箩言,可以使用命令:adb logcat -s jw > D:\loginfo.txt,這樣咋們就可以在我們點(diǎn)擊搖塞子的瞬間把日志都收集到loginfo.txt文件中了焕襟。當(dāng)發(fā)現(xiàn)塞子出現(xiàn)的時候陨收,說明程序已經(jīng)結(jié)束了我們想要的hook方法邏輯,這時候?yàn)榱瞬蛔屛⑿爬^續(xù)ANR鸵赖,咋們得立馬關(guān)閉日志务漩,命令很簡單:echo "-s 0" >log.txt。
第二它褪、分析日志信息
下面咋們就要來分析一下上面收集的日志信息了loginfo.txt:
我們會發(fā)現(xiàn)就在剛剛點(diǎn)擊了一下?lián)u塞子的邏輯饵骨,結(jié)果日志就有了幾M,所以可以看到微信的工程得多龐大茫打。下面就要來借助一定經(jīng)驗(yàn)值來做過濾分析了居触,比如上面的方法,明顯是v4包中老赤,肯定不是我們想要的轮洋,所以直接過濾。繼續(xù)往下看抬旺,這個過程中可能一個方法會被打印多次砖瞧,但是一定要有耐心,慢慢分析:
這里看到了嚷狞,有一個方法比較可疑,先記錄一下荣堰,并且在這里我們發(fā)現(xiàn)了床未,那個表情的控件SmileyGrid,是個表格布局振坚,就是我們表情中用到的薇搁。所以這個方法非常可疑渡八。繼續(xù)往下看:
這個方法一樣也是比較可疑的啃洋,先記錄一下。繼續(xù)往下看:
這個方法也是比較可疑的屎鳍,記錄一下宏娄,繼續(xù)往下看:
這里發(fā)現(xiàn)了一個操作數(shù)據(jù)庫的方法,但是這里又要借助經(jīng)驗(yàn)值了逮壁,我們想要的是隨機(jī)數(shù)邏輯孵坚,不可能借助數(shù)據(jù)庫還需要從數(shù)據(jù)庫中拿到隨機(jī)數(shù)值,微信沒必要這么做吧。所以本次就過濾了卖宠,但是有的同學(xué)可能發(fā)現(xiàn)這個沒有那么強(qiáng)的說服力巍杈,為了有說服力,咋們也把這個方法記錄一下扛伍,但是處理的優(yōu)先級比較低筷畦。
第三、分析可疑方法代碼
好了到這里我們就大致看完了日志中的數(shù)據(jù)刺洒,雖然好M的信息鳖宾,但是大部分都是重復(fù)方法打印的信息,還有其他邊都不碰不到的方法這里也沒有在說明了作媚,從上面分析之后攘滩,我們有了四個方法需要去查看:
1、com.tencent.mm.model.ah.tv
2纸泡、com.tencent.mm.sdk.platformtools.bb.d
3漂问、com.tencent.mm.sdk.platformtools.bb.pu
4、com.tencent.kingkong.DatabaseUtils.getSqlStatementType
下面就來一次查看這四個方法的實(shí)現(xiàn)邏輯女揭,咋們還是得借助Jadx工具打開微信apk:
第一個方法:com.tencent.mm.model.ah.tv
從這個方法的實(shí)現(xiàn)邏輯和一些應(yīng)用本身的日志信息蚤假,發(fā)現(xiàn)這個方法并不是我們想要的,反而和獲取微信uin值有很大關(guān)系吧兔。所以這個方法咋們就可以忽略了磷仰。
第二個方法:com.tencent.mm.sdk.platformtools.bb.d
這個方法比較可疑了牧抽,從代碼邏輯實(shí)現(xiàn)上看是轉(zhuǎn)化Integer值祝蝠,并且還有一個默認(rèn)值i,所以和我們想要的隨機(jī)數(shù)可能有關(guān)系雅宾,先記住他箍土。
第三個方法:com.tencent.mm.sdk.platformtools.bb.pu
看到這個方法就會眼前一亮逢享,既然有隨機(jī)數(shù)代碼了,心中黯然竊喜呀吴藻。不過也不能非常的肯定就是他了瞒爬。所以這里還是得記住它,后面會進(jìn)行hook該方法驗(yàn)證正確性沟堡。
第四個方法我是真心不想實(shí)驗(yàn)了侧但,真的不敢相信要一個隨機(jī)數(shù)還和數(shù)據(jù)庫扯上關(guān)系,咋們?yōu)榱朔奖阒苯酉仁褂肵posed框架hook上面那兩個方法了航罗,驗(yàn)證結(jié)果禀横,如果是的,那就萬事大吉了伤哺,如果不是再回來看不遲燕侠。
第四者祖、hook驗(yàn)證結(jié)果
關(guān)于如何利用Xposed框架hook應(yīng)用的方法這里不多解釋了,不了解的同學(xué)可以去看這篇文章:Xposed框架使用原理解析绢彤。咋們直接hook上面提到的兩個可以方法:
com.tencent.mm.sdk.platformtools.bb.d和com.tencent.mm.sdk.platformtools.bb.pu七问。
咋們編寫完hook模塊之后重啟設(shè)備生效,然后再次打開微信茫舶,觸發(fā)搖塞子的邏輯械巡。這時候會發(fā)現(xiàn)這兩個方法都執(zhí)行了,而且打印的值正是我們搖塞子的值饶氏,那么現(xiàn)在有了兩個方法讥耗,我們該處理哪個呢?這個需要看個人處理了疹启,但是從上面代碼來看古程,顯然pu方法靠譜點(diǎn)。因?yàn)樗麅?nèi)部都有實(shí)現(xiàn)隨機(jī)方法的邏輯了喊崖,應(yīng)該非常準(zhǔn)確的挣磨。
第五、工具使用經(jīng)驗(yàn)總結(jié)
到這里我們就借助了icodetools工具打印的日志信息來快速定位到我們想要hook的方法荤懂,從整個過程來看比我們之前操作那是方便了多了茁裙,但是這里還是需要借助一些經(jīng)驗(yàn)值,比如猜想是不可少的节仿,搖塞子猜拳應(yīng)該是隨機(jī)的晤锥,而且有這樣一個方法返回隨機(jī)之后的值,一般是int類型的廊宪,所以我們就加上日志過濾規(guī)則了矾瘾,減少日志信息量。在得到了日志信息之后箭启,對于有些方法憑借經(jīng)驗(yàn)值就可以斷定沒有任何關(guān)系的就可以過濾了霜威。對于可以的方法一定要做記錄,然后依次在借助Jadx去查看代碼實(shí)現(xiàn)册烈,從代碼實(shí)現(xiàn)邏輯在分析是否有關(guān)系。沒有的話可以進(jìn)行過濾了婿禽。所以從這里可以看到我們憑借著經(jīng)驗(yàn)值赏僧,做了好幾次過濾操作:
第一次過濾:猜想搖塞子猜拳應(yīng)該是借助一個隨機(jī)方法得到隨機(jī)值,方法返回值應(yīng)該是int類型扭倾,這樣就過濾了大量的日志信息淀零,便于后續(xù)分析日志信息了。
第二次過濾:通過查看日志信息中方法的包名和方法名可以斷定有些方法肯定和我們想要的沒任何關(guān)系膛壹。
第三次過濾:通過查看具體方法的代碼實(shí)現(xiàn)驾中,可以斷定和我們想要的邏輯沒有任何關(guān)系唉堪。
通過上次的幾層過濾之后,我們可能還是有多個方法比較可疑肩民,這時候就可以借助Xposed進(jìn)行hook了唠亚,可以把這些可疑方法全部hook一遍,反正有沒有多大難度持痰,然后在通過觸發(fā)邏輯查看hook之后的信息灶搜。在找到匹對的對應(yīng)方法就好。如果有多個方法都匹對上了工窍,那么這時候就需要看個人了割卖,既然hook正確了,用哪個方法操作沒有任何影響了患雏。
三鹏溯、利用工具快速定位應(yīng)用校驗(yàn)方法
第一、收集日志信息
上面的那個例子中我們借助了icodetools工具快速定位到我們想要的hook方法點(diǎn)了淹仑,下面咋們繼續(xù)看另外一個場景丙挽,就是現(xiàn)在有些app為了防止破解,加了一些防護(hù)策略攻人,關(guān)于Android中應(yīng)用的防護(hù)策略取试,不了解的同學(xué)可以看這篇文章:Android中安全防護(hù)策略分析。下面就來分析一款app的簽名校驗(yàn)防護(hù)功能怀吻,首先不多解釋瞬浓,先去搞一個apk,然后放到icodetools目錄下蓬坡,然后改成src.apk猿棉,繼續(xù)運(yùn)行腳本icodetools_1.0.bat文件。具體操作步驟和上面處理微信一樣屑咳,但是這里有個不同的地方萨赁,因?yàn)槲覀兪?strong>想找簽名校驗(yàn)方法,一般簽名校驗(yàn)方法都是在程序啟動的時候兆龙,如果發(fā)現(xiàn)簽名不對就立馬退出程序了杖爽,所以這里開始的時候就需要打開日志開關(guān):echo "-s 1" >log.txt,依然在/data/local/tmp目錄下運(yùn)行即可紫皇,然后點(diǎn)擊程序慰安,這時候會發(fā)現(xiàn)程序起不來的,因?yàn)橛泻灻r?yàn)邏輯聪铺,肯定啟動不起來化焕。但是我們已經(jīng)收集了日志了:adb logcat -s jw >D:\loginfo.txt。
第二铃剔、分析日志信息
接下來就開始分析日志信息了:
這個方法比較可以撒桨,從命名上可以看到這個BaseApplication類應(yīng)該是應(yīng)用的入口Application類的基準(zhǔn)類查刻,可能在靜態(tài)代碼塊中有校驗(yàn)功能,所以先記錄一下這個類凤类。繼續(xù)往下看:
在上面那個BaseApplication基準(zhǔn)類的靜態(tài)代碼塊中調(diào)用了asz類的方法了穗泵,所以這里先記錄asz類信息,繼續(xù)往下看:
這里又有一個ShuqiApplication類踱蠢,這個應(yīng)該就是程序的入口Application類了火欧,記錄信息,繼續(xù)往下看:
這里還是ShuqiApplication的attachBaseContext方法茎截,這個時機(jī)也是應(yīng)用啟動比較早的苇侵。先記錄一下,繼續(xù)往下看:
在ShuqiApplication的onCreate方法企锌,這個時機(jī)也是應(yīng)用啟動比較早的榆浓,先記錄下,繼續(xù)往下看:
依然是是這些在ShuqiApplication的onCreate方法中的一些其他方法調(diào)用撕攒。都記錄一下陡鹃。
到這里大致分析完了日志信息,其實(shí)有很多其他信息抖坪,但是那些和我們想要的結(jié)果沒有任何關(guān)系萍鲸,比如拆包功能的類信息multidex,定時上報(bào)功能等擦俐,限于篇幅原因這里也就不多介紹了脊阴。
第三、分析可疑方法代碼
上面記錄了幾個方法蚯瞧,其實(shí)我們可以看到嘿期,主要就三個時機(jī):
第一個時機(jī):應(yīng)用Application的靜態(tài)代碼塊處,那里有幾個方法比較可疑:asz.dy方法埋合。
第二個時機(jī):應(yīng)用Application的attachBaseContext方法备徐。內(nèi)部暫時沒看到可疑方法。
第三個時機(jī):應(yīng)用Application的onCreate方法甚颂,他內(nèi)部有幾個方法比較可疑:avo類的初始化方法蜜猾,bhw.cv方法等。
所以從這里可以看到振诬,一般應(yīng)用的簽名校驗(yàn)方法大部分可能存在這三個時機(jī)的地方瓣铣。以后如果發(fā)現(xiàn)應(yīng)用有驗(yàn)證操作的話,可以直接看這三個時機(jī)地方代碼即可贷揽。下面咋們就用Jadx打開apk,一次來看這些地方:
第一個:com.shuqi.android.app.BaseApplication
通過查看源碼發(fā)現(xiàn)梦碗,這個類并沒有太多的邏輯禽绪,可以忽略了蓖救。
第二個:com.shuqi.application.ShuqiApplication靜態(tài)代碼
這里也沒發(fā)現(xiàn)啥校驗(yàn)邏輯,可以忽略了印屁。
第三個:com.shuqi.application.ShuqiApplication的attachBaseContext方法
這里看到只有一些統(tǒng)計(jì)上報(bào)代碼和處理多dex的循捺,唯一有點(diǎn)可疑的是aw.y代碼,可以點(diǎn)進(jìn)去看看:
從代碼邏輯來看雄人,應(yīng)該是處理多dex加載的邏輯从橘,所以被深度混淆了。應(yīng)該和簽名校驗(yàn)沒關(guān)系础钠。忽略恰力。
第四個:com.shuqi.application.ShuqiApplication的onCreate方法
從上面的日志記錄方法信息來看,avo類的初始化旗吁,bhw.cv方法等信息踩萎,所以這里最可疑了,但是我們會發(fā)現(xiàn)在bhw.cv方法之后就沒有再多的日志信息了:
從代碼來看很钓,理論上應(yīng)該還有后面awp.tY方法的日志香府,所以這里很有可能是bhw.cv方法之后直接退出程序了。我們可以進(jìn)入bhw.cv方法進(jìn)行查看:
第四码倦、驗(yàn)證結(jié)果
查看之后就眼睛一亮企孩,果然這里做了簽名校驗(yàn),簽名不對就直接自殺退出程序了袁稽。所以咋們就算是找到這個校驗(yàn)方法了勿璃,那么下面就簡單了,直接把這個方法注釋就好了运提。關(guān)于怎么注釋這個方法那就簡單了蝗柔,反編譯成smali文件,找到ShuqiApplication的onCreate方法中的bhw.cv直接注釋即可民泵,然后在回編譯就可以正常運(yùn)行程序了癣丧。
第五、經(jīng)驗(yàn)總結(jié)
到這里咋們就利用了icodetools工具找到應(yīng)用的簽名校驗(yàn)方法了栈妆,從上面的分析過程其實(shí)我們總結(jié)了一些處理校驗(yàn)方法的經(jīng)驗(yàn)胁编,
第一:一般校驗(yàn)時機(jī)都比較早,主要是在應(yīng)用的Application的靜態(tài)代碼塊鳞尔,attachBaseContext方法嬉橙,onCreate方法。所以可以直接去這三個時機(jī)地方查看代碼邏輯寥假。
第二:簽名校驗(yàn)失敗時候程序會退出市框,也就是程序的方法不會再執(zhí)行了,我們插入的日志信息就會斷了糕韧,那么我們可以直接去日志信息看最后幾條方法堆棧信息枫振,可以快速定位到簽名校驗(yàn)方法喻圃,比如本例中的日志信息中最后一個方法就是簽名校驗(yàn)方法。
四粪滤、工具使用經(jīng)驗(yàn)概況
以上就分析完了兩個案例斧拍,詳細(xì)的介紹了如何利用icodetools工具來進(jìn)行破解工作,從整個流程來看非常方便杖小。但是也是需要借助一些經(jīng)驗(yàn)才能更好的使用這個工具肆汹。下面就通過這兩個例子的分析結(jié)果總結(jié)使用工具進(jìn)行破解的時候需要哪些經(jīng)驗(yàn)值:
第一個:在打印日志的時候需要注意的是如果想找到一些app的hook點(diǎn)方法,我們需要在觸發(fā)這個hook點(diǎn)邏輯之前最好是關(guān)閉日志予权,等要觸發(fā)這個hook點(diǎn)邏輯時在打開日志昂勉。
第二個:對于hook點(diǎn)還是前期要有猜想操作,能夠做第一次日志過濾伟件,比如方法的返回類型硼啤,參數(shù)類型等。
第三個:對于日志信息分析的時候需要仔細(xì)觀察哪些方法適合我們本次想要的結(jié)果有關(guān)系的斧账,沒有關(guān)系的直接忽略谴返。
第四個:在分析日志之后得到一些可疑方法,我們可以直接把這些方法都hook一遍咧织,然后在此運(yùn)行應(yīng)用觸發(fā)hook點(diǎn)嗓袱,查看我們hook日志信息,如果有多個方法都被觸發(fā)了习绢,那么此刻就要看個人了渠抹,選擇任何一個方法都可以進(jìn)行操作了,但是如果可以借助每個方法的源碼邏輯來抉擇具體方法那是最好了闪萄。
第五個:對于一些應(yīng)用有應(yīng)用校驗(yàn)功能(現(xiàn)象一般是重簽名之后運(yùn)行程序失敗)梧却,我們開始啟動程序之前就得打開日志信息,因?yàn)槲覀兊檬占绲男畔ⅰ?br>
第六個:在有校驗(yàn)功能的app中败去,他們一般都是驗(yàn)證失敗就退出程序了放航,進(jìn)而后面的程序代碼中的方法就不執(zhí)行日志也就斷了,所以我們可以從日志信息的最后幾條記錄來快速定位關(guān)鍵方法圆裕。
特此說明
到這里關(guān)于icodetools工具就介紹差不多了广鳍,從原理解析,再到完善吓妆,最后在實(shí)踐赊时。相信即使這個工具有人覺得沒多大用,但是從原理中或許可以得到一些知識點(diǎn)行拢,當(dāng)然個人覺得此工具還是很有用的祖秒,因?yàn)槲覀儸F(xiàn)在看到的只是添加日志,其實(shí)這里還隱藏一個功能,就是可以隨意插入自己想要的代碼邏輯竭缝,就是在JWUtils類中自己定義方法狐胎,然后在腳本中設(shè)置方法即可,比如現(xiàn)在想在源apk中指定類的指定方法中加上下載我們自己應(yīng)用的代碼歌馍,這里就好辦了。首先我們可以通過開關(guān)控制指定類名和方法名即可晕鹊,然后自己寫下載apk的邏輯即可松却。這樣是否可以給自己apk導(dǎo)量呢?
后期還會繼續(xù)優(yōu)化溅话,通過這幾天用戶使用者反饋意見晓锻,主要優(yōu)化如下:
1、工具平臺兼容飞几,后續(xù)得繼續(xù)兼容Linux和OS X系統(tǒng)砚哆。
2、關(guān)于腳本命令參數(shù)可以簡化屑墨,沒必要那么多參數(shù)設(shè)置躁锁,比如aapt路徑等。
3卵史、這個最重要战转,也是用戶反饋的需求,就是如果能夠打印方法的參數(shù)值就好了以躯,這個后續(xù)會通過在JWUtils類中的方法printStackTrace的參數(shù)傳遞需要打印方法的所有參數(shù)值槐秧。
工具下載地址:https://github.com/fourbrother/icodetools
五、總結(jié)
我相信每個工具的出現(xiàn)都有它的特定需求忧设,當(dāng)工具出來了刁标,最重要的就是能夠經(jīng)得起用戶的實(shí)際測試,遇到一些問題是在所難免的址晕,所以還是那句話膀懈,在使用的過程中如果發(fā)現(xiàn)一些問題和建議一定記得給我反饋,我會進(jìn)行問題修復(fù)斩箫。關(guān)于反饋渠道可以通過加我微信或者留言公眾號都可以吏砂。最后還要說明一下,就是這個工具的源碼暫時先不開源乘客,因?yàn)楝F(xiàn)在這個工具個人覺得還不是很穩(wěn)定狐血,肯定還有很多問題,想通過大家在使用過程中給我的反饋我進(jìn)行一段時間的修復(fù)之后易核,穩(wěn)定了我就會開源匈织。謝謝大家的支持,文章寫得我精力充沛,但是還是感覺身體感覺被掏空了一樣缀匕,所以還是得要你們的多多點(diǎn)贊纳决,打賞來給我安慰!乡小!
更多內(nèi)容:點(diǎn)擊這里
關(guān)注微信公眾號阔加,最新技術(shù)干貨實(shí)時推送
掃一掃加小編微信添加時注明:“編碼美麗”否則不予通過!