2.apk加壳和脱壳概念入门(笔记)

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


2.apk加壳和脱壳概念入门(笔记)_第1张图片
image.png

代码已上传github
https://github.com/lamster2018/DexShell

你可能感兴趣的:(2.apk加壳和脱壳概念入门(笔记))