frida反调试的解决方案
- 在lib/armeabi-v7a/目录里
grep -ril "frida"
和grep -ril "frida-server"
找到共同这两个字符串的so。
该so就是我们需要进行反反frida调试的so。
- 找到检测的点
在IDA中通过快捷键Shift+F12
打开String windos来找到字符串frida的位置。
这里只是在arm反汇编当中找到字符串,可是我们看反汇编其实会比较麻烦且费时,优先选择F5
来把反汇编代码转换成C伪代码。
找到函数的导出名
反汇编的效果如下(JNI函数的第一个参数一般是JNIEnv*类型,当然碰到JNI_Onload及更早执行的.init和.init_array除外)
按Y改变变量的参数类型,按N进行变量的更名。
通过frida脚本想hook access函数
发现在access函数输出frida字符串之前,frida就直接崩掉了,说明,检测frida的进程有比access函数更早的地方。
来看看这个地方。
如果熟悉端口检测的话可以看到5D8A
和69A2
和69A3
这三个16进制数分别对应10进制数,23946
、27042
、27043
。
这三个端口号第一个是android-server默认占用的端口,27042是frida默认占用的端口.
端口检测这个很好解决,要么修改检测的端口号,要么修改frida的默认占用的端口
这样设置即可。也可以头铁,通过hook这里的strstr函数,把检测的端口号进行hook修改。我们这里头铁看看吧(笑)。
哈哈,成功了铁头!
但是还是崩。。。还输出了这段带有frida的字符串。嗯看来还有地方比对frida的字符串。
再改改strstr的第二个参数,假如包含frida字样我们就改掉他,(注意需要改变一下返回值)
好嘞反调试就这么过了
抓包分析
抓包发现只有这三个参数是变化的,那我们的破解参数主要为st
、sv
、sign
st: 盲猜时间戳
sv: 暂定
sign: 32位,神似md5
静态分析
首先搜索一下sign=
14个结果,而且有我们刚才抓包看到的其他参数,看来我们要找的地方就在这附近。
Objection hook com.jingdong.jdsdk.network.toolbox.HttpSetting.getMd5这个函数看看有没有经过这个。
有经过
然后可以看到实际上sign是在这函数经过之前就已经生成了。
看看调用栈。经静态分析,这些之前都是些调用发送包的函数。
那只有一种可能sign的生成函数在getMd5这个函数内部当中被调用。那么极有可能是getUrl()里面。
既然有getUrl,那肯定有setUrl我们通过Objection来hook看看能不能看到有价值的信息。
跟随调用栈来到这里
跟进去
好家伙又接着hook setSignature看看调用栈。
可以看到参数传进来时已经有sign和其他两个我们需要的参数,那跟随调用栈往上跟。
掉进signature里发现
发现这是一个接口类。通过frida脚本找到其实现类。
1 | Java.enumerateLoadedClasses({ |
服了没找到。在看看刚才的地方
一路追,看到这个。。。看来也不是他,佛了,换换别的反编译器GDA看看。
这种情况下可以试试看在so当中碰碰运气。
看来我们应该找到了。。。
HOOK看看通过不。
有经过,且结果跟我们刚才分析的相同,所以这里就是我们想要找到的sign的位置。com.jingdong.common.utils.BitmapkitUtils.getSignFromJni