首页
社区
课程
招聘
[分享] unidbg 反检测内存地址截断排错记录
发表于: 2025-8-23 22:21 2938

[分享] unidbg 反检测内存地址截断排错记录

2025-8-23 22:21
2938

最近在根据龙哥的文章开发 unidbg 反检测时,遇到了内存地址截断的问题。由于 unidbg 采用经典的内存加载模型,与 64 位设备的 48 位虚拟空间差异很大,因此可以被作为检测点。

其中一种绕过的思路就是把STACK_BASEMMAP_BASE抬高。他们在 unidbg 源码的 unidbg-api/src/main/java/com/github/unidbg/memory/Memory.java 中有定义。于是我试着将两个基址分别抬高到 0x7f00000000L0x7200000000L(模拟真实设备的一些基址),结果遇到了以下错误:

我尝试了多组 MMAP_BASE 地址进行测试:

这个错误很奇怪,目标程序尝试读取 0xb2000 地址,但进程的 maps 中并没有对这个地址进行内存映射。一开始以为是内存地址冲突,但重新回顾内存布局后感觉不太可能。这更像是高位被截断了。

通过 trace 搜索 0xb2000,找到了问题的关键:

在 IDA 中定位后发现,JNI 调用完的返回值就是 0xb2000。由于 unidbg 是自己处理 JNI 调用的,说明问题出在 unidbg 对 GetStringUTFChars 的处理上。

进一步调试发现,问题出现在 pointer.toIntPeer() 上:

toIntPeer 将 pointer 进行截断,使其符合 int 类型的范围。

翻阅源码得知,unidbg 使用三个 map 来处理 JNI 引用:

这些 map 将 JNI 引用对象的 hashcode 作为键,JNI 引用对象作为值。unidbg 可以通过以下代码取出一个 JNI 引用:

当时也是陷入了第二个错误的思路,误以为处理 JNI 引用的 map 中的键是一个内存地址(因为在真实设备的 demo 中,返回的值是一个堆地址)。

为了更好地解决问题,这里重新梳理了一下基础知识点

用于字符串转换:jstring → const char*

在 unidbg 中:

而在真实设备中:

给定输入类的字符串,返回一个 jclass 类型。

**对于 unidbg 来说,**返回的是一个 int 类型的哈希 hash。hash 由字符串调用哈希函数得来。

**对于真实设备来说,**返回的是一个类对象引用,一个指向 JVM 内部类元数据结构的指针,可以用它来查找方法、字段,或者用于反射等操作。

返回一个方法的标识符号,类型为 jmethodID。本质上是 JVM 内部用于定位某个方法的”句柄”或”索引”,但它不是一个 Java 对象引用,也不是指向方法实现的 C 函数指针,不能用它做对象操作。

对于 unidbg 来说:
返回的也是一个 int 类型的哈希 hash。


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 122
支持
分享
最新回复 (68)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2025-8-24 00:07
0
雪    币: 922
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
666
2025-8-24 00:54
0
雪    币: 14
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
hao
2025-8-24 04:58
0
雪    币: 2432
活跃值: (4693)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
666
2025-8-24 11:38
0
雪    币: 156
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
你用的旧版本unidbg吗,我补的时候没任何问题
2025-8-24 14:05
0
雪    币: 1295
活跃值: (1065)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mb_cfjwplfo 你用的旧版本unidbg吗,我补的时候没任何问题
最新0.9.8的
2025-8-24 14:42
0
雪    币: 156
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
Hur1k 最新0.9.8的[em_049]
我懂了,我没模拟真实设备基址,我的返回地址不会被截断
2025-8-24 15:18
0
雪    币: 156
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
对了,大佬这个unidbg与真机在旧版apk会走不一样的算法分支,这个检测点你找到了吗
2025-8-24 15:22
0
雪    币: 1295
活跃值: (1065)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mb_cfjwplfo 我懂了,我没模拟真实设备基址,我的返回地址不会被截断
对,原版基址因为太矮了所以不会被截断
2025-8-24 16:15
0
雪    币: 1295
活跃值: (1065)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
mb_cfjwplfo 对了,大佬这个unidbg与真机在旧版apk会走不一样的算法分支,这个检测点你找到了吗
应该是别的检测点吧,还没具体看,这只是随便挑了个样本来看看抬高基址后能不能跑通
2025-8-24 16:17
0
雪    币: 156
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
Hur1k 应该是别的检测点吧,还没具体看,这只是随便挑了个样本来看看抬高基址后能不能跑通[em_014]
大佬可以加个好友吗,我没法私信你
2025-8-24 16:42
0
雪    币: 2724
活跃值: (2636)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
66
2025-8-24 17:27
0
雪    币: 425
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
看看看
2025-8-24 17:41
0
雪    币: 2
活跃值: (3833)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
龙哥威武
2025-8-24 22:43
0
雪    币: 171
活跃值: (1079)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
666
2025-8-24 23:34
0
雪    币: 4997
活跃值: (5079)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
66
2025-8-25 08:05
0
雪    币: 204
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
666
2025-8-25 08:54
0
雪    币: 5611
活跃值: (3919)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
666
2025-8-25 09:14
0
雪    币: 104
活跃值: (7159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
tql
2025-8-25 09:17
0
雪    币: 4198
活跃值: (3920)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
21
一眼jd
2025-8-25 10:16
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
666
2025-8-25 11:06
0
雪    币: 178
活跃值: (3061)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
23
2025-8-25 11:42
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
6666
2025-8-25 12:40
0
雪    币: 54
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
666
2025-8-25 13:41
0
游客
登录 | 注册 方可回帖
返回