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 证明其存在
获取64位 ZwQueryInformationProcess的地址 然后减去ntdll64位模块地址 算偏移=0x000000000009d370。
这段代码是直接分析ntdl pe结构 然后计算这个偏移 得到代码 直接得到文件中的代码。为了得到映射的下标 构造系统调用 代码目保证应用层的NtQueryInformationProcess正确。1 crc 检测 节表 我们的构造的系统调用 可以防止下代码段被修改
2 IsDebuggerPresent 检测当前是否正在被调试
3 CheckRemoteDebuggerPresent
实际上是查询NtQueryInformationProcess ProcessDebugPort。
4 关闭一个无效句柄 如果被调试会进入异常
CloseHandle->NtClose 如果存在debuginfo与debugPort抛出异常 0xC0000008L被调试器接管。5 使用DuplicateHandle进行检测
我这边追流程 好像还是DuplicateHandle...->ObDuplicateObject 调用了NtClose。6 检测StrongOD
7 NtQueryInformationProcess检测 0x1E ProcessDebugObjectHandle
0x1E ProcessDebugObjectHandle如果DebugPort未存在 返回 STATUS_PORT_NOT_SET 端口未设置。8 内核二次覆盖的BUG来检测反调试
9 使用GetThreadContext检测 检测当前线程是否使用硬件断点
10 使用VEH检测
调用HardwareBreakpointRoutine触发异常 检测硬件断点。看雪ID:tian_chen
https://bbs.kanxue.com/user-home-941362.htm
*本文为看雪论坛优秀文章,由 tian_chen 原创,转载请注明来自看雪社区
文章来源: https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458549131&idx=1&sn=f55b06b92058bdfdffba4fe3d4e6c18e&chksm=b18d4b0186fac21738fc3693d35b7c2cca4fcbfe6ff0bce589eb602c0789af22d3b107277b2b&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh