解决 Frida Hook 动态加载 Dex 时,遇到的崩溃问题

遇到动态加载的 Dex 时,需要找到它的 classloader 然后替换 Frida Java.classFactory.loader 的值,之后便可以正常使用 Java.use 获取动态加载的 Dex 中的类,并进行 Hook 操作。
但是一旦 Hook 的函数被触发时,Frida 却崩溃退出了。
抛出如下信息:

Process crashed: Trace/BPT trap

***
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/walleye/walleye:8.1.0/OPM4.171019.021.Q1/4820346:user/release-keys'
Revision: 'MP1'
ABI: 'arm64'
pid: 12372, tid: 12428, name: pool-3-thread-1  >>> com.facebook.samples.AdUnitsSample <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0x77d10a39b4'
    x0   0000000000000000  x1   000000000000308c  x2   0000000000000006  x3   00000077ce0d5c90
    x4   0000000000000000  x5   0000000000000000  x6   0000000000000000  x7   7f7f7f7f7f7fff7f
    x8   00000000000000f0  x9   2ea26dac164c534d  x10  2ea26dac164c534d  x11  0000000000000001
    x12  00000077ce0d59d8  x13  000000786cfcbff0  x14  0000000000000100  x15  00000077ce0d5888
    x16  0000000000000000  x17  000000786c82952c  x18  00000077ce802750  x19  00000077ce0d5c90
    x20  0000000000003054  x21  00000077ce0d5c90  x22  0000000000000001  x23  00000077ce0d59d8
    x24  00000000000030ba  x25  0000000000000062  x26  00000077ce0dc588  x27  0000000000000016
    x28  0000000000000001  x29  00000077ce0d58e0  x30  000000786d0320a0
    sp   00000077ce0d58d0  pc   000000786d0a6e00  pstate 0000000000000000

backtrace:
    #00 pc 000000000009de00  /system/bin/linker64 (__dl_syscall+32)
    #01 pc 000000000002909c  /system/bin/linker64 (__dl__ZL13resend_signalP7siginfob+96)
    #02 pc 0000000000028f4c  /system/bin/linker64 (__dl__ZL24debuggerd_signal_handleriP7siginfoPv+1180)
    #03 pc 0000000000235134  /data/local/tmp/re.frida.server/frida-agent-64.so
***

这是为什么呢?好不容易找到了 classloader , 也能正常 Hook 了结果报了这么一个莫名其妙的错?难道之前的工作要功亏一篑? 不甘心啊。

静下心来,仔细看它的报错信息 invalid jobject,突然哪里来的一个闪念:这可能是环境问题!

于是在给 Java.classFactory.loader 赋值之前先保存其原始值, Java.use & Hook 之后,再改回原来的 classloader 。这样 Hook 的效果达到了,也不崩溃了!(哭

网上大多修改 Java.classFactory.loader 的教程里没有改回原始值,好像他们都没遇到崩溃的事情。赶情儿都是运气?

发表评论