android逆向基础教程三

CMake下JNI动态注册及逆向

在对native层hook首先我们先了解android native 开发流程及简单的逆向关注点,在后续的hook native 层中会有更加复杂的过程,加密,加壳等一系列的加固方案,会给后续逆向付出很大的时间成本来达到App相对安全。

1.JNI动态注册流程

首先android Studio新建Native C++工程

新建自己的cpp并JIN_Load动态注册

 修改CMakeLists.txt文件

在MainActivity.java中loadlibrary自己写的lib库,因此需要动态注册的类全名即为(包名/MainActivity)

申明native方法接口并调用方法输出结果。

 模拟器通过调用native方法输出的结果。

反编译过程分析

Jedx查看代码发现OnCreate中只调用了dynamicJavaMethod2()方法,而此方法实现在native层。并且loadLibrary加载了ndkjni ,mylib两个so库。因此需要查看dynamicJavaMethod2()方法在哪一个库中。

 IDA打开libndkjni.so 查看导出函数,发现没有我们想要的方法名。

 打开mylib.so查看导出表,发现我要要找的关键函数。进入分析

此处即为我们的代码逻辑部分。

 

 F5查看逻辑代码

为什么java层的方法找到的是dynamicJavaMethod2(),而我们反编译后找到的是dynamicJINMethod2()?

因为在JNI动态注册代码中,动态注册的方法组中dyamicJavaMethod2对应的(void*)dynamicJNIMethod2函数名。

如果native层的dynamicJNIMethod2函数名改为很难辨识的时候是不是很难找到?

是的,这个时候我们就应该是通过JNI_load函数去找到方法组再查看对应的函数。

3.通过JNI_load方法找关键函数

动态注册时都会执行到这个方法中,我们现在只知道java层调用关键方法dyamicJavaMethod2,而不知道对应的native层函数名。

3.1流程分析

分析JNI_load函数

V3为JNIEnv *env,在sub_9E0传入env,跟踪Sub_9E0,发现传入参数为:包名+MainActivity

进入sub_A40,明显看出为此函数通过调用RegisterNatives方法来注册我们的函数

(int)off_3000即为java与c++映射的方法数组,进入查看,可以看出数组中的方法数组对应。

代码格式如下

以上了解android native 动态注册的开发流程,为后续逆向关键流程提供思路。

猜你喜欢

转载自blog.csdn.net/qq_37431937/article/details/122477501
今日推荐