一些反调试
IsDebuggerPresent()
当调试器存在的时候 kernel32的IsDebuggerPresent()函数返回的一个非0值
BOOL WINAPI IsDebuggerPresebt(void);
函数返回的时BeingDebugged标志的值 改变其值就可以达到绕过的效果
- 主要标志
call IsDebuggerPresent
test al,al
jne being_debugged
以上内容摘自https://wiki.x10sec.org/reverse/anti-debug/isdebuggerpresent/index.html
NtglobalFlag
在32位机器上,NtGlobalFlag字段位于PEB(进程环境块)0x68的偏移处,64位机器则是在0xBC位置,该字段的默认值为0,当调试器正在运行时,该字段会被设置为一个特定的值,尽管该值并不能确定的表明某个调试器在运行,但该字段常出于该目的而使用
- 该字段包含一系列标志位,由调试器创建的进程会设置以下标志位:
FLG_HEAP_ENABLE_TAIL_CHECK(0x10)
FLG_HEAP_ENABLE_FREE_CHECK(0x20)
FLG_HEAP_VALIDATE_PARAMETERS(0x40)
- 检测代码
mov eax, fs:[30h] ;Process Environment Block
mov al, [eax+68h] ;NtGlobalFlag
and al, 70h
cmp al, 70h
je being_debugged
以上内容摘自https://wiki.x10sec.org/reverse/anti-debug/ntglobalflag/index.html
CheckRemoteDebuggerPresent()
用于检测指定进程是否正在被调试
BOOL WINAPI CheckRemotedDebuggPresent(
_In_ HANDLE hProcess.
_Inout_ PBOOL pbDebuggerPresent
};
- 注意汇编中的call CheckRemoteDebuggerPresent
> 以上摘自https://wiki.x10sec.org/reverse/anti-debug/checkremotedebuggerpresent/index.html

浙公网安备 33010602011771号