Java调用so
静态分析方法
IDA打开libmyjni.so:
Jump to segment (Ctrl+S),查找.init_array
,没有。
可以再在Exports导出函数里找JNI_Onload
:
找到g_env
这种,按下Y(或右键Set Item Type
),定义成JNIEnv * g_env
。会自动解析出来RegisterNatives
,点击右键:Force call type
,回把参数解析出来:
可以看到(const JNINativeMethod *)off_5004
函数:
Hook方式
思路:RegisterNatives函数在libart.so里定义,首先在的libart.so找到RegisterNatives的模块,然后从模块里找到符号symbols,从而找到符号地址。
在http://aospxref.com/搜索art项目下,RegisterNatives的定义,找到jni_internal.cc:
http://aospxref.com/android-11.0.0_r21/xref/art/runtime/jni/jni_internal.cc#2298 可以看到RegisterNatives函数的调用参数。
现在想获取class的名称,Frida已经帮我们定义好了。可以通过项目: https://github.com/frida/frida-java-bridge 搜索getClassName
找到
https://github.com/frida/frida-java-bridge/blob/fed9e61bfa2fbe5289e834200933b724bf8c7ff6/lib/env.js
这里需要一个Env,可以通过https://frida.re/docs/javascript-api/ 找到Java.vm
,可以拿到Env
。
另外,这个还要把方法打印出来,用到了hexdump
函数,它可以从内存中把方法打印出来。
函数类型JNINativeMethod
的定义,有3个类型:
JS Hook代码:
按键G(Jump to address)到0x11F9
,F5反编译,就可以看到n2函数,注释一下,其实是:saveSN
函数。
n2参数a1的类型是JNIEnv * 类型(快捷键Y),改为:
参数a3,改名(快捷键N):
Frida可以通过stringFromJni或getStringChars 获取字符串参数。
Hook android_dlopen_ext
Android实现动态库的加载,一般需要调用android_dlopen_ext
函数。函数源码:
Frida JS代码:
Frida写文件
Frida读写文件用到了File类。
用frida调用c函数
模拟调用C函数要用到NativeFunction函数。
C函数定义见:https://www.cplusplus.com/reference/cstdio/ Frida申请空间用Memory.alloc,申请string空间用Memory.allocUtf8String
。