一.前言
今天和大家讲讲jni开发,为什么要和大家介绍呢,因为jni开发是安卓开发中经常使用的,其作用就是java调用c代码,或者c调用java代码。一般一些难一点的app都是采用这个方式,采用这个方式的好处就是更难逆向,让逆向工作更加困难。
如下图所示
二.创建JNI项目
1.安装ndk
apply等待下载就好
2.创建jni项目
我们选择这个,后面就按照需要选择就好了
三.JNI快速体验
也就是jni的配置
1.在cpp文件夹创建一个.c文件,名字随便取
2.在java中创建一个类,通常和.c名字一样,然后写上下面这些
3.在CMakeLists.txt中加上这些,其中utils就是上图中添加的,只要保持名字一样
后面会生成utils.so的文件
4.在刚刚创建的java下面写一个方法,前面可以看成是固定写法,只是一个接口
public static native(比如这个)
5.在.c文件中写逻辑
这样就成功快速上手了
四.类型
java中类型和jni类型的对应关系
这里我就不一个个给大家举例子了,大家现在一定知道,在逆向中,如果我们看到
System.loadLibrary()
public static native,那肯定是使用了jni方法,调用了里面的c
五.c调用java
这里只给出逆向中我们需要注意的:
当我们在c中看见 (*env)->FindClass(env, "路径/方法") 这个就是c调用了java中的这个方法,对于这个我们知道就可以了,不需要真的和开发一样会写。
六.动态注册
我们前面说的那些都是静态注册,可以发现c文件中的函数名字和java中的名字有对应关系,而动态注册是没有的,所以我们得了解动态注册,这里就不细致给大家讲了,因为我也不是很会,这里给出几张截图方便大家理解一下。
1.java中
2.c中
我们发现,动态注册虽然没有对应关系,但是我们发编译可以看到
static JNINativeMethod gMethods
JNIEXPORT jint JNICALL JNI_OnLoad
jclass clazz = (*env)->FindClass(env, "路径/类");
其中getMethods里可以看到对应方法,这样就可以了
七.总结
jni开发要介绍的东西就很多,但是我们并不需要完全和开发app一样了解,只需要了解在app逆向中的jni开发的作用就好。这里我就不把那些小技巧给总结了,你们完整的看看就好。
补充
如有需要主页私信我,有球必应