學(xué)習(xí)材料來(lái)自四哥csdn
Android中的Apk的加固(加殼)原理解析和實(shí)現(xiàn)
首先必然是依葫蘆畫(huà)瓢敲代(fu)碼(zhi)
首先要理解幾個(gè)概念
- 1.什么是殼
- 2.怎么加殼
- 3.怎么脫殼
1.什么是殼
殼的本質(zhì)實(shí)際上仍然是一個(gè)apk,不過(guò)這個(gè)apk的用途
1.解密 加殼過(guò)程中的 被加密的數(shù)據(jù)神凑;
2.動(dòng)態(tài)加載資源净神,使源程序能正常調(diào)起。
解密不用怎么說(shuō)溉委,解密和加密算法對(duì)應(yīng)即可鹃唯。
主要是動(dòng)態(tài)加載資源,
http://blog.csdn.net/jiangwei0910410003/article/details/48104455
如何得到系統(tǒng)加載Apk的類(lèi)加載器瓣喊,然后我們?cè)趺磳⒓虞d進(jìn)來(lái)的Apk運(yùn)行起來(lái)等問(wèn)題都在這篇文章中說(shuō)到坡慌。
2.怎么加殼
大白話:將源Apk和殼Apk進(jìn)行合并成新的.dex,然后替換原.dex
這里的重點(diǎn)應(yīng)當(dāng)是理解.dex的文件格式藻三,重中之重又是去理解.dex文件的頭部信息
checkSum是干什么的洪橘?
signature是干什么的?
file_size是干什么的棵帽?
將源apk,殼apk準(zhǔn)備好之后熄求,以二進(jìn)制形式讀出,計(jì)算得出新的apk大小岖寞,并按照.dex文件格式依次放好抡四,最后計(jì)算并修改三個(gè)頭部信息,此時(shí)殼已經(jīng)加好仗谆。
3.怎么脫殼
按照1的說(shuō)法指巡,其實(shí)殼并沒(méi)脫掉,而是動(dòng)態(tài)的找到了源apk真正的入口application
收尾工作
因?yàn)榧託ぶ罅タ澹瑫?huì)替換原.dex藻雪,所以簽名遭到破壞,一定要重新簽名狸吞。
jarsigner -verbose -keystore 簽名文件 -storepass 密碼 -keypass alias的密碼 -sigfile CERT -digestalg SHA1 -sigalg MD5withRSA 簽名后的文件 簽名前的apk alias名稱(chēng)
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
最后筆記總結(jié)
概念性東西要理解勉耀,主要是動(dòng)態(tài)加載資源那里的和.dex文件格式
按照四哥的步驟來(lái)操作試一下指煎。
我這里出了bug,加固后的apk便斥,運(yùn)行報(bào)
代碼已上傳github
https://github.com/lamster2018/DexShell