CISCN2018—爱加密过反调试的尝试
前言
准备
手机root,打开调试模式,尽量尽量不要国产机器(产生一些奇奇怪怪的问题,我这里使用的是nexus 5, 6.0.1系统)
几条命令
1 | adb push android_server /sdcard/ |
之后看到了参考文章中X加密那一篇文章,发现基本是同一款,就直接使用了文章中提供的样本
init initarray
init 是一个函数
initarray是一个数组,存放要运行的函数指针,进行反调试操作的有0x2c 0x2e对应的
其运行实际都要早于JNI_OnLoad,这个壳子就在这里做了一些操作
- 调用gettimeofday进行时间反调试
- status反调试,fopen fgets
- signal 注册 1 2 3
- hook _ZN3art3Dbg8GoActtivityEv
- 可能还有其它的反调试,暂未发现
1 参考别人文章,对于r0置0即可
2 我的办法是先在fopen下断,看到打开了文件之后就在fgets段尾下断点,置r0为0,这样就不会进入判断了
我大概跟了一下status这个反调试,大概流程是先获取时间,之后getpid,用sprintf构造字符串/proc/xxxx/status,打开,然后fgets获取文件内容,使用strtok分解字符,strncmp匹配TracerPid,atoi转整数验证
3 signal反调试那个我按照参考文章中处理的,r1为要绑定的函数,置零即可,但是感觉好像
4 前边这算是比较常规,一开始直接下断点就发现了,后来在JNI_Onload里边有个函数反调试,死活找不到,我甚至把libexec.so导入表里面的函数大部分都下了个断,还是没有找到为什么挂了,后来提前在dlopen中下了个断,发现会dlopen libart.so 然后还会获取_ZN3art3Dbg8GoActiveEv的地址,传进某个函数,感觉很奇怪,上网搜了一下,发现这个函数在附加后会自动调用,还搜到了一个讲hook这个函数来反调试的文章,然后尝试将得到的地址换成了exit
我将其改成了exit函数,可以看到hook的效果
后来继续跟下去发现ijm还hook了好多函数,这个hook函数参数大概如下
r0 soname
r1 funcname
r2 replace func
r3 global
这样init 和initarray中的反调试就算过完了
JNI_Onload进入之后
JNI_Onload可以在libart.so的LoadNativeLibrary下个断点直接进入
1 | .text:0024A782 ADD R1, PC ; "JNI_OnLoad" |
这个之后跟几步就到了JNI_Onload
提前吐槽几句,这个混淆是真的牛皮,根本就没法看,放几张流程图
下边这是字符串隐藏
1 | debug089:B3AA3694 81 54 STRB R1, [R0,R2] |
中间跟着各种跳,大跳小跳。
在这里发现了这几个反调试(或者说是检测)
- gettimeofday之后pthread_create 一开始跟了,有一大堆汇编,后来的就直接跳过了,跳过也没发生啥异常
- isDebuggerConnected 这个是JNI层调用的
- 再次打开status文件
- 时间反调试?
- dexname 检测 dexhunter
- maps 检测 ?修改dex?
1 我直接就跳过了
2 断在_ZN3art3JNI24CallStaticBooleanMethodVEP7_JNIEnvP7_jclassP10_jmethodIDSt9__va_list,修改返回值
3 上边提到了
4 记得timeofday第一个参数置零啊
5 我手机本身就不是dexhunter所以不用管
6 我没有去管,直接f9