反调试技术一. 使用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;