《Android-packinfo》是一款安卓apk查殼工具,簡單來說就是查詢apk的加固廠商,軟件采用c#語言編寫,界面簡單,即使是小白也能輕松地查出apk的加固廠商,并為我們推薦了脫殼工具,非常地好用。
運(yùn)行原理
檢測包內(nèi)的so和dex里的類名來判斷加固的廠商
功能介紹
檢測apk的加固廠商
注意事項(xiàng)
軟件已開源,原理就是遍歷APK里的文件,匹配SO來判斷加固,目前1版的缺陷就是僅僅判斷了So,但已經(jīng)引入了jar支持,卻沒有做dex及其它分析方式
2版會(huì)完善這些缺陷!
如果發(fā)現(xiàn)有加固無法識(shí)別或加固識(shí)別不精準(zhǔn)的Bug可以反饋在下方,如是其它問題可以自行下載C#源碼進(jìn)行二次修改!
APK加殼原理
PRE、dex文件結(jié)構(gòu)知識(shí)和加殼原理
先看下dex文件的基本結(jié)構(gòu)
對(duì)于加殼主要關(guān)注3個(gè)關(guān)鍵字:
1)checksum
文件校驗(yàn)碼,使用alder32算法,校驗(yàn)文件除了maigc和checksum外余下的所有文件區(qū)域,用于檢查文件錯(cuò)誤。
2)signature
使用SHA-1算法hash除了magic ,checksum和signature外余下的所有文件區(qū)域,用于唯一識(shí)別本文件 。
3)file_size
dex文件的大小。
為什么說只需要關(guān)注這三個(gè)字段呢?
因?yàn)槲覀冃枰獙⒁粋(gè)文件(加密之后的源Apk)寫入到Dex中,那么我們肯定需要修改文件校驗(yàn)碼(checksum).因?yàn)樗菣z查文件是否有錯(cuò)誤。那么signature也是一樣,也是唯一識(shí)別文件的算法。還有就是需要修改dex文件的大小。
不過這里還需要一個(gè)操作,就是標(biāo)注一下我們加密的Apk的大小,因?yàn)槲覀冊(cè)诿摎さ臅r(shí)候,需要知道Apk的大小,才能正確的得到Apk。那么這個(gè)值放到哪呢?這個(gè)值直接放到文件的末尾就可以了。
所以總結(jié)一下我們需要做:修改Dex的三個(gè)文件頭,將源Apk的大小追加到殼dex的末尾就可以了。
我們修改之后得到新的dex文件樣式如下:
下面是代碼和項(xiàng)目流程,有興趣的同學(xué)可以以此為需求自己研究coding:
1、制作原始項(xiàng)目的apk,這里稱作original.apk;
2、制作一個(gè)殼項(xiàng)目(具體功能見ps),編譯通過后得到它的classes.dex文件,這里稱作shell.dex,而殼項(xiàng)目的apk稱作shell.apk(需要簽名);
3、制作一個(gè)加殼工具(java工程就可以),按照以下流程工作:
1)讀取original.apk的byte流,并加密;
2)讀取shell.dex的byte流;
3)new一個(gè)新的byte數(shù)組,長度為1)和2)的長度之和+4,因?yàn)槲覀円趕hell.dex中保存original.apk的長度;
4)在new byte數(shù)組中寫入2),寫入1),寫入1)的長度;
5)根據(jù)dex文件的結(jié)構(gòu),修改checksum文件頭、Signature文件頭和file_size文件頭,最終生成一個(gè)新的classes.dex;
4、替換掉2中的shell.apk中的classes.dex,并使用工具重新簽名;
5、生成的新簽名apk就是我們加殼過的apk了。
PS、殼項(xiàng)目的功能
1)獲取shell.dex中的original.apk,解密后在指定的內(nèi)部文件夾中重新生成original.apk
2)hook ActivityThread中的currentActivityThread,拿到主線程實(shí)例;
3)換掉1)中的mClassLoader,使其可以加載外部的apk(參考插件化原理),這里要的是加載就是1)中的original.apk;
(上面三個(gè)流程在shell.apk的application中的attachBaseContext方法中執(zhí)行)
4)動(dòng)態(tài)加載original.apk中的Application,替換掉系統(tǒng)組件中所有的application信息;
PS、以上殼項(xiàng)目是在java層實(shí)現(xiàn)的,更深入的可以考慮在jni層來實(shí)現(xiàn)。該方法同樣適用于jar包加殼~
動(dòng)態(tài)加載技術(shù)真的是很重要,我們已經(jīng)看過很多安卓核心技術(shù)的本質(zhì)都是基于動(dòng)態(tài)加載的。而這些創(chuàng)意的源泉,都來自熟讀安卓源碼,了解系統(tǒng)核心組件的實(shí)現(xiàn)流程。
熱門評(píng)論
最新評(píng)論