学习材料来自四哥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