在做某app的so层逆向时,发现ida附加jdb,在linker加载so的时候崩了。发现了java层的Debug.isDebuggerConnected()。
虽然不是因为这个原因导致的ida动态调试失败,但是在网上查阅怎么绕过java层反调试的时候,发现全网都是抄一份百度加固的Debug.isDebuggerConnected(),说是改smali然后回编译。然而根本没用,现在的app都有签名校验,改完回编译app根本打不开。所以在这里记录一下绕过方法。
其实很简单,直接hook系统函数isDebuggerConnected(),修改返回值为false就可以了。我用的是frida做hook。
frida代码:
自己写了一个比较简单的Android代码测试,如果检测到调试器就会打印检测到调试器,否则就会打印hello C++。这里我为了练习,调用native层的方法来给res赋值。
断点打在判断debug之前,然后debug模式启动,打开frida。
Hook截图: