首页
论坛
课程
招聘
[原创]A64Dbg-手把手教你开启虚拟化上帝模式
2021-5-14 15:35 12269

[原创]A64Dbg-手把手教你开启虚拟化上帝模式

2021-5-14 15:35
12269

简介

A64Dbg从1.9.1版本开始,我们正式启用了代码页托管模式的虚拟化调试。这个模式的直接好处是:

  • 可以直接过AntiPtrace这种反调试机制;
  • 可以直接过TracerPidCheck这种调试器检测机制;
  • 可以直接过MemCodeCRC这种内存校验机制;

当我们拿到一个新样本的时候,用这个模式作为分析的切入点是非常不错的。当然,由于托管了断点所在的代码页,UraniumVM虚拟机在执行性能上肯定是没有Native模式高,但是这并不妨碍我们调试。毕竟,1s执行完毕还是5s执行完毕,对于调试这种场景来说是无所谓的。

 

下面跟着文章的步骤,我们来一步步搭建环境和做一些基本操作。

一、电脑端环境

Windows用户在如下地址下载最新的桌面主程序:

1
https://gitee.com/geekneo/A64Dbg-Win

Intel macOS用户在如下地址下载最新的桌面主程序:

1
https://gitee.com/geekneo/A64Dbg-Mac

ARM macOS用户在如下地址下载最新的桌面主程序:

1
https://gitee.com/geekneo/A64Dbg-iOS

注意,非常重要的一个细节:首次启动A64Dbg主程序时,一定要允许其使用网络,如果不小心禁止了,需要在防火墙配置里面允许A64Dbg的网络输入输出。因为,虚拟化调试模式需要在A64Dbg与Debugee之间建立TCP连接,用于传输虚拟机上下文和调试操控协议。

二、手机端环境

首先,下载最新的服务端程序包,在如下地址:

1
https://gitee.com/geekneo/A64Dbg

1.Android用户需要把如下文件夹的内容全部放在手机的/data/local/tmp目录:

1
2
3
4
2021/01/26  11:39    <DIR>          a64dbg-server-arm
2021/05/10  15:37    <DIR>          a64dbg-server-arm.uvm
2021/01/26  11:39    <DIR>          a64dbg-server-arm64
2021/05/10  15:37    <DIR>          a64dbg-server-arm64.uvm

注意,非常重要的细节,Android使用虚拟化调试模式时,必须关闭SELinux,否则无法使用Launch APK Activity这个功能,而这是过反调试的关键:

1
setenforce 0

然后,使用A64Dbg主程序之前,请先保持a64dbg-server-arm64/lidadbg-server处于运行状态。

2.iOS用户直接安装如下deb文件即可,安装过程的一些错误输出无关紧要,忽略就可以了:

1
2
3
2019/12/29  19:12         2,390,890 a64dbg-server.deb
2021/05/14  14:46           320,072 a64dbg-server.uvm.deb
https://gitee.com/geekneo/Textobot/blob/master/iOS/Textobot.deb

三、Android特有的前置配置

iOS越狱环境由于有CydiaSubstrate/deb框架,因此把代码跑在任意进程相对容易很多。并且Frida-Inject在iOS平台也是使用mach api进行注入,与ptrace不冲突,所以就算App Deny Ptrace了,依旧可以Frida Inject。
Android平台就没有这么幸运了,首先是没有一个成熟的类似于deb这样的插件框架,其次是Frida-Inject的机制基于ptrace,所以如果App先调用了Ptrace-Attach,那么所有基于该机制的工具将无法工作,比如LLDB/Frida。面对这类Debugee,从最原点开始干活的Launch操作就是必须的了。
由于Android机制的特殊性,所有第三方App都是由Zygote Fork出来的,所以,我们需要一种机制,在Zygote Fork出App进程之后第一时间通知A64Dbg Attach。下面介绍A64Dbg使用的两种方案。

3.1Magisk Root环境

步骤一:安装Riru Zygote注入框架

1
A64Dbg/launch-apk/riru-v25.zip

步骤二:安装ADZygote反向Attach框架

1
A64Dbg/launch-apk/cn.yunyoo.adzygote-v25.zip

3.2Non-Magisk Root环境

对于非Magisk Root环境,需要你手动DIY一下,利用Xpose或者LLDB注入一个so至Zygote进程,然后根据架构主动dlopen:

1
/data/local/tmp/a64dbg-server-arm64.uvm/libadzygote.so

PoC代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void fork_atchild(void) {
#if __arm__
#define AD_ARCH "arm"
#elif __aarch64__ || __arm64__
#define AD_ARCH "arm64"
#elif __x86_64__
#define AD_ARCH "x86_64"
#else
#define AD_ARCH "x86"
#endif
  // notify a64dbg in its ctor function
  dlopen("/data/local/tmp/a64dbg-server-" AD_ARCH ".uvm/libadzygote.so", RTLD_NOW);
}
// fork_atchild will be invoked after zygote forked the target app
void init_in_zygote(void) {
  pthread_atfork(nullptr, nullptr, fork_atchild);
}

这段PoC就是cn.yunyoo.adzygote-v25.zip的实现逻辑。而pthread_atfork对等的功能就是Riru这个框架做的事情,只是Riru基于Magisk利用Native Bridge做得更好,功能更强大。

3.3ro.debuggable=1环境

如果你可以把系统ro.debuggable设置为1,那么可以使用jdwp协议来达到从头控制目标样本的目的。

 

