首页
社区
课程
招聘
[原创]开源 AADebug 内核反反调试插件(支持x64dbg)-支持VMP3.X 支持SE等反调试
2020-12-21 07:42 21549

[原创]开源 AADebug 内核反反调试插件(支持x64dbg)-支持VMP3.X 支持SE等反调试

2020-12-21 07:42
21549

When debugging begins, a kernel object called “debug object” is created

调试开始时,将创建一个称为“调试对象”的内核对象

Process->DebugPort是个永远绕不开的坎 甚至很多反调试手段都需要依赖DebugPort来判断程序是否正处于调试模式

 

重写调试函数几乎已经是目前0环所能做到的极限了

 

使用-1环虚拟化会遇到兼容以及不稳定问题

 

使用-2环不是蓝屏就是死机 没个年薪百万的水平真的玩不来-2环

 

当然在某些情况下虚拟化的确很好用 这里不将-1环和-2环的情况加入讨论

 

AADebug以及TrialSword 虽然实现方式上目前只是略有区别 但都属于重写部分调试函数来达到反反调试的效果(TrialSword 为私有 不公开项目)

 

TrialSword在实现的函数上更多更全 部分处理更好

 

AADebug只是为了能用就行 比如ProcessDebugFlags就没有处理 因为这种反调试手段在应用层就可以轻松绕过

 

不过AADebug在未来会支持反内核双机调试检测使用AADebug内核反调试 而且这也是主要目标

 

再加上应用层的反反调试手段 理论上可以无限接近使用虚拟化反反调试器所能实现的效果

 

代码在帖子最下方

 

插件目前效果

 

使用github/al-khaser作为测试对象

 

一图为第一版测试 二图为第二版测试 均在虚拟环境下进行

 



 

VMP调试测试

 

SE反调试测试

 

对于读写打开进程等权限目前只是做了一切基本处理 遇到类BE反外挂循环反权限模式依旧无法绕过 之后考虑为了支持CE加入强行修改句柄表功能 不过循环处理真的很恶心 还是虚拟化方案治这种狗东西最舒服

1
2
3
NTSTATUS NTAPI NewNtReadWriteVirtualMemory(Message_NtReadWriteVirtualMemory *message);
        NTSTATUS NTAPI NewNtProtectVirtualMemory(Message_NtProtectVirtualMemory *message);
        NTSTATUS NTAPI NewNtOpenProcess(Message_NewNtOpenProcess *message);

实现了3个debug开始的重要函数 这些函数都跟dbgport有关 都需要绕过如果不需要实现调试器的中途附加功能 其实不需要发送fakemessage也行(理论上)

1
2
3
NTSTATUS NTAPI NewNtCreateDebugObject(Message_NewNtCreateDebugObject *message);
        NTSTATUS NTAPI NewNtDebugActiveProcess(Message_NewNtDebugActiveProcess *message);
        NTSTATUS NTAPI NewNtRemoveProcessDebug(Message_NewNtRemoveProcessDebug *message);

这些私有函数其实都是windows内核的dbg函数 但是他们都会跟dbgport扯上关系 所以做一些处理

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
private://私有实现函数
        NTSTATUS NTAPI PrivateDbgkpPostFakeProcessCreateMessages(
                IN PEPROCESS Process,
                IN PDEBUG_OBJECT DebugObject,
                IN PETHREAD *pLastThread);
        NTSTATUS NTAPI PrivateDbgkpPostFakeThreadMessages(
                        IN PEPROCESS Process,
                        IN PDEBUG_OBJECT DebugObject,
                        IN PETHREAD StartThread,
                        OUT PETHREAD *pFirstThread,
                        OUT PETHREAD *pLastThread);
        NTSTATUS NTAPI PrivateDbgkpQueueMessage(
                IN PEPROCESS Process,
                IN PETHREAD Thread,
                IN OUT PDBGKM_APIMSG ApiMsg,
                IN ULONG Flags,
                IN PDEBUG_OBJECT TargetDebugObject);
        NTSTATUS NTAPI PrivateDbgkpPostFakeModuleMessages(
                IN PEPROCESS Process,
                IN PETHREAD Thread,
                IN PDEBUG_OBJECT DebugObject);
        NTSTATUS NTAPI PrivateDbgkpSetProcessDebugObject(
                IN PEPROCESS Process,
                IN PDEBUG_OBJECT DebugObject,
                IN NTSTATUS MsgStatus,
                IN PETHREAD LastThread);
        NTSTATUS NTAPI PrivateDbgkpSendApiMessage(
                IN OUT PDBGKM_APIMSG ApiMsg,
                IN BOOLEAN SuspendProcess);

为了支持异常处理,异常分发 绕反调试主动异常以及支持调试器创建进程 这些函数也是必不可少的

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
static VOID NTAPI NewKiDispatchException(
                IN PEXCEPTION_RECORD ExceptionRecord,
                IN PKEXCEPTION_FRAME ExceptionFrame,
                IN PKTRAP_FRAME TrapFrame,
                IN KPROCESSOR_MODE PreviousMode,
                IN BOOLEAN FirstChance);
        static BOOLEAN NTAPI NewDbgkForwardException(
                IN PEXCEPTION_RECORD ExceptionRecord,
                IN BOOLEAN DebugException,
                IN BOOLEAN SecondChance);
        static VOID NTAPI NewDbgkCreateThread(PVOID StartAddress);
        static VOID NTAPI NewDbgkMapViewOfSection(
                IN PVOID SectionObject,
                IN PVOID BaseAddress,
                IN ULONG SectionOffset,
                IN ULONG_PTR ViewSize);
        static VOID NTAPI NewDbgkUnMapViewOfSection(IN PVOID BaseAddress);
        /*static NTSTATUS NTAPI NewPspCreateProcess(
                OUT PHANDLE ProcessHandle,
                IN ACCESS_MASK DesiredAccess,
                IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
                IN HANDLE ParentProcess OPTIONAL,
                IN ULONG Flags,
                IN HANDLE SectionHandle OPTIONAL,
                IN HANDLE DebugPort OPTIONAL,
                IN HANDLE ExceptionPort OPTIONAL,
                IN ULONG JobMemberLevel);*/
        static NTSTATUS NTAPI NewNtCreateUserProcess(
                PHANDLE ProcessHandle,
                PETHREAD ThreadHandle,
                ACCESS_MASK ProcessDesiredAccess,
                ACCESS_MASK ThreadDesiredAccess,
                _OBJECT_ATTRIBUTES *ProcessObjectAttributes,
                _OBJECT_ATTRIBUTES *ThreadObjectAttributes,
                ULONG ProcessFlags,
                ULONG ThreadFlags,
                _RTL_USER_PROCESS_PARAMETERS *ProcessParameters,
                void *CreateInfo,
                void *AttributeList);

之前在调试进程创建时遇到了不少麻烦

 

XP和win7的进程创建有一些不同

 

PSPCreateProcess不在被使用替代的函数是NtCreateUserProcess虽然NtCreateUserProcess和PSPCreateProcess实现流程基本相同

 

但无论是参数还是调用的内部函数其实都是不同的

 

即便是我有windows私有符号的加持 想要完整还原进程创建函数也得废很大劲 所以最后让进程先成功创建 等回头再去掉dbgport

 

但此时的dbgport和dbgobject的确是自实现函数创建的 所以dbgobject以及event不能做任何修改

 

这种处理肯定会遇到问题

 

但管它的呢... 那些极端情况直接不考虑了剩下的也没什么特殊的地方了 在内核中只需要注意dbgport即可 一些LPC和PEB之类的东西稍微注意一下就能过去 非常轻松

 

目前AADebug已经是将所有能省的全都给省了 几乎所有的内核调试相关函数我都看了一遍 剩下的都无关紧要 最后al-khaser项目的反调试测试成功也说明了这一点

 

至于为什么不直接针对dbgport做一些特殊而且简单很多的方案 是因为我的主要目的是内核反双机调试检测 R3反反调试只是顺手一起搞了

目前已实现

  • 内核绕过DebugPort

  • 应用层绕过DbgUiDebugObjectHandle (NtCurrentTeb()->DbgSsReserved[1])

  • 应用层绕过PEB->BeingDebugged

  • 支持创建进程和附加进程

  • 支持配合ScyllaHide插件同时使用

  • 支持x64dbg

  • ....

BUG
  • 部分函数还没弄......

未来准备支持(按优先级排序)

  • (已完成)支持x64dbg

  • (已完成 待测试)支持cheat-engine

  • (已完成 有些是内核工程太大 不如在应用层做处理 内核做的话得不偿失)绕过大部分al-khaser应用层反调试手段

  • 支持虚拟机双机调试

  • 虚拟机双机调试支持VirtualKD

  • 支持Win10

  • 绕过部分游戏反调试保护(HS BE TP ...)

  • (已完成 待测试)绕过VMP SE等反调试加壳

最后感谢一下MeeSong 以及群里的朋友和同事 一人写代码 全群都在帮忙想哈哈哈

 

没有他的那份代码 在搞R3的时候我会走不少弯路 虽然他的代码也有坑...

 

内核启用STL也一直是在用他的代码 挺好用 但我创建项目的时候VS2019还只是预览版 所以没有用最新的2019内核STL

 

最后方上源代码地址:源码地址

欢迎提交Pull Request 欢迎技术实现讨论


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2020-12-23 18:47 被章鱼C编辑 ,原因:
收藏
点赞11
打赏
分享
最新回复 (29)
雪    币: 4438
活跃值: (2304)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Foodie 2020-12-21 09:55
2
0
前来支持
雪    币: 477
活跃值: (1412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_foyotena 2020-12-21 10:02
3
0
微软内部肯定有自己的一套debugger吧
雪    币: 184
活跃值: (2046)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
lihaiyanz 2020-12-21 10:02
4
0
谢谢分享 支持
雪    币: 615
活跃值: (445)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ugvjewxf 2020-12-21 10:21
5
0
支持,开源,赞赞,赞,
雪    币: 5929
活跃值: (3850)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
pxhb 2 2020-12-21 10:21
6
0
有没有编译好的
雪    币: 3654
活跃值: (3828)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2020-12-21 11:24
7
0
支持下
雪    币: 223
活跃值: (2539)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
章鱼C 2020-12-21 12:36
8
0
Foodie 前来支持
mesong? 这你是看雪号么
雪    币: 310
活跃值: (1917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 2020-12-21 14:40
9
0
nice
雪    币: 2077
活跃值: (4131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
默NJ 2020-12-21 15:21
10
0
厉害,不过请问一下r-2指的是smm吗?这个层次有啥研究成果吗?
雪    币: 135
活跃值: (1240)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huojier 2020-12-21 16:32
11
0
BE句柄降权的接管X64dbg的那些要用到句柄的API即可 
雪    币: 4804
活跃值: (4333)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
~时光荏苒 2020-12-21 16:35
12
0

win7的 早就有人开源了! 还自带VT,  不过你这个也不错 谢谢分享!!~~

最后于 2020-12-21 16:36 被~时光荏苒编辑 ,原因:
雪    币: 1243
活跃值: (1815)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
库尔 2020-12-21 17:19
13
0

学习一下,VT调试网上早就开源了,支持ept下断最新版的支持win10

最后于 2020-12-21 17:20 被库尔编辑 ,原因:
雪    币: 223
活跃值: (2539)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
章鱼C 2020-12-21 18:55
14
0
默NJ 厉害,不过请问一下r-2指的是smm吗?这个层次有啥研究成果吗?
这得问大佬级了 我只见过一个键盘监听
雪    币: 2077
活跃值: (4131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
默NJ 2020-12-21 19:02
15
0
章鱼C 这得问大佬级了 我只见过一个键盘监听
太强了,我听说软件层是无法访问smm内存区的
雪    币: 223
活跃值: (2539)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
章鱼C 2020-12-21 19:24
16
0
默NJ 太强了,我听说软件层是无法访问smm内存区的
以前其实有机会接触的 但是最后开会讨论还是否决了这个方案 因为当时找到了一种不依赖虚拟化 不触发PG的内核任意HOOK方式
雪    币: 223
活跃值: (2539)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
章鱼C 2020-12-21 19:27
17
0
huojier BE句柄降权的接管X64dbg的那些要用到句柄的API即可
关键是他没有触发PG 但你HOOK的话就触发了 这就有点让人恼火
雪    币: 135
活跃值: (1240)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huojier 2020-12-22 14:46
18
0
章鱼C 关键是他没有触发PG 但你HOOK的话就触发了 这就有点让人恼火
不 是注入dll到x64dbg里面hook那些R3 API再跟你驱动通讯
雪    币: 223
活跃值: (2539)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
章鱼C 2020-12-22 21:43
19
0
huojier 不 是注入dll到x64dbg里面hook那些R3 API再跟你驱动通讯
现在就是这样实现的 但句柄依旧还是没有权限的状态 只是能读写内存了
雪    币: 75
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_怪兽老了啊 2020-12-23 00:48
20
0
有没有群交流的,我想加入研究行列……
雪    币: 223
活跃值: (2539)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
章鱼C 2020-12-23 10:17
21
0
wx_怪兽老了啊 有没有群交流的,我想加入研究行列……
780705352 入群有一定的条件 你可以加我Q好友然后聊一聊
雪    币: 659
活跃值: (2592)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tmflxw 2020-12-23 10:55
22
0
又是32位吧?  
雪    币: 223
活跃值: (2539)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
章鱼C 2020-12-23 11:43
23
0
tmflxw 又是32位吧?

64位的

最后于 2020-12-23 11:44 被章鱼C编辑 ,原因:
雪    币: 10199
活跃值: (2225)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
joker陈 2020-12-23 15:52
24
0
库尔 学习一下,VT调试网上早就开源了,支持ept下断最新版的支持win10
兄弟,地址给一个我,谢谢。
雪    币: 1243
活跃值: (1815)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
库尔 2020-12-24 09:19
25
0
joker陈 兄弟,地址给一个我,谢谢。
我记得蛮多的,https://github.com/changeofpace/VivienneVMM
游客
登录 | 注册 方可回帖
返回