吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17112|回复: 63
收起左侧

[x64dbg Plugin] AADebug 内核反反调试插件(目前已支持x64dbg-支持VMP3.X 支持SE)

  [复制链接]
最后的戴托纳 发表于 2020-12-21 07:24
本帖最后由 最后的戴托纳 于 2020-12-23 18:46 编辑

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作为测试对象一图为第一版测试 二图为第二版测试 均在虚拟环境下进行

1.png
2.png


对于读写打开进程等权限目前只是做了一切基本处理 遇到类BE反外挂循环反权限模式依旧无法绕过 之后考虑为了支持CE加入强行修改句柄表功能 不过循环处理真的很恶心 还是虚拟化方案治这种狗东西最舒服
[C++] 纯文本查看 复制代码
NTSTATUS NTAPI NewNtReadWriteVirtualMemory(Message_NtReadWriteVirtualMemory *message);
        NTSTATUS NTAPI NewNtProtectVirtualMemory(Message_NtProtectVirtualMemory *message);
        NTSTATUS NTAPI NewNtOpenProcess(Message_NewNtOpenProcess *message);

6.png
5.png 4.png



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


[C++] 纯文本查看 复制代码
NTSTATUS NTAPI NewNtCreateDebugObject(Message_NewNtCreateDebugObject *message);
        NTSTATUS NTAPI NewNtDebugActiveProcess(Message_NewNtDebugActiveProcess *message);
        NTSTATUS NTAPI NewNtRemoveProcessDebug(Message_NewNtRemoveProcessDebug *message);



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


[C++] 纯文本查看 复制代码
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);



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


[C++] 纯文本查看 复制代码
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项目的反调试测试也说明了这一点

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

AADebug目前已实现
  • 内核绕过DebugPort
  • 应用层绕过DbgUiDebugObjectHandle (NtCurrentTeb()->DbgSsReserved[1])
  • 应用层绕过PEB->BeingDebugged
  • 支持创建进程和附加进程
  • 支持配合ScyllaHide插件同时使用
  • 支持x64dbg
  • 绕过VMP SE等反调试加壳
  • ....

未来准备支持(按优先级排序)
  • (已完成)支持x64dbg
  • (已完成 待测试)支持cheat-engine
  • (已完成)绕过大部分al-khaser应用层反调试手段
  • 支持虚拟机双机调试 重写内核调试函数 绕过内核反调试检测(某些反调试会加载驱动 比如游戏反外挂 驱动会判断内核的某些标志 判断是否处于双机调试模式 目标就是绕过这些点)
  • 虚拟机双机调试支持VirtualKD
  • 支持Win10
  • 绕过部分游戏反调试保护(HS BE TP ...)



最后感谢一下MeeSong(我的确不知道他52破解的账号ID) 以及群里的朋友和同事 一人写代码 全群都在帮忙想哈哈哈

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

内核启用STL也一直是在用他的代码 挺好用

最后方上源代码地址:https://github.com/DragonQuestHero/Kernel-Anit-Anit-Debug-Plugins

免费评分

参与人数 17吾爱币 +17 热心值 +16 收起 理由
unipendix + 1 + 1 谢谢@Thanks!
yuan71058 + 1 + 1 谢谢@Thanks!
20w8109 + 1 我很赞同!
xfly_t + 1 + 1 谢谢@Thanks!
evea + 1 + 1 我很赞同!
diaoes + 1 + 1 我很赞同!
xiedengyu + 1 + 1 谢谢@Thanks!
小小沫涵 + 1 + 1 我很赞同!
dreakwl + 1 + 1 用心讨论,共获提升!
jy04468108 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gaosld + 1 + 1 热心回复!
sdlylz + 1 + 1 我很赞同!
niushengsan + 1 + 1 热心回复!
Ravey + 1 + 1 谢谢@Thanks!
woyucheng + 1 + 1 谢谢@Thanks!
小哲哲你来了 + 1 + 1 用心讨论,共获提升!
170059475 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

chen4321 发表于 2020-12-21 08:37
大佬牛逼,666
戏言跟班丶 发表于 2020-12-22 12:17
最后的戴托纳 发表于 2020-12-22 12:14
读内存倒是好解决 但是不知道该怎么写功能 你有功能代码么?

只读内存的话我也不太清楚  但是动内存的话 可以hook游戏引擎 跟cs1.6的差不多 github上不少 hook引擎国内没有开源的 所以我也不会 不过cs1.6的我倒是有源码
whngomj 发表于 2020-12-21 07:49
xt61544562 发表于 2020-12-21 09:15

谢谢分享,学习了.
hyhyx 发表于 2020-12-21 09:28
收藏收藏,学习了,很有帮助的插件
hnwang 发表于 2020-12-21 09:35
感谢 收藏一下
565266718 发表于 2020-12-21 10:36
感谢分享。。。
netspirit 发表于 2020-12-21 12:06
敢动内核的都是厉害的...........
DPlus 发表于 2020-12-21 14:04
学到了学到了
liuhaiqi 发表于 2020-12-21 14:17
少文件吧大哥
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 02:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表