frida获取so层动态注册函数 谢谢大佬的无私奉献https://github.com/lasting-yang/frida_hook_libart 一.js模板一 function hook_RegisterNatives...") >= 0 && symbol.name.indexOf("JNI") >= 0 && symbol.name.indexOf("RegisterNatives...Interceptor.attach(addrRegisterNatives, { onEnter: function (args) { console.log("[RegisterNatives...fnPtr_ptr).sub(find_module.base)); } } }); } } setImmediate(hook_RegisterNatives...jclassPK15JNINativeMethodi") { addrRegisterNatives = symbol.address; console.log("RegisterNatives
所以,显然,当包含registerNatives()方法的类被加载的时候,注册的方法就是该类所包含的除了registerNatives()方法以外的所有本地方法。详见参考博文3。 ...书中还总结了使用registerNatives()方法的三点好处: 通过registerNatives方法在类被加载的时候就主动将本地方法链接到调用方,比当方法被使用时再由虚拟机来定位和链接更方便有效;...举个例子,我们在Object中定义的本地方法registerNatives,那这个方法对应的本地方法名就叫Java_java_lang_Object_registerNatives,而在System类中定义的...registerNatives方法对应的本地方法名叫Java_java_lang_System_registerNatives等等。...这个问题涉及到registerNatives()的底层C++源码实现,有兴趣可以阅读参考博文3和5,建议先看5,再看3,因为5介绍了如何使用registerNatives方法注册本地方法,而3介绍了registerNatives
(JNIEnv* env) { LOGI("registerNatives begin"); jclass clazz; //找到java的类 clazz = env...(clazz, gMethods, NELEM(gMethods)) < 0) { LOGI("RegisterNatives error"); return JNI_FALSE...= NULL); registerNatives(env); return JNI_VERSION_1_4; } c++完整代码如下: #include #include...(JNIEnv* env) { LOGI("registerNatives begin"); jclass clazz; //找到java的类 clazz = env...= NULL); registerNatives(env); return JNI_VERSION_1_4; } 最后运行结果: ? ?
动态注册方法 RegisterNatives ( 核心重点 ) VII . 动态注册流程完整代码 I ....动态注册方法 RegisterNatives ( 核心重点 ) ---- 1 ....方法 jint RegisterNatives(jclass clazz, const JNINativeMethod* methods, jint nMethods)...{ return functions->RegisterNatives(this, clazz, methods, nMethods); } ... } 2 ....正式注册 env->RegisterNatives(jclazz, methods, sizeof(methods) / sizeof(JNINativeMethod)); VII .
在代码里面调用native方法,访问native(.cpp 或者 .c)的代码 具体实现 https://www.jianshu.com/p/3fdf924680af 动态注册 动态注册的原理 原理:利用 RegisterNatives...JNINativeMethod 数组记录 java 方法与 JNI 函数的对应关系; 实现 JNI_OnLoad 方法,在加载动态库后,执行动态注册; 调用 FindClass 方法,获取 java 对象; 调用 RegisterNatives...= env->FindClass(className); if (clazz == NULL) { return JNI_FALSE; } if (env->RegisterNatives...numMethods) < 0) { return JNI_FALSE; } return JNI_TRUE; } /*** * 注册native方法 */ static int registerNatives...registerNatives(env)) { //注册 return -1; } result = JNI_VERSION_1_4; return result
任何对象直接或间接的跟 Object 对象有关 ---- Object 类源码中的关键方法 public class Object { private static native void registerNatives...(); static { registerNatives(); } ··· } registerNatives():注册本地方法 它会注册除 registerNatives...在类被加载时就调用 registerNatives() 的用意是此时是程序主动将本地方法链接到调用方,当 java 程序需要调用本地方法时可直接调用,省去了jvm再去定位并链接的这一步,这样做的好处是:...更加方便且提高了执行效率 当本地方法在程序运行中有更新,调用 registerNatives() 可及时实现更新 Java程序需要调用一个本地应用提供的方法时,因为虚拟机只会检索本地动态库,因而虚拟机是无法定位到本地方法实现的...,这个时候就只能使用 registerNatives() 进行主动链接 通过 registerNatives() 在定义本地方法的实现时,可以不遵守 JNI 的命名规范 ··· public
二、动态注册 1、注册步骤 1)建立java函数和C函数映射的数组(签名必须一致) 2)通过RegisterNatives注册映射数组 3)重写JNI_OnLoad方法,动态库加载时就会调用JNI_OnLoad...{ { "GetstringFromJNI", "()Ljava/lang/String;", (void*)GetstringFromJNI },//绑定 }; //此函数通过调⽤RegisterNatives...clazz == NULL) { return JNI_FALSE; } //注册函数 参数:java类 所要注册的函数数组 注册函数的个数 if (env->RegisterNatives...= JNI_OK) { return -1; } //注册函数 registerNatives ->registerNativeMethods ->env->RegisterNatives...registerNatives(env)) { return -1; } //返回jni 的版本 return JNI_VERSION_1_6; } 以上就是关于
System.loadLibrary --->JNI Load init success"); jclass clazz = jniEnv->FindClass(class_name); //RegisterNatives...(jclass clazz, const JNINativeMethod* methods,jint nMethods) jniEnv->RegisterNatives(clazz, methods...动态注册核心RegisterNatives ① 重写JNI_OnLoad ② JavaVM 初始化获取JNIEnv,并获取到jclass ③ 注册函数 //RegisterNatives(jclass...clazz, const JNINativeMethod* methods,jint nMethods) jniEnv->RegisterNatives(clazz, methods,sizeof
在以上流程中,使用dlopen加载so之后,会继续调用JNI_Onload函数,通过系统提供的RegisterNatives函数完成一些列初始化,向虚拟机注册so库提供的JNI函数。...而接下来的RegisterNatives由于没有对应的unRegister,我们暂且先放一放,看看卸载的效果再来处理。...这时候就需要我们之前忽略的RegisterNatives登场了,这个函数可以用来手动注册JNI函数地址。...(env, clazz, gMethods, numMethods) < 0) { return JNI_FALSE; } return JNI_TRUE; } 使用RegisterNatives注册后...本篇小结 如果想要在运行时更新so,则新的so文件必须要实现JNI_Onload函数,并且在JNI_Onload中调用系统提供的RegisterNatives注册所有的JNI函数,不能使用自动查找JNI
Object 有啥方法 这个问题太广泛 一下我就回答不出来 这个 Object 指的是所有对象的父亲 package java.lang; 下的 object 类 文章目录 生命周周期 静态初始化的 registerNatives...静态初始化的 registerNatives() 实现动态绑定。...private static native void registerNatives(); static { registerNatives(); } finalize(...Java中的registerNatives代码的目的就是注册绑定本地方法,其方式是通过JNI_onload函数实现动态绑定。 日常使用相关 ?
2.1 动态注册使用方法 动态注册需要使用 RegisterNatives(...)...registerNatives(env)) { return -1; } result = JNI_VERSION_1_6; return result; }...// 动态注册 static int registerNatives(JNIEnv* env) { // 调用工具方法完成注册 if (!...2.2 动态注册原理分析 RegisterNatives 方式的本质是直接通过结构体指定映射关系,而不是等到调用 native 方法时搜索 JNI 函数指针,因此动态注册的 native 方法调用效率更高...注册 3、提前注册 动态注册 在加载 so 库后,调用该 native 方法前,通过静态注册的 native 函数触发 RegisterNatives 注册。
* 例如,对于java.lang.Object.registerNatives, * 对应的C函数命名为Java_java_lang_Object_registerNatives。...* * 通过使用registerNatives(或者更确切地说,JNI函数RegisterNatives),可以命名任何你想要你的C函数。...*/ private static native void registerNatives(); /** * final方法,用于获得运行时的类型。...*/ protected void finalize() throws Throwable { } static { registerNatives();
native_stringFromJNI }, { "sum", "(II)I", (void *) native_sum } }; static int registerNatives...(JNIEnv *env) { LOGI("registerNatives begin"); jclass clazz; //找到java的类 clazz = env->...if (clazz == NULL) { LOGI("clazz is null"); return JNI_FALSE; } if (env->RegisterNatives...(clazz, gMethods, NELEM(gMethods)) < 0) { LOGI("RegisterNatives error"); return JNI_FALSE...= NULL); registerNatives(env); return JNI_VERSION_1_4; } 在java中调用 package com.aruba.ndkapplication
JVM 查找 native 方法 JVM 查找 native 方法有两种方式: 按照 JNI 规范的命名规则 调用 JNI 提供的 RegisterNatives 函数,将本地函数注册到 JVM 中。...是不是感到特别的意外,jni还能够利用RegisterNatives 函数查找native方法,其实我也才刚刚知道有这方法,因为要根据包名类名方法名的规范来写是很傻逼的,哈哈,有的人或许觉得这样很直观。...第一个参数:JNIEnv* 是定义任意 native 函数的第一个参数(包括调用 JNI 的 RegisterNatives 函数注册的函数),指向 JVM 函数表的指针,函数表中的每一个入口指向一个...是不是感觉一个方法的名字太长非常的蛋疼,然后我们呢直接使用,RegisterNatives来自己命名调用native方法,这样是不是感觉好多了。...demo 传送梦:RegisterNatives.rar JNI数据类型及常用方法(JNI安全手册) 基本类型和本地等效类型表: ? 引用类型: ?
下面是hook Google play Market的例子: frida -U --no-pause -f com.android.vending -l hook_RegisterNatives.js...[Google Pixel XL::com.android.vending]-> [RegisterNatives] method_count: 0x6 [RegisterNatives] java_class...fnPtr: 0xd454f349 module_name: libcronet.76.0.3809.21.so module_base: 0xd441f000 offset: 0x130349 [RegisterNatives...] method_count: 0x3 [RegisterNatives] java_class: org.chromium.base.EarlyTraceEvent name: nativeRecordEarlyEvent...] method_count: 0x4 [RegisterNatives] java_class: org.chromium.base.FieldTrialList name: nativeFindFullName
而接下来的RegisterNatives由于没有对应的unRegister,我们暂且先放一放,看看卸载的效果再来处理。...这时候就需要我们之前忽略的RegisterNatives登场了,这个函数可以用来手动注册JNI函数地址。...让我们重复与第一节文字相似但含义不同的这段话: 在以上流程中,so库在使用dlopen加载后,还需要调用JNI_Onload函数,通过系统提供的RegisterNatives函数完成一些列初始化,向虚拟机注册新的...[gm2rXUV.png] 使用RegisterNatives注册后,即使so的地址发生变化,也能够更新虚拟机中记录的函数地址。...[Ir8RGSx.png] 本篇小结 如果想要在运行时更新so,则新的so文件必须要实现JNI_Onload函数,并且在JNI_Onload中调用系统提供的RegisterNatives注册所有的JNI
Thread类,看一下源码,你会发现其实Thread也是实现了Runnable接口 public class Thread implements Runnable { /* Make sure registerNatives...is the first thing does. */ private static native void registerNatives(); static {...registerNatives(); } 区别就是执行顺序: 继承Thread类的顺序是: Thread.start()→Thread.run() 实现Runable接口顺序是
Thread,而是实现Runnable接口,这是因为Thread本身就是一个Runnable的实现: class Thread implements Runnable { /* Make sure registerNatives...is the first thing does. */ private static native void registerNatives(); static {...registerNatives(); } ...
这边也可以直接使用现成的轮子hook_RegisterNatives来打印动态注册的具体地址,github上一堆。不过这边没必要花这么大功夫搞这个,我其实更关心字符串解密的部分。...function hook_RegisterNatives() { var symbols = Module.enumerateSymbolsSync("libart.so"); var...") >= 0 && symbol.name.indexOf("JNI") >= 0 && symbol.name.indexOf("RegisterNatives...Interceptor.attach(addrRegisterNatives, { onEnter: function (args) { console.log("[RegisterNatives...fnPtr_ptr).sub(find_module.base)); } } }); } } setImmediate(hook_RegisterNatives
2、private static native void registerNatives(); registerNatives函数前面有native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在...具体到registerNatives()方法本身,其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。...既然如此,可能有人会问,registerNatives()修饰符为private,且并没有执行,作用何以达到?...其实,在Java源码中,此方法的声明后有紧接着一段静态代码块: 1 private static native void registerNatives(); 2 static { 3 registerNatives
领取专属 10元无门槛券
手把手带您无忧上云