0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

动态分析so文件中的JNI函数

哆啦安全 来源:编码安全 2023-04-10 11:18 次阅读

APP逆向过程中,需要对dex文件和elf文件进行分析,又因现在各APP都有各种代码保护手法,因此都需要进行动态分析。

今天就分享下对elf文件也就是so文件中动态分析so文件中JNI函数的方案。

jnitrace它是基于frida基础上的一个工具,它是一个动态分析追踪SO文件中的JNI API调用的工具,它可以进行指定SO文件进行跟踪JNI调用。

基础知识

1、JavaVM 和 JNIEnv

JNI 它定义了两个关键数据结构:JavaVM和JNIEnv。它们本质上都是指向函数表的二级指针。(在 C++ 版本中,它们是一些类,这些类具有指向函数表的指针,并具有每个通过该函数表间接调用的 JNI 函数的成员函数。)JavaVM 提供“调用接口”函数,可以利用此类来函数创建和销毁 JavaVM。

JNIEnv 提供了大部分 JNI 函数, so中的原生函数都会收到 JNIEnv 作为第一个参数。该 JNIEnv 将用于线程本地存储。因此无法在线程之间共享 JNIEnv。如果一段代码无法通过其他方法获取自己的 JNIEnv,应该共享相应 JavaVM,然后使用 GetEnv 发现线程的 JNIEnv。

a28c0bfe-d6bf-11ed-bfe3-dac502259ad0.png

JNIEnv 和 JavaVM 的 C 声明与 C++ 声明不同。"jni.h" include 文件会提供不同的类型定义符,具体取决于该文件是包含在 C 还是 C++ 中。因此不建议在这两种语言包含的头文件中添加 NIEnv 参数。

2、spawn和attach注入区别

Frida支持spawn和attach两种启动方式。

attach模式下,Frida会附加到当前的目标进程中,即需要App处于启动状态,这也意味着它只能从当前时机往后Hook;

spawn模式下,Frida会自行启动并注入进目标App,Hook的时机非常早,好处在于不会错过App中相对较早(比如App启动时产生的参数),缺点是假如想要Hook的时机点偏后,则会带来大量干扰信息,严重甚至会导致server崩溃。

attach注入:APP启动后再 hook,不能 hook APP的启动阶段。

spawn注入 :重启 APP,适合 hook APP启动阶段。

基本操作

jnitrace使用需要配合python环境和frida工具(版本需要配套好)

a2a35d0e-d6bf-11ed-bfe3-dac502259ad0.png

这个jnitrace安装后主要核心的实现功能都在jnitrace.py和jnitrace.js

a2c041ee-d6bf-11ed-bfe3-dac502259ad0.png

a2e5642e-d6bf-11ed-bfe3-dac502259ad0.png

下图是jnitrace.py中主要功能:首先判断连接设备的方式 是以remote_device还是usb_device,接着默认采用spawn的注入方式,在去执行jnitrace.js文件中的hook功能,最后在输出执行后的数据。

a2f24004-d6bf-11ed-bfe3-dac502259ad0.png

下图是jnitrace.js的关键功能点,注入后实际功能还是调用到底层的dlopen。

a30e7bde-d6bf-11ed-bfe3-dac502259ad0.png

实践分析

Frida启动后会往要hook的进程中注入frida的so文件

a31d83cc-d6bf-11ed-bfe3-dac502259ad0.png

下图是所有功能组成的解析

a3401018-d6bf-11ed-bfe3-dac502259ad0.png

通过jnitrace -l libxxx.so com.xxx.xxx 可以打印输出so中的jni函数,以及这些jni函数的调用获取数据

a356c6f0-d6bf-11ed-bfe3-dac502259ad0.png

a372e272-d6bf-11ed-bfe3-dac502259ad0.png

a396db5a-d6bf-11ed-bfe3-dac502259ad0.png

通过 jnitrace -l libxxx.so com.xxx.xxx -i RegisterNatives 可以查看到so中的所有动态注册的函数。

a3af5612-d6bf-11ed-bfe3-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103028
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83486

原文标题:App逆向之so分析方法

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    android的surface

    使用libhgl.so库。在libs/EGL/egl.cpp文件,选择使用这两个库的一个,主要操作在eglGetDisplay()函数
    发表于 03-04 15:54

    Linux系统动态库与静态库函数的使用介绍

    。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码,你的程序执行到相关函数时才调用该函数库里的相应
    发表于 04-02 16:21

    Linux系统动态库与静态库函数的使用介绍

    必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码,你的程序执行到相关函数时才调用该函数库里的相应
    发表于 09-29 11:31

    8168的demos里如何加.so动态链接库

    8168的demos里如何加c++文件生成的 .so动态链接库
    发表于 06-21 11:56

    Linux系统动态库与静态库函数的使用介绍

    main.c调用了hello.c实现的函数,使用静态库的方式编译得到一个可执行文件main_a 2、动态动态库的后缀为*.
    发表于 07-04 05:33

    找不到libvuforia.so怎么办

    很多开发者会遇到“找不到libvuforia.so”的问题,以前Vuforia的版本具有jni,这个库需要我们手动编译,会比较麻烦,最新的demo已经不需要了。因此效率也高了很多,代码也相对比较容易
    发表于 09-19 18:15

    芯灵思SinlinxA33开发板的安卓控制LED-2-JNI基础

    语句块来加载动态库} } 程序实现测试java代码javah -jni Hello 生成Hello .h 打开Hello .h 文件里面已经写好C函数的名字C代码将C
    发表于 02-22 16:55

    JNI类的传递

    怎样去创建JNI要传递的类?从JNI得到返回类的信息是什么?
    发表于 09-30 09:18

    JNI是什么?如何配置JNI环境?

    JNI是什么?如何配置JNI环境?
    发表于 03-02 07:25

    如何在普通的鸿蒙工程中使用编译好的SO文件

    DevEco Studio 默认创建了libs目录,所以将之前编译好的SO文件直接拷贝到libs目录即可。2.2 引入 JNITools 文件
    发表于 03-25 10:06

    请问C++项目如何编译成可在OpenHarmony3.1环境下使用的动态so文件

    以前的Linux环境的C++项目,可以通过在CMakeList文件设置使用的工具链,编译出各个开发平台下可以使用的so文件。请问,我现在在开发平台上,烧录OpenHarmon V3.
    发表于 06-06 16:41

    JNI java调用so动态库方法

    JNI Java调用so包相关问题总结,出现了很多问题,按照操作应该不会发生不到so包的错误,其实最后出现的也是说加载不到libpython2.7.x.so.1,我就纳闷了,怎么和py
    发表于 11-28 13:13 3292次阅读

    Linux下的静态库、动态库和动态加载库

    两种类型的库:静态库(.a): 在链接期间被应用程序直接链接进可执行文件动态链接库(.so): 动态库还分为两种用法: a) 应用程序运行期间链接
    发表于 04-02 14:32 610次阅读

    Android下的DEX文件SO文件梳理总结

    android逆向分析、脱壳破解分析过程中免不了和android的各种文件格式打交道(so、dex、xml、art、oat等等)。
    的头像 发表于 11-04 09:32 5133次阅读

    在单片机上实现动态加载功能的函数库介绍

    本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,
    的头像 发表于 11-09 10:55 728次阅读