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