怕上火喝王老吉 发表于 2020-4-16 19:25

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++ 中对应的方法

第七只海东青 发表于 2020-4-17 04:02

学习使我快乐

茕茕白兔. 发表于 2020-4-17 07:47

感谢分享

夜步城 发表于 2020-4-17 10:51

这个可以,可以过签名验证,过反调试也可以在JNI_OnLoad里面修改

羽刃 发表于 2020-5-19 14:36

大侠,有空请帮忙看下我的帖子:https://www.52pojie.cn/thread-1182113-1-1.html

18368348237 发表于 2022-6-8 12:10

大佬,方法找到了,方法体该怎么找啊
页: [1]
查看完整版本: IDA静态分析 jni动态注册方法