吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3622|回复: 8
收起左侧

[Android 原创] JNI学习笔记--动态注册及Inlinehook分析JNI动态注册

[复制链接]
DS_FLY100 发表于 2020-6-24 17:04
本帖最后由 DS_FLY100 于 2020-6-28 11:22 编辑

一、前言
  随着大家的安全意识越来越高,越来越多的开发者将核心的加密、逻辑等放到Native层(so文件),有的甚至还用了JNI动态注册和OLLVM混淆等技术来增强APP被破解的难度。为了更好的逆向分析这些so文件,开始了秃头之路,这篇分享,就是这段时间的学习总结,自己在巩固学习的同时,也希望能够帮助到大家。
二、JNI动态注册
俗话说的好,知己知彼,百战不殆。要想把JNI动态注册分析透彻,我们就要先了解下JNI动态注册是如何实现的。
2.1、环境准备之NDK开发
先配置下NDK开发环境(自行百度,环境配置就不说了)
我的AndroidStudio版本是3.5.2,可以直接新建一个Native C++工程:

1.png
也可以建一个空白工程,然后手动配置下CMakeList.txt等,这里就不演示了。
2.2、java层调用Native层函数
这边为了实现不同类中函数的动态注册,新建了一个类NDKTest,其中MainActivity类中calcuateSum函数和NDKTest类中的HelloLoad函数的具体内容都是在Native层中实现的:
2.png 3.png
2.3、Native层函数功能实现
在cpp目录下新建native-lib.h头文件,由于内容比较简单就不用javah生成了,native-lib.h内容如下:
4.png
很多同学就有疑惑,java层HelloLoad函数没有传参为什么这边有两个传参,java层的calcuatesum函数有两个传参,为什么这边有四个传参,这边和大家解释下,JNIEnv,指代了Java本地接口环境,是一个JNI接口指针,指向了本地方法的一个函数表。   jobject与jclass通常作为JNI函数的第二个参数,当所声明Native方法是静态方法时,对应参数jclass,因为静态方法不依赖对象实例,而依赖于类,所以参数中传递的是一个jclass类型。相反,如果声明的Native方法时非静态方法时,那么对应参数是jobject。
然后就是在native-lib.cpp文件中实现具体的功能:

5.png
由于要动态注册,所以这边add就是java层calcuateSum函数动态注册后的函数名,具体内容是两个数相加。Hello_JNI就是java层HelloLoad函数动态注册后的函数名,具体内容为 输出了一个“Hello World!”字符串。
2.4 JNI动态注册具体实现
首先将需要动态注册的函数列表放进JNINativeMethod中,由于是多个类所以这边定义两个列表:
6.png
其中calcuateSum是java层函数名,add是Native层动态注册后函数名,“(II)I”表示 这个函数 传参为两个int型,返回值是int型。下面那个“()Ljava/lang/String” 表示函数无传参,返回值为String型。
然后就是调用RegisterNatives方法来注册我们的函数:

7.png
这边"com/example/jni_test/MainActivity"和"com/example/jni_test/NDKTest"是java层类的路径,这边通过FindClass方法来找对应的类。
再然后就是再JNI_OnLoad中进行动态注册:
8.png
2.5、打包验证结果
我们将刚刚的工程打包下,把打包成的apk解压,将/lib/armeabi-v7a目录下的libbative-lib.so拖进IDA中查看:
9.png
可以看到已经动态注册成功了。
三、Inlinehook分析JNI动态注册
3.1 环境准备
俗话又说的好,工欲善其事必先利其器,我们先去github上下载一个现成的框架···  我下载的是这个大神的 :https://github.com/ele7enxxh/Android-Inline-Hook
然后我们新建一个空白的工程,在main 目录下新建一个jni文件夹,将下载工程中的include文件夹、inlineHook.c、relocate.c、relocate.h 复制到jni目录下。然后在jni目录下新建一个CMakeLists.txt文件和hooktest.cpp文件。最终目录如下:
11.png
其中com_example_nativehook_nativeMethod.h是后续生成的头文件,稍后会说到。接下来就是编写CMakeLists.txt文件,内容如下:
10.png
然后在build.gradle(app)中添加:
12.png
至此所有的环境工作准备完成。
3.2 编写hook代码
首先 在java层调用native层函数 用来触发hook代码。
13.png
然后我们去工程目录下用javah生成头文件:
14.png
我这边就是E:\AS_project\NativeHook\app\src\main\java 目录下,cmd到这个目录,然后javah命令如下:

15.png
随后将生成的.h 头文件移至jni目录下。
最后就是编写hooktest.cpp文件。这边主要是为了hook  RegisterNative方法,得到Native层中动态注册后的函数名。最好也能得到函数地址。
具体代码如下:

16.png
17.jpg
18.jpg
然后打包运行。  关于hook代码的编写大家可以参考这两篇文章:
一夜梦惊人 大佬的 : https://www.52pojie.cn/thread-945614-1-1.html
四哥  大佬的 :https://www.52pojie.cn/thread-800279-1-1.html (貌似已经删帖,百度好像还能百度到)
在此对二位大佬表示真挚的感谢。
3.3 inlinehook功能验证
首先,新建一个空白工程,在libs文件夹下 新建armeabi-v7a文件夹,将上一步打包apk中的 libinlineHook.so文件放入到armeabi-v7a
文件夹下。 也将我们最开始动态注册的libnative-lib.so文件放入到改文件夹下。然后做好调用so的环境初始化,动态注册调用so里面函数的目录是怎样的,这边在java层照抄。最终目录如下:

19.png

这边用两个button控制,一个读取自己的inlinehook.so 一个hook 动态注册的so:
20.png
打包运行,结果如下:
21.png
可以看到这边打印出了native层对应函数的基地址(上面的)和 绝对地址(下面的)。相对地址用绝对地址减去基地址就得到了~
4 总结
纸上得来终觉浅,绝知此事要躬行。看别人的文章觉得实现的很简单,自己操作起来就问题百出。如果大家要学习某个技能,一定要动手操作起来。这篇文章分两次写的,隔了三天时间,思路有点混乱了,还请各位见谅。如果这篇文章对大家有帮助的话,还请给个赞~~多谢了~
最后,本文只用于学习,如果用于非法用途,自行承担后果~~

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
温柔的一哥 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

雨落惊鸿, 发表于 2020-6-24 18:21
坐等大神更新
温柔的一哥 发表于 2020-6-25 16:02
感谢分享笔记。楼主辛苦了!你的学习能力很不错哟,蛮聪明的。
muirelle 发表于 2020-6-25 18:02
楼主,有个地方没看明白,2.3中说“   jobject与jclass通常作为JNI函数的第二个参数,当所声明Native方法是静态方法时,对应参数jclass,因为静态方法不依赖对象实例,而依赖于类,所以参数中传递的是一个jclass类型。相反,如果声明的Native方法时非静态方法时,那么对应参数是jobject。”,但是图4中的两个函数都是static,为什么HelloLoad的第二个参数类型是jobject,求指教
低调的菜鸡 发表于 2020-6-25 22:57
很强啊,期待后续
 楼主| DS_FLY100 发表于 2020-6-28 09:34
muirelle 发表于 2020-6-25 18:02
楼主,有个地方没看明白,2.3中说“   jobject与jclass通常作为JNI函数的第二个参数,当所声明Native方法是 ...

可以改成jclass的 不影响的~
 楼主| DS_FLY100 发表于 2020-6-28 11:20
更新完成~~有点仓促。顶下~~
 楼主| DS_FLY100 发表于 2020-6-28 16:14

更新结束~
ericgao 发表于 2020-7-7 16:19
又出新作了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 18:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表