看看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)的第三个字节上面