【安卓逆向】360壳过反调试+dump dex文件以及简单修复

交流学习Q群:984791973

mmap函数下段,然后F9运行断下,然后F8往下,一直运行到这里:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
F7进来,在R2寄存器这里打一个断点:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
F9运行到这里,然后F7进来;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
F8往下走,这里有比较指令:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
这个函数的返回值在R0里面存储,(可以直接把光标放在cmp那条指令然后F4跳过去 )
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
把R0置零:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
置零之后呢,F9:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
再一次F8:继续在mmap函数末尾断下,然后继续F8:来到这里:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
紧接着F9,继续来到mmap
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
然后继续F8:发现还是libc.so,继续F9,然后F8,知道来到libjiagu.so:

(注意,这是第二处反调试的点,虽然后逻辑代码和第一处的一样,但是是不同的区段,所以还需要进去看看是不是上一次哪两个下断的函数,不要直接f9,以为和第一次一样,不一样!)

【安卓逆向】360壳过反调试+dump dex文件以及简单修复
继续F8往下,来到这里:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
然后F9在这里断下:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
然后F7进去,然后F9在这个 LR 处断下,
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
继续修改上面函数的返回值R0寄存器的值;从而过掉反调试
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
直接置零即可;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
修改后,继续F9:在mmap函数处断下:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
同样的,继续往下走,来到libjiagu.so,来时和上面一样,来到这里比价的地方:这是第三次修改R0 和cmp处比较:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
继续F9,在mmap函数处断下,然后在函数头位置下一个断点;
然后ctrl+S,可以看一下各个区段:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
到这里,已经三次反调试的点已经过去了,现在要做的,就是找到栈去存放dex文件的地方;

在mmap函数的函数头和函数尾部分别下断点,尾部断下后,直接F9运行,在头部断下,然后F8单步,一直单步到函数尾部,时刻观察栈窗口;

在栈区发现:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
此时同步R0寄存器,一直单步,知道十六进制汇编窗口出现dex文件;也就是执行完上面这个函数;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
观察dex的区域:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
我们ctrl+s找到该区域跳过来看一下:在zero这个区域里面;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
解密后的数据就放在这个区域,也就是R4寄存器存放的值;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
这个dex文件的大小就是:19837C
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
也就是此时R4和R5寄存器的值;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
接下来,我们用脚本来dump一下;

修改起始地址和大小

【安卓逆向】360壳过反调试+dump dex文件以及简单修复
然后点击run运行即可;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
打开压缩包,然后丢进去替换;
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
把安装包使用androidkiller进行反编译,在xml里面修改这两个属性:
【安卓逆向】360壳过反调试+dump dex文件以及简单修复
然后保存,回编译即可;