反调试技术一. 使用Windows API函数1. IsDebuggerPresent函数2.CheckRemoteDebuggerPresent函数3.OutputDebuggerPresent函数二. 手动检测数据结构1. 检测BeingDebugged属性

BeingDebugged属性位于PEB结构的第二个字节位置处

mov eax, dword ptr fs:[30h];//fs:[30h]指向的是PEB的基地址mov ebx, byte ptr [eax+2];// 指向对应的BeingDebugged属性test ebx, ebx;jz ... ;

2. 检测系统痕迹

遍历当前运行进程,查看是否存在调试器进程,或者使用FinWindow函数查看。

三. 识别调试器行为1. 扫描是否存在INT3断点

INT3断点的机器码是0xcc

call $+5;pop edi;sub edi, 5;mov ecx, 400h;mov eax, 0cch;repne scasb;jz DebuggerPresent;

2. 时钟检测

通过对比两次运行的时间戳来判断是否存在调试器,因为如果存在调试器,运行速度会大幅度的降低。
使用rdtsc指令实现

rdtsc;xor ecx, ecx;add ecx, eax;//第一次运行时间rdtsc;sub eax, ecx;//计算两次运行时间的差值cmp eax, 0xfff;//比较是否运行时间过长jb NoDebuggerDetected;