实现脱早期AJM的APP壳的流程
2020-04-02 15:48:40 Author: bbs.pediy.com(查看原文) 阅读量:364 收藏

[原创]实现脱早期AJM的APP壳的流程

22小时前 256

1. 使用工具查看APP是否已加固

经过工具查看此APP是经过 AJM 进行了加固处理

 

2. 使用jadx查看app结构

2.1查看APP使用的Application类

2.2 分析SuperApplication

 在这可以看到attachBaseContext和onCreate函数分别调用了NativeApplication的load和run函数.根据Android Application的生命周期来说.attachBaseContext比onCreate早.

 

2.3分析NativeApplication

从这边可以看到load和run均为native函数,并且该类中还有一个runAll的native函数.同时,可以看到里面静态加载了exec.so与execmain.so

 


3. 使用IDA静态分析libexec.so

3.1在导出表中查看JNI_OnLoad/load/run等信息

 暂无发现

 

3.2在String表中浏览一下是否有重要信息

在string表中发现了有个classes.dex的可疑字符串


双击点击进入并查看交叉引用


来到引用的位置并且F5切换查看伪C代码


3.3分析引用了classes.dex字符串所在函数的伪C代码

在之前sub_1A8E8函数也有传入”assets/ijiami.dat”,而后再传入了”classes.dex”字符串信息.

那么,目前有理由怀疑此处为加载解密后的dex数据.

 

4. 使用IDA动态调试dump dex文件

4.1启动android_server


4.2端口转发


4.3启动调试程序


4.4开始附加调试进程



4.5进程附加完毕后勾选三项

 

4.6使用DDMS查看调试进程


4.7使用jdb开启调试

 

4.8 在IDA中F9开始加载so,并定位关键函数位置后开始正式调试

加载libexec.so后,可使用基址+偏移的方式定位到引用classes.dex字符串的函数位置

当前libexec.so的基址为0xB38DD000


偏移地址为:0xEDBC


计算绝对地址: 0xB38DD000 + 0xEDBC = 0xB38EBDBC

此时注意,在消息输出窗口看到libexec.so加载后再使用G键进行跳转,否则过早跳转过去后P键发现汇编指令与静态分析时对不上.


过早跳转后P键转换的汇编指令


Ok,该次调试可以结束了,那么重新开启调试.从走一遍IDA动态调试的流程,待发现第一次加载了libexec.so之后

可以在该模块的deinit函数中先下断一下.然后一直F9,直到运行到此函数为止.


Ok,目前已经运行到此处了,那么开始重新计算绝对地址.



绝对地址计算:0xB38DD000 + 0xEDBC = 0xB38EBDBC

G键跳转到此地址位置


这次可以清晰看到该函数的逻辑了,那么可以在这下断并F9运行到此处


运行到此地址后开始F8,同时Hex View窗口可同步R0寄存器


经过一阵子的F8之后,到了0xB38EBE3E这地址可以看到R0寄存器此时的数据开头为dex.035.这就是此次需要dump的dex数据了.

小框中的4个字节为dex数据的大小.由于Android的文件采用的是小端编码,所以需要倒过来读,此时的数据大小为:0x0FAEB4.而开始

位置为R0寄存器当前指向的位置0xB36C0000

 

在IDA中使用脚本dump dex


5. 使用JADX工具验证从IDA中dump的dex文件

毫无疑问,此次脱壳圆满成功.


2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!


文章来源: https://bbs.pediy.com/thread-258559.htm
如有侵权请联系:admin#unsafe.sh