一些反调试

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
posted @ 2020-07-15 10:29  小哑师兄  阅读(179)  评论(0)    收藏  举报