步骤一:系统设置里面的开发者选项将目标样本设置为调试启动,这样启动目标程序时就会弹出等待调试器的对话框;
步骤二:使用A64Dbg Attach之后使用jdwp协议开始程序的运行过程:

1
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

四、从源头开始启动虚拟化调试

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

1
2
3
4
Launching /data/app/so.a64dbg.crackme1-wwI87g4EZ2tZ2mXJssB6MA==/base.apk with am start -S -n so.a64dbg.crackme1/so.a64dbg.crackme1.MainActivity.
Remote new uvm client 192.168.0.100:38071 connected.
uvmdbg : Connected to 192.168.0.105:30331.
Remote uvm debuggee triple aarch64-linux-android, page size 0000000000001000, page mask 0000000000000FFF.

如果有些模块不在这个列表中,则使用Refresh菜单刷新一下:
图片描述
设置Page模型的断点,这种断点模型不会修改代码内存​:
图片描述
操作样本程序,断点击中之后,我们就可以正常调试了,注意它的TracerPid是0​,因为我们并没有依赖Ptrace这种调试机制。
图片描述
此时,授权版本就可以正常的F4、F7、F8、Trace了​。免费版本的用户可以开发ADCpp、Decompiler、ADP等等自动化的脚本了​。比如右键Decompile一下​:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//
// The middle source was generated by the Retargetable Decompiler
// Website: https://retdec.com
//
// The final source was generated by the UraniumVCPU Sampler Framework
// Website: http://yunyoo.cn
//
 
// Address range: 0xfd98 - 0x100c8
// Demangled:     MD5::getDigest()
int64_t _ZN3MD59getDigestEv(void) {
    // 0xfd98
    int64_t v1; // 0xfd98
    uint64_t v2 = v1;
    int64_t v3 = __asm_mrs(v1, v1); // 0xfda8
    int64_t v4 = v2 % 256; // 0xfdc8
    if (v2 % 2 == 0) {
        // 0xfdd0
        *(char *)v2 = 1;
        int64_t v5 = v2 + 4; // 0xfdd8
        int64_t * v6 = (int64_t *)v5; // 0xfe20
        int64_t v7; // bp-64, 0xfd98
        __memcpy_chk(&v7, v6, 16, 16);
        int64_t v8 = v2 + 20; // 0xfe54
        int64_t * v9 = (int64_t *)v8; // 0xfe9c
        int64_t v10; // bp-72, 0xfd98
        __memcpy_chk(&v10, v9, 8, 8);
        int64_t v11; // bp-48, 0xfd98
        _ZN3MD56encodeEPKjPhm(v2, v8, &v11, 8);
        int32_t v12 = *(int32_t *)v8; // 0xfeec
        uint32_t v13 = __asm_ubfx(v12, v12, 3, 6); // 0xfef0
        _ZN3MD54initEPKhm(v2, g1, (int64_t)((v13 >= 55 == (v13 != 55) ? 120 : 56) - v13));
        _ZN3MD54initEPKhm(v2, (int64_t)&v11, 8);
        _ZN3MD56encodeEPKjPhm(v2, v5, (int64_t *)(v2 + 92), 16);
        memcpy(v6, &v7, 16);
        memcpy(v9, &v10, 8);
        v4 = 8;
    }
    // 0x1008c
    if (*(int64_t *)(__asm_mrs(v4, v3) + 40) == *(int64_t *)(v3 + 40)) {
        // 0x100b0
        return v2 + 92;
    }
    // 0x100c4
    __stack_chk_fail();
    return &g2;
}

或者写一些ADCpp脚本,这个可以参见这篇文章《ADCpp-实战itunesstored kbsync远程调用》:

1
https://mp.weixin.qq.com/s/0iGgnS7Yi6DXXvT2mFPgog

Have fun~


看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

收藏
点赞6
打赏
分享
最新回复 (10)
雪    币: 2534
活跃值: 活跃值 (1626)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
dx苹果的心愿 活跃值 1 2021-5-14 15:42
2
0
屌爆了
雪    币: 1505
活跃值: 活跃值 (4760)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
至尊小仙侠 活跃值 2021-5-14 17:16
3
0
火钳刘明
雪    币: 0
活跃值: 活跃值 (590)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_阿达西 活跃值 2021-5-19 11:12
4
0
大佬,调试器会一直维护更新吗? 适当收费可以接受
雪    币: 2194
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
fuckzg 活跃值 2021-5-19 11:15
5
0
收藏学习了,不知道好不好用,先下来试试
雪    币: 1645
活跃值: 活跃值 (3153)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 活跃值 2 2021-5-19 20:13
6
0
wx_阿达西 大佬,调试器会一直维护更新吗? 适当收费可以接受
放心学习并使用,退一万步讲,就算公司倒闭了,我个人作为兴趣爱好也会持续维护的。
雪    币: 1645
活跃值: 活跃值 (3153)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 活跃值 2 2021-5-19 20:15
7
0
fuckzg 收藏学习了,不知道好不好用,先下来试试
如果有不好用的地方或者什么问题,欢迎反馈,帮助我们持续改进下去。
雪    币: 213
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_第七子 活跃值 2021-5-27 23:09
8
0
能在android下内存断点么?
雪    币: 0
活跃值: 活跃值 (590)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_阿达西 活跃值 2021-6-1 21:56
9
0
嗯嗯
雪    币: 518
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
河北小风 活跃值 2021-7-26 21:53
10
1
谢谢分享,学习到了
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_xzfwsiuy 活跃值 2022-5-27 10:52
11
0
支持下中文就直接买个授权玩玩
游客
登录 | 注册 方可回帖
返回