windows 反调试记录
type
status
date
slug
tags
summary
category
icon
password
ring 3
本部分收集自ctf-wiki,实现方面均改为g++ asm汇编内联 + syscall直接调用win syscall或api(除去getVersion不太好写),部分代码存在内核内存读取的灵车问题
直接给到完整代码,解析见ctf-wiki即可:
note:不太清楚的可以编译一个调api的动调进去看源码的syscall参数
编译:64bit `g++ -g -masm=intel -o test test.cpp`
主要是gs段中的标识位、windows堆的特性、syscall找到debug标识位三大部分检查
代码方面可以注意一下:gs地址可以传入eax,那么ida识别的偏移是错的
如果给到rax,ida可以识别出来偏移
windows syscall 统计:https://github.com/ikermit/11Syscalls/blob/main/MD/10.0.22000.md
ring 0
以下这两个是vmp的反调
KdDebuggerEnabled
KdDebuggerEnabled 来说,其本质上是共享内存区域 KUSER_SHARED_DATA 里的一个标志位,在开启内核调试时会被置位。通过查询 KUSER_SHARED_DATA 中的标志位可以检测到是否有内核调试器,或者通过 NtQuerySystemInformation 的 class 0x23(35) 来检测,该 class 返回两个值,分别对应 KdDebuggerEnabled 和 KdDebuggerNotPresent
代码类似:
KdDebuggerNotPresent
全局变量nt!KdDebuggerNotPresent来标识是否存在内核调试器,在未启动调试模式下此值为1
kdcom.dll是Windows 操作系统内核的调试模块,里面包含了大量的内核调试函数,例如:KdD0Transition 、KdD3Transition、KdDebuggerInitialize0、KdReceivePacket、KdRestore 、KdSave 等函数。
KdDebuggerNotPresent,在KdReceivePacket这个函数中找到。KdReceivePacket将KdDebuggerNotPresent循环复位清零
上一篇
pythonJail
下一篇
mingw启动项学习
Loading...