IsDebuggerPresent解密

看看IsDebuggerPresent函数的秘密:

7C812E03 >  64:A1 18000000           mov     eax, dword ptr fs:[18]
//指向TEB自身,也就是FS
7C812E09    8B40 30                  mov     eax, dword ptr [eax+30]
//指向PEB
7C812E0C    0FB640 02                movzx   eax, byte ptr [eax+2]
//PEB前进两个字节取Byte
7C812E10    C3                       retn

先取FS:[18]处的指针,跟进,找到偏移为30h处的指针,再跟进,然后移动两个字节就可以看到IsDebuggerPresent标记了。为1表示当前程序处于调试状态,为0表示NOT.这样我们就可以手动修改内存了,哈哈

 简化代码:

__asm
  {
    mov eax, fs:[30h] ;EAX =  TEB.ProcessEnvironmentBlock
    inc eax
    inc eax
    mov eax, [eax]
    and eax,0x000000ff  ;AL  =  PEB.BeingDebugged
    test eax, eax
    jne is_debuging
    jmp is_not_debuging
  }

一句话:DEBUG标记就在进程环境块(PEB)的第三个字节上面
 

你可能感兴趣的:(c,解密,byte)