關(guān)于如何注入?
開篇的時(shí)候有個(gè)圖片就是我在地圖里面注入了一個(gè)蒼老師的圖片其實(shí)就是,自己寫了個(gè) imageloader,用來下載網(wǎng)絡(luò)圖片,再寫個(gè) activity 或者 dialog 來承載這個(gè) imageview,然后編譯,再反編譯,取出相應(yīng)的smali等文件,比如貼到已經(jīng)反編譯好的地圖的里面,把開啟這個(gè)蒼老師圖片下載的啟動(dòng)代碼放到合適位置,最后再把地圖重新打包簽名,就ok 了。
hook 代碼也是同理注入,驗(yàn)證一下,成功(我這塊寫的比較粗略,代碼比較多,只說思路了)那么這種代碼注入和 hook 相結(jié)合的方式能干什么呢,我們也不妨搞出點(diǎn)事情來。同樣我們還是進(jìn)行微信運(yùn)動(dòng)作弊的事情,其實(shí)很多運(yùn)動(dòng)類的軟件都可以把自己的數(shù)據(jù)同步到微信運(yùn)動(dòng)里,比如小米手環(huán),樂動(dòng)力,悅動(dòng)圈等等。
那我們就先拿一個(gè)來開刀吧:經(jīng)過一系列的跟蹤代碼定位,最終定位到了這個(gè)類 cn.ledongli.ldl.cppwrapper.DailyStats 里的 f 方法(f 是因?yàn)榇a混淆了)然后我們注入并 hook 方法,讓它返回66666,ok,我們看到了如下效果:

然后我們在應(yīng)用里面登陸微信賬號,和對接到微信運(yùn)動(dòng)的功能,發(fā)現(xiàn)不好用,是因?yàn)?,微信里面做了對?yīng)用的簽名校驗(yàn),應(yīng)用的簽名已經(jīng)變了。
所以我們只能破解微信了(悶聲作大死),同樣注入 hook 代碼,讓微信獲取樂動(dòng)力的簽名的時(shí)候取得正確簽名,關(guān)鍵代碼:
if( packageName.equals( "cn.ledongli.ldl")){
if ( result instanceof PackageInfo) {
PackageInfo info = (PackageInfo) result;
info. signatures[0] = new Signature( myHexLedongli);
param.setResult( info);
}
}
再把這個(gè)盜版的微信重新打包簽名,重新進(jìn)行應(yīng)用的同步數(shù)據(jù)操作,再進(jìn)微信運(yùn)動(dòng)看看,是不是已經(jīng)66666了。至此作弊完成。
♂♂♂♂♂♂♂♂♂♂我是畫風(fēng)不同的分割線♂♂♂♂♂♂♂♂♂♂♂♂
說了這么多破解的,也該聊聊防破解的了。
google 最早給的就是代碼混淆的方案,其實(shí)一般的混淆只是降低了代碼的可讀性,讓你對反編譯出來的函數(shù)命名等不知道什么意思,不過解讀出來只是時(shí)間問題。后來還有資源混淆的,但是意義不大。
后來有了核心代碼用 C 實(shí)現(xiàn),寫成 SO,加花指令的辦法,這個(gè)辦法確實(shí)會(huì)阻止一大部分人的繼續(xù)破解,但是對于經(jīng)常做逆向的工程師來說也不是什么難題。
其實(shí)做這么多大多數(shù)軟件的初衷就是不想軟件被盜版,然后被注入亂七八糟的廣告,或者被盜取信息等,后來就有了盜版檢測機(jī)制。比如:JAVA 層的簽名校驗(yàn),NDK 層校驗(yàn),分段存放簽名 Hash 串,服務(wù)器校驗(yàn)等等,但是這些方法我都在上面說了破解方法。
現(xiàn)在國內(nèi)的一般應(yīng)用市場都有對 APP 簽名的檢測,在你下載的時(shí)候會(huì)告訴你這個(gè) APP 是不是盜版的,從而讓用戶區(qū)分出來。但是應(yīng)用市場自己本身又被盜版了怎么辦呢?
再后來,就有了像360加固保和騰訊的樂固等產(chǎn)品,so 做了加密,真正的 dex 也藏起來了,不過個(gè)人覺得,就算真正的 dex 也需要變成 odex 了,root 的手機(jī)取到 odex,再轉(zhuǎn)回 dex,就能拿到真正的 dex(雖然我沒試過,但是我覺得可能是一個(gè)思路),所以這個(gè)方法就更難破解了。
雖然加固產(chǎn)品很厲害,但是也會(huì)有他的缺陷,Android 系統(tǒng)不斷的更新升級,也許就換了某些模式等等,比如 ART 剛出來的時(shí)候,加固保加固后的 Apk,在 ART 模式運(yùn)行下就會(huì) Crash。這些加固產(chǎn)品要不斷的適配各種型號的手機(jī),CPU 類型,運(yùn)行模式等等,所以很多 APP 為了考慮兼容性,他們也不會(huì)輕易去加固自己的產(chǎn)品。
♂♂♂♂♂♂♂♂♂♂我是畫風(fēng)不同的分割線♂♂♂♂♂♂♂♂♂♂♂♂
關(guān)于逆向破解 Android 應(yīng)用,我覺得耐心很重要吧,代碼跟來跟去確實(shí)很枯燥,總結(jié)幾點(diǎn)小技巧吧:1.信息反饋:通過界面的一些彈出信息,界面特點(diǎn)尋找突破點(diǎn)。2.特征函數(shù):比如搜 Toast,Log,getSignature 等。3.代碼注入:把 toast 或者 log 函數(shù)注入到程序中,跟蹤位置。4.打印堆棧:插入 new Exception(“定位”).printStackTrace();5.網(wǎng)絡(luò)抓包:通過抓包得到的關(guān)鍵字段,在代碼中定位。
**寫在后面:
**這篇文章整理了有一段時(shí)間了,覺得還是應(yīng)該寫出來,也不是什么高深的技術(shù)文章,就是個(gè)人總結(jié)的一點(diǎn)心得而已。
關(guān)于破解應(yīng)用很多人可能會(huì)去破解別人的應(yīng)用注入廣告來獲取利益,也有可能盜取別人的信息。
不過我們作為有節(jié)操的開發(fā)工程師,應(yīng)該本著瑞雪的精神看待技術(shù),學(xué)習(xí)技術(shù),而不是亂♂搞。但是我們也應(yīng)該知道,我們的應(yīng)用有可能會(huì)被別人怎么搞……
最后推薦一本資料書,大家可以有空看看。
