反編譯與逆向分析apktool之初體驗(yàn)

由于工作原因,所以需要對(duì)Android的apk文件反編譯做一些了解,當(dāng)然,首先開(kāi)始就要選擇工具進(jìn)行解包了,在之前因?yàn)樽鲞^(guò)這方面的一些需求,所以毫無(wú)猶豫的使用了apktool來(lái)解包,apktool的命令非常簡(jiǎn)單,這里就不多說(shuō)了。

最近幾天解包合包非常頻繁,于是乎不出意外就遇到了這種:
(1).解包時(shí)候還好好的,合包時(shí)候就抽風(fēng):

Paste_Image.png

(2).相同的apktool,上一個(gè)文件還沒(méi)有問(wèn)題,再解一個(gè)新包的時(shí)候:

Paste_Image.png

(3).換了個(gè)apktool來(lái)解包,直接失敗,然后再換一個(gè)apktool,還是失敗:

Paste_Image.png

此時(shí)我的內(nèi)心是崩潰的,不同版本的apktool差異如此巨大,這活兒還怎么干。
當(dāng)然后來(lái)都找出來(lái)了原因:

(1).由于本身包體太大,文件的資源目錄太長(zhǎng),導(dǎo)致windows在執(zhí)行cmd命令時(shí)超出了windows命令行極限長(zhǎng)度8091個(gè)字節(jié),當(dāng)時(shí)使用的是apktool 2.0.2,于是自己換成了apktool 2.0.0居然就可以了,雖然我也不知道為什么會(huì)低版本正常,但是高版本居然出問(wèn)題

(2).比如在使用了apktool 2.0.2對(duì)demoA進(jìn)行了解包,下次我換成apktool 2.0.0對(duì)demoB進(jìn)行解包,此時(shí)會(huì)異常,因?yàn)楸仨氁獎(jiǎng)h除這個(gè)文件:


Paste_Image.png

具體為什么要?jiǎng)h除?對(duì)不起,我也不知道

(3).在對(duì)這個(gè)游戲包進(jìn)行解包時(shí),使用apktool 2.0.0失敗,換成2.0.2就成功,就是這么任性,原因?對(duì)不起,根本看不懂

看清楚了apktool的本質(zhì)了吧?就是這么不靠譜,在之前曾經(jīng)遇到過(guò)更坑的事情,將游戲提交給十個(gè)渠道,九個(gè)渠道都正常,就是有一個(gè)渠道,所有玩家在玩的時(shí)候,第一次打開(kāi),一定閃退,第二次就正常了,后來(lái)得知,渠道對(duì)所有提交的游戲包都會(huì)用自己的簽名重新打上簽名文件然后發(fā)行出去,最終檢查出來(lái)這個(gè)高版本的apktool會(huì)將游戲包的資源壓縮,但是CP并沒(méi)有對(duì)資源做解壓縮處理,所以導(dǎo)致找不到資源文件從而Crash,此刻從發(fā)行商到CP,到渠道商,內(nèi)心都是崩潰的(apktool:怪我咯!)

所以現(xiàn)在使用這種方式解包,我的內(nèi)心是拒絕的,為了解決出現(xiàn)apktool出現(xiàn)的詭異問(wèn)題,目前只能是將2.0.0之后版本的apktool完全下載下來(lái),然后使用的時(shí)候進(jìn)行遍歷,其實(shí)這種方式很傻,因?yàn)槲覀兿瓤匆谎踑pktool的版本:

Paste_Image.png

嗯,每次都從第一個(gè)遍歷,不行就試第二個(gè),雖然可行,但是總覺(jué)得很傻。

所以在思考有沒(méi)有更方便的方式,因?yàn)楣ぷ餍枰?,我?huì)修改smali文件以及AndroidManifest.xml文件,首先分兩塊思路:

(1).如果不用apktool的話,我該如何拿到apk里面的smali文件呢?
這個(gè)其實(shí)很簡(jiǎn)單,因?yàn)楸旧?apk文件就是一種文件壓縮格式,我直接解壓就可以拿到.dex文件:

Paste_Image.png
Paste_Image.png

那么我們拿到.dex文件之后如何轉(zhuǎn)換成.smali文件呢?
此時(shí)可以祭出大殺器--baksmali.jar,它可以將dex文件轉(zhuǎn)成smali:


Paste_Image.png

打開(kāi)指定的文件夾baksmaliFile文件夾:

Paste_Image.png

OK,沒(méi)有問(wèn)題

(2).下一步開(kāi)始操作我們需要的AndroidManifest.xml
在直接解壓包之后,因?yàn)榻?jīng)過(guò)了aapt的操作,所以我們拿到的xml是無(wú)法操作的,
所以我開(kāi)始想的是能不能通過(guò)aapt將xml直接導(dǎo)出來(lái),然后再通過(guò)aapt將apk中的AndroidManifest.xml給remove掉,隨后再將我處理過(guò)來(lái)的xml給add進(jìn)去,結(jié)果當(dāng)然是導(dǎo)出來(lái)啦:

Paste_Image.png

可是,這個(gè)是什么鬼,怎么這么丑?

Paste_Image.png

雖然能看懂,但不是我想要的,格式完全不對(duì),只能想其他辦法。

后來(lái)找到了AXMLPrinter2.jar這個(gè)神器:

Paste_Image.png

果然成功了:

Paste_Image.png

但是倆不一般大讓我感覺(jué)不舒服,不過(guò)還好,Androidmanifest.xml是一個(gè)二進(jìn)制的AXML文件,后者就是一個(gè)純xml,大小不一樣很正常,瀏覽了一下,格式也比較舒服,看起來(lái)比aapt導(dǎo)出來(lái)的好多了:

Paste_Image.png

(3).至于簽名,可以使用jarsigner和需要的keystore文件來(lái)生成RSA和SF文件,然后進(jìn)行替換,這個(gè)比較簡(jiǎn)單。

接下來(lái)的事情至于如何對(duì)smali文件進(jìn)行插樁,如何對(duì)AndroidManifest.xml進(jìn)行merge,我就可以交給腳本去做啦,包括后面的將AndroidManifest2.xml替換掉原來(lái)的AndroidManifest.xml我都可以放心的交給腳本去做啦!

前方高能:
這種替代apktool的方式其實(shí)我并沒(méi)有經(jīng)過(guò)更多的市場(chǎng)驗(yàn)證,甚至我自己的腳本都還沒(méi)有完成,完全不知道是不是可能會(huì)不會(huì)有比apktool更多的坑等著我,只是因?yàn)楸籥pktool折磨的不要不要的了,所以就想著有沒(méi)有能滿足自己需求的方式,我覺(jué)得如果不是對(duì)打包拆包有很大需求量的同學(xué),不要嘗試,因?yàn)閍pktool本身算是一個(gè)懶人集合工具包,它已經(jīng)很完善了

只是那些跟我一樣,對(duì)apktool的有以下幾點(diǎn)很DT:
(1).感覺(jué)各個(gè)版本完全是不兼容的,一個(gè)版本的apktool和另一個(gè)版本的像是兩個(gè)不同的工具
(2).出現(xiàn)的拆包打包c(diǎn)rash日志完全看不懂,不知道在說(shuō)什么
(3).對(duì)apktool的拆包合包的速度不能忍,通過(guò)解一個(gè)300M的包,我的8G內(nèi)存的電腦通常就干不了什么了,通過(guò)解壓和壓縮回去,我覺(jué)得能將速度提升不少

對(duì)這一塊有想法的同學(xué)可以跟我一起嘗試一下有沒(méi)有坑,如果有更好的方式,跪求分享 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容