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