动态注册Java接口函数 静态分析被隐藏(加密)时 动态调试解密方法

JNI_OnLoad 里 第三个参数 是一个方法表 里面是 java层接口函数 与 so层里真实的函数 的 映射
每3个DCD为一组 Java层函数 前面 so层真实函数 地址
按理说 每一组的 第一个DCD为Java层函数 是一个 可见的 字符串
然而 这里却 看不到 这个字符串 , 为啥呢?
是因为 它被加密了 IDA没分析出来

那么我们怎么才能找到这个映射函数呢?

我们思路是这样的:
当运行的时候 JNI_Onload 函数下的
_JNIEnv::RegisterNatives(v3, v4, &gMethods, 1) //注册
这个 函数的 第三个参数 方法表 里面肯定是 明文的

所以我们就这么弄
想办法在它运行的时候 在这个 关键地方 下断点 就能分析出来 它的明文了
这个JNI_Onload 是加载so的时候 就运行了
那么我们就要想办法 在这个so 启动(加载)之前 就去附加 程序
不然时机晚了 就已经运行过去了

方法是这样的:
以调试模式 启动apk 这时候 apk是 初始化完毕的阶段
这时候 的so只有系统 so apk内部的so都是还没别加载进来的
那么我们到哪去下断点了?
到系统
libdvm.so 里的 LoadNative (简写)函数处 去下断点 这里说的是5.0以下系统的
在 LoadNative 函数里 找到 关键字 “Calling JNI_Onload” 这个的 下边一行 代码 就是 调用JNI_Onload 的地方
注意 注意: 这个地方所说的 JNI_Onload 是系统so libdvm.so 里LoadNative函数里 去调用apk 里的 SO apk里有很多so (apk里Java代码用System.loadLibrary(“library”) 去加载 apk 的so 的 )

这里下好断点 运行的时候 在这断下来
单步跟踪进入 这时会到 JNI_Onload 函数
这个时候 你要注意看 当前加载的是哪个 so 是不是我们要分析的so
因为每个so都有 一个JNI_Onload 函数
以前我们也说过 so就类比dll so里的JNI_Onload 函数 就类比 Main函数
第一时间启动的就是它
so里的JNI_Onload 函数 要想被调用 就必须得 在java层 System.loadLibrary(“library”) 去加载它时才能被调用

如果不是 F9继续运行 知道 运行到 加载的是我们 要分析的那个so 后
单步跟踪进入 这时 就到了 我们要分析的 那个so 里的 JNI_Onload 函数

再运行到 动态注册 java层接口函数的 地方 即
_JNIEnv::RegisterNatives(v3, v4, &gMethods, 1) //注册

这时在 Hex View窗口里 看 R2 第三个参数 的值
咋一看 貌似乱码 别慌
我们选中 这一块区域(十六进制区域) 然后 右键
Data format -> Addresses with text
意思是 把这一块内存数据 格式化成 前面是地址 后面是 文本 显示出来
这样就 全部显示出来 了
按照规则
每3行为一组
每组里的 第一行是 Java层函数名 第二行是 前面
第三行是 so里的对应的映射的 真实地址 这里这行显示出来的是
地址 后面是乱码 因为它不是文本 所以显示出来是乱码
这里我们要用的 就是 这个 地址

那么我们如何在静态分析 这个so的时候 定位到 这个映射到的 函数处了

这里我们先得到 这个映射函数 在这个so中的偏移
在动态分析的时候 我们得到了 一个地址 那个地址是 动态运行时
映射函数 在内存中所处的位置
我们到 Module 模块列表中 找到这个 so 里面有个 Base 这个 是基址是 这个so 被加载到 内存中 这个地址处
这样 我们得到了 so在内存中的 起始地址 这个映射函数 在内存中的地址
把 映射函数在内存中的 地址 - 减去 so在内存中的 起始地址
这样得到的结果 就是 映射函数 在 so中的 偏移值
这样 我们 到静态分析的 这个so 中 按G 键 输入 这个 偏移值 就是我们的 映射函数的 地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值