首页
论坛
课程
招聘
[原创][原创]小米学安卓逆向一 - NDK开发(1)
2021-5-6 20:05 5703

[原创][原创]小米学安卓逆向一 - NDK开发(1)

2021-5-6 20:05
5703

纯小白一枚,所思皆所写,一点点记录所学。

JNI是什么

简单来说,JNI是允许java代码和其他语言进行交互的一种规范,它不是android平台特有,但凡有JVM的地方都支持。

 

图片描述
那么JNI的出现背景是什么呢?

  • Java虽然跨平台,开发快捷,但是性能不足,没有C/C++性能强悍
  • Java代码易被反编译,安全性没有C/C++好
  • 如果Java程序可以调用目前已存在的海量C/C++库完成复用,将大大节省开发时间并提高Java应用程序性能

于是JNI应运而生。

NDK是什么

  • NDK是一整套编译和调试的工具集
  • NDK提供了稳定、功能有限的API库,调用方感知程度不大
  • 重要逻辑,算法通过C/C++甚至内嵌汇编通过NDK工具链编译成动态库,最后通过JNI完成Dalvik/ART虚拟机环境中的Java代码交互。

但是需要注意的是,NDK开发的so不再具有跨平台性,基于不同架构的平台,需要编译不同平台支持的二进制接口ABI(Application Binary Interface)

JNI和NDK的区别

JNI是不限于平台的,只要运行JVM就可以,而NDK是android工具包,开发的so也不支持全平台。

NDK开发demo

项目创建

图片描述
图片描述
图片描述
图片描述

 

build生成apk,我们对apk进行提取(一般是将.apk修改为.zip然后unzip进行解压),打开lib目录,会发现有4个不同架构的目录和so文件,我们把其中arm下的so拖入ida,对照项目函数进行分析。
图片描述

 

图片描述

即可看到在native-lib.cpp中的函数。

JNI分为两种函数:

  • native,例如在android原始出现的Java开头的函数,至少传入两个参数,JNIEnv和jobject
  • native static,最终以static修饰的函数(详情见附件),传入的是JNIEnv和jclass

extern "C"的作用

  • 在C++中,为了支持重载,在对程序进行编译和链接的过程中,会进行"命名粉碎"的过程,demo中有增加了extern "C"和未加的函数,在IDA中能看出来,经过命名粉碎的函数名和代码中出现的就完全不一样,加了extern "C"的函数名和代码中一致。

  • 在调用第三方C/C++类库时,应当注意引用时,加入extern "C",不然会出现"命名粉碎"的情况,有可能会导致找不到调用函数名的情况

    在CMakeLists.txt中也要记得添加所要引用库的head文件。

代码详情见附件。

总结

  • 了解JNI和NDK的概念,背景以及区别
  • 实际动手实践和分析JNI开发过程

链接: https://pan.baidu.com/s/1g6bCbKwBvPsHid0cytUMqQ 密码: m1n3


看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 1649
活跃值: 活跃值 (2530)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Max_hhg 活跃值 2021-5-27 20:30
2
0
第一个图挂了
游客
登录 | 注册 方可回帖
返回