學習材料來自四哥csdn
Android中的Apk的加固(加殼)原理解析和實現
首先必然是依葫蘆畫瓢敲代(fu)碼(zhi)
首先要理解幾個概念
- 1.什么是殼
- 2.怎么加殼
- 3.怎么脫殼
1.什么是殼
殼的本質實際上仍然是一個apk,不過這個apk的用途
1.解密 加殼過程中的 被加密的數據;
2.動態加載資源,使源程序能正常調起。
解密不用怎么說,解密和加密算法對應即可。
主要是動態加載資源,
http://blog.csdn.net/jiangwei0910410003/article/details/48104455
如何得到系統加載Apk的類加載器,然后我們怎么將加載進來的Apk運行起來等問題都在這篇文章中說到。
2.怎么加殼
大白話:將源Apk和殼Apk進行合并成新的.dex,然后替換原.dex
這里的重點應當是理解.dex的文件格式,重中之重又是去理解.dex文件的頭部信息
checkSum是干什么的?
signature是干什么的?
file_size是干什么的?
將源apk,殼apk準備好之后,以二進制形式讀出,計算得出新的apk大小,并按照.dex文件格式依次放好,最后計算并修改三個頭部信息,此時殼已經加好。
3.怎么脫殼
按照1的說法,其實殼并沒脫掉,而是動態的找到了源apk真正的入口application
收尾工作
因為加殼之后,會替換原.dex,所以簽名遭到破壞,一定要重新簽名。
jarsigner -verbose -keystore 簽名文件 -storepass 密碼 -keypass alias的密碼 -sigfile CERT -digestalg SHA1 -sigalg MD5withRSA 簽名后的文件 簽名前的apk alias名稱
eg:
jarsigner -verbose -keystore testKey.jks -storepass 123456 -keypass 123456 -sigfile CERT -digestalg SHA1 -sigalg MD5withRSA -signedjar srcApk_signed.apk srcApk_src.apk jiangwei
也可以用apksigner
apksigner sign --ks testKey.jks --ks-key-alias testkey --ks-pass pass:123456 --key-pass pass:123456 --out output_sign.apk source.apk
最后筆記總結
概念性東西要理解,主要是動態加載資源那里的和.dex文件格式
按照四哥的步驟來操作試一下。
我這里出了bug,加固后的apk,運行報
代碼已上傳github
https://github.com/lamster2018/DexShell