首页
社区
课程
招聘
[原创]XAntiDenbug的检测逻辑与基本反调试
2024-3-2 16:53 8206

[原创]XAntiDenbug的检测逻辑与基本反调试

2024-3-2 16:53
8206

可能存在错误 大佬们可以的话给提示

入口相关代码

图片描述

XAntiDebug 初始化获取当前模块地址 与设置了一个标识

1
2
#define FLAG_FULLON                          (FLAG_CHECKSUM_NTOSKRNL | FLAG_CHECKSUM_CODESECTION | \
                                              FLAG_DETECT_DEBUGGER | FLAG_DETECT_HARDWAREBREAKPOINT)

图片描述
获取当前系统相关信息

1
2
_isArch64 代表是64位架构
_isWow64  代表是64位环境运行32位程序

图片描述

1
2
3
4
NtSetInformationThread  设置线程的优先级
句柄-1  是进程的句柄 -2是当前线程的句柄
0x11    ThreadHideFromDebugger          = 17,
wrk源码

图片描述
会设置线程标识
图片描述
把调试端口置空

1
然后继续调用但是传递了错误的地址 如果没调试器应该返回错误 调试器可能处理全部设置为0 证明其存在

运行XAD_Initialize函数

图片描述

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

图片描述
图片描述
图片描述
这段代码是直接分析ntdl pe结构 然后计算这个偏移 得到代码 直接得到文件中的代码
图片描述
为了得到映射的下标 构造系统调用 代码目保证应用层的NtQueryInformationProcess正确
并使用crc保护自己的代码

然后调用XAD_ExecuteDetect进行检测

1 crc 检测 节表 我们的构造的系统调用 可以防止下代码段被修改

图片描述

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

图片描述
图片描述

fs:[30h]指向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触发异常 检测硬件断点
图片描述

图片描述


[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

最后于 2024-3-2 16:54 被tian_chen编辑 ,原因:
收藏
点赞7
打赏
分享
最新回复 (1)
雪    币: 19773
活跃值: (29390)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2024-3-2 23:23
2
2
感谢分享
游客
登录 | 注册 方可回帖
返回