经过工具查看此APP是经过 AJM 进行了加固处理
在这可以看到attachBaseContext和onCreate函数分别调用了NativeApplication的load和run函数.根据Android Application的生命周期来说.attachBaseContext比onCreate早.
从这边可以看到load和run均为native函数,并且该类中还有一个runAll的native函数.同时,可以看到里面静态加载了exec.so与execmain.so
暂无发现
在string表中发现了有个classes.dex的可疑字符串
双击点击进入并查看交叉引用
来到引用的位置并且F5切换查看伪C代码
在之前sub_1A8E8函数也有传入”assets/ijiami.dat”,而后再传入了”classes.dex”字符串信息.
那么,目前有理由怀疑此处为加载解密后的dex数据.
加载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
毫无疑问,此次脱壳圆满成功.