2019年2月360加固逆向分析

vmp

vmp调用api的时,会跳出vm,所以可以不关注vm逻辑运算,直接追踪vm调用用了哪些api,从而分析壳,从jni_onload中一步步跟进在_Z10__fun_a_18Pcj中文件偏移0x0000FF00和0x00010060 处是vm函数调用,在此下断。

软中断

由于api有可能会被下断,所以可以采取软中断方式实现系统调用,arm下是svc,等ida解析完成so,搜索这条指令,会发现有open、mprotect还有个syscall。
2019年2月360加固逆向分析

反调试

tracerid

0x6850 打开/proc/self/status文件,获取tracerid,修改读取的内容,在读到tracerid时修改为0

时间检测

0x6C9C 时间差大于3,则退出
2019年2月360加固逆向分析

rtld_db_dlactivity

0x00024F4 rtld_db_dlactivity这个函数默认情况下为空函数,这里的值应该为0,而当有调试器时,这里会被改为断点指令,所以可以被用来做反调试。在函数sub_24F4中,libjiagu.so查找rtld_db_dlactivity函数的地址的,获取到rtld_db_dlactivity的地址,将其修改为nop指令0x46C0。

so动态加载

so从内存中加载,肯定需要mprotect赋予执行权限,之前已经分析过svc实现mprotect,所以在mprotect时找到代码段,从内存中dump出以下二进制文件如下。

2019年2月360加固逆向分析
对比正常的elf头
2019年2月360加固逆向分析
发现出现很多0x4f,尝试与0x4f异或,可以直接解出elf头,用010editor 解析出错,说明dump的尚不完整,于是在沿着内存dump下去,直至能够成功解析。

ida打开完整的so,没有报错。
2019年2月360加固逆向分析
jni动态注册,都在第二个so中,后面的动态加载dex文件基本上没什么区别。