【移动安全基础篇】——21、Android脱壳思路

1. Apk dex  加固
目前存在对 apk 中的 class.dex 进行加密的技术,即加壳。通过对 dex 文件的加壳,可以达到减小文件大小,隐藏真实代码的效果。
2.  运行时解密
与 windows 上的 shell 一样,Android 加壳程序在程序运行时,先到达壳的入口点,运行解壳代码,然后再到达程序入口点,运行代码。而要脱壳则要在程序解码完毕后,到达程序真实入口点中间某个位置,把原始的 dex 代码给 dump 出来,还原到 apk 文件中。
3.  一个简单 demo
入口点改变:
壳入口:

程序入口:

壳代码中 Java 层转 jni 层

【移动安全基础篇】——21、Android脱壳思路_第1张图片

jni 层中解密 dex 数据,还原并替换为原始 Application 数据,内存中获取到原始数据后,即可直接放到原始的 apk 文件中。所关注的加密文件是 cls.jar 和 juice.data

【移动安全基础篇】——21、Android脱壳思路_第2张图片

JNI_OnLoad 函数(注册 native 函数)还原:

【移动安全基础篇】——21、Android脱壳思路_第3张图片

【移动安全基础篇】——21、Android脱壳思路_第4张图片

parse_dex 函数完成对 dex 文件的解密和还原

【移动安全基础篇】——21、Android脱壳思路_第5张图片

对 parse_dex 进行调试

【移动安全基础篇】——21、Android脱壳思路_第6张图片

【移动安全基础篇】——21、Android脱壳思路_第7张图片

【移动安全基础篇】——21、Android脱壳思路_第8张图片

【移动安全基础篇】——21、Android脱壳思路_第9张图片

【移动安全基础篇】——21、Android脱壳思路_第10张图片

【移动安全基础篇】——21、Android脱壳思路_第11张图片

程序在断点处中断

【移动安全基础篇】——21、Android脱壳思路_第12张图片

动态调试得到原始 dex 文件被解密出来的存放地址

【移动安全基础篇】——21、Android脱壳思路_第13张图片

cls.jar 文件在解密后是原始的 class.dex 文件
Dump 脚本:IDC

【移动安全基础篇】——21、Android脱壳思路_第14张图片

dex 文件在内存中的大小为

【移动安全基础篇】——21、Android脱壳思路_第15张图片

但是 dump 出来的 dex 文件打开后没有函数的真实代码

【移动安全基础篇】——21、Android脱壳思路_第16张图片

原理是程序执行之后再会对函数的真实代码进行还原openDexFile:将内存中的 dex 文件转换为 DexOrJar 结构体Dex 文件的新地址:

【移动安全基础篇】——21、Android脱壳思路_第17张图片

然后重新 dump 出文件

【移动安全基础篇】——21、Android脱壳思路_第18张图片

不过新 dump 出来的文件存在解析错误

【移动安全基础篇】——21、Android脱壳思路_第19张图片

错误原因是 dump 出的 dex 文件不包括完整数据,需要将遗漏的数据补充进来

【移动安全基础篇】——21、Android脱壳思路_第20张图片

然后计算出完整文件的大小重新 dump

【移动安全基础篇】——21、Android脱壳思路_第21张图片

最后看到 dump 出的 dex 文件能够正常打开,脱壳步骤已经完成了重新分析下对内存数据进行修正的函数

【移动安全基础篇】——21、Android脱壳思路_第22张图片

该循环中对 dex 数据进行修正 将 dump  出来的数据反编译为 smali  代码,然后将该 smali  代码替换掉程序中的原有代该码,然后删掉壳的入口点,重新编译之后该 app  成功脱壳。

 

你可能感兴趣的:(【移动安全】,———移动安全基础篇)