WUXING_TIANCHEN 发表于 2024-3-2 16:56

XAntiDenbug的检测逻辑与基本反调试

本帖最后由 WUXING_TIANCHEN 于 2024-3-2 17:25 编辑

可能存在错误 大佬方便可以直接说入口相关代码


   
XAntiDebug 初始化获取当前模块地址 与设置了一个标识
#define FLAG_FULLON                        (FLAG_CHECKSUM_NTOSKRNL | FLAG_CHECKSUM_CODESECTION | \                                              FLAG_DETECT_DEBUGGER | FLAG_DETECT_HARDWAREBREAKPOINT)
   
获取当前系统相关信息
_isArch64 代表是64位架构_isWow64代表是64位环境运行32位程序

   

NtSetInformationThread设置线程的优先级句柄-1是进程的句柄 -2是当前线程的句柄0x11    ThreadHideFromDebugger          = 17,wrk源码
   
会设置线程标识
   
把调试端口置空
然后继续调用但是传递了错误的地址 如果没调试器应该返回错误 调试器可能处理全部设置为0 证明其存在
然后运行XAD_Initialize函数

   
添加调加校验crc32的初始值
   
获取64位 ZwQueryInformationProcess的地址 然后减去ntdll64位模块地址 算偏移=0x000000000009d370
   
   
   

   
这段代码是直接分析ntdl pe结构 然后计算这个偏移 得到代码 直接得到文件中的代码
   
为了得到映射的下标 构造系统调用 代码目保证应用层的NtQueryInformationProcess正确
并使用crc保护自己的代码
然后调用XAD_ExecuteDetect进行检测
1 crc 检测 节表 我们的构造的系统调用 可以防止下代码段被修改
   

2 IsDebuggerPresent 检测当前是否正在被调试
   

   
fs:指向PEB的基址
   

   
检测BeingDebugged的值
3 CheckRemoteDebuggerPresent
   
实际上是查询NtQueryInformationProcess ProcessDebugPort
   
如果DebugPort存在返回 true
4 关闭一个无效句柄 如果被调试会进入异常
   

CloseHandle->NtClose 如果存在debuginfo与debugPort抛出异常 0xC0000008L被调试器接管
5 使用DuplicateHandle进行检测

我这边追流程 好像还是DuplicateHandle...->ObDuplicateObject 调用了NtClose


6 检测StrongOD

   
7 NtQueryInformationProcess检测 0x1E ProcessDebugObjectHandle


0x1E ProcessDebugObjectHandle
   
DbgkOpenProcessDebugPort
   
如果DebugPort未存在 返回 STATUS_PORT_NOT_SET 端口未设置
8 内核二次覆盖的BUG来检测反调试


这个没看懂和上面有区别吗 😥
9 使用GetThreadContext检测 检测当前线程是否使用硬件断点

10 使用VEH检测

添加VEH 到最前面
调用HardwareBreakpointRoutine触发异常 检测硬件断点


K.O_Angel/睡 发表于 2024-3-7 19:46

感谢您的无私分享,正在研究,3Q

hjsen 发表于 2024-3-8 20:42

mcliu1012 发表于 2024-8-30 09:27

厉害了,马克一下

光影由心 发表于 2024-9-7 09:05

好使,顶一个

rmb788520 发表于 2024-11-12 11:58

支持支持。谢谢分享哈
页: [1]
查看完整版本: XAntiDenbug的检测逻辑与基本反调试