IDA静态分析 jni动态注册方法
通过我们 在java中jni动态注册接口方法时 得知动态注册的过程 是在 JNI_OnLoad 方法里 进行的
getEnv ->FindClass ->RegisterNatives
RegisterNatives 方法里注册的
(*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*,jint)
JNINativeMethod 指向的数组
nativeMethods 数组里 就是 要动态注册的 对应的方法
在JNINativeMethod 类型的 nativeMethods 数组里的
JNINativeMethod nativeMethods[]={
//java方法 方法签名 C函数
{"add","(FF)I",(void*)add},
{"sub","(FF)I",(void*)sub},
{"mul","(FF)D",(void*)mul},
{"div","(FF)D",(void*)_div}
};
有了上面的 了解后 就好办了
那么我们就到 JNI_OnLoad 方法里去找
导入jni.h 头文件
LDR R3, //把类似这样的基址+偏移右键修改成 jni方法
如
LDR R3,
如果知道了 动态注册的流程 那么就很轻松的就会把下面的 依次修改成
LDR R3,
LDR.W R4,
我们知道动态注册 是在 RegisterNatives 里进行的
而这个方法的第3个参数 就是我们要追踪的 nativeMethods
汇编里 即是 寄存器R2 作为第三个参数
即找到这
LDR R2, ; nativeMethods
双击nativeMethods
直接跳到 地址指向的数据处了
.data:00004004 EXPORT nativeMethods
.data:00004004 nativeMethods DCD aAdd ; DATA XREF: LOAD:000002A8↑o
.data:00004004 ; .text:000012C4↑o ...
.data:00004004 ; "add"
.data:00004008 DCD aFfI ; "(FF)I"
.data:0000400C DCD _Z3addP7_JNIEnvP8_jobjectff+1 ; add(_JNIEnv *,_jobject *,float,float)
.data:00004010 DCD aSub ; "sub"
.data:00004014 DCD aFfI ; "(FF)I"
.data:00004018 DCD _Z3subP7_JNIEnvP8_jobjectff+1 ; sub(_JNIEnv *,_jobject *,float,float)
.data:0000401C DCD aMul ; "mul"
.data:00004020 DCD aFfD ; "(FF)D"
.data:00004024 DCD _Z3mulP7_JNIEnvP8_jobjectff+1 ; mul(_JNIEnv *,_jobject *,float,float)
.data:00004028 DCD aDiv ; "div"
.data:0000402C DCD aFfD ; "(FF)D"
.data:00004030 DCD _Z4_divP7_JNIEnvP8_jobjectff+1 ; _div(_JNIEnv *,_jobject *,float,float)
.data:00004030 ; .data ends
这样就ok了
java层 方法名方法签名c/c++ 中对应的方法
学习使我快乐 感谢分享 这个可以,可以过签名验证,过反调试也可以在JNI_OnLoad里面修改 大侠,有空请帮忙看下我的帖子:https://www.52pojie.cn/thread-1182113-1-1.html 大佬,方法找到了,方法体该怎么找啊
页:
[1]