静态反调试技术
(许多静态反调试技术对OS有较强的依赖性。)
静态反调试目的:
被调试继承用静态反调试技术来侦测自身是否处于被调试状态,若是,则执行非常规代码(主要是终止代码)来阻止。
实现方法:
调试器检测
调试环境检测
强制隔离调试器
破解方法:
主要用来从探测代码获取信息,然后修改信息本身使得反调试技术失效。
1、PEB
PEB结构体信息可以判断当前进程是否处于被调试状态。这些信息值得信赖使用方便。
PEB中与反调试密切相关的成员如上所示。
BeingDebugged成员是一个标志(flag),表示进程是否处于被调试状态。
Ldr、ProcessHeap、NtGlobalFlag与被调试进程的堆内存特性有关。
IsDebuggerPresent() API的破解之法:
借助OllyDbg调试器的编辑功能,将PEB.BeingDebugged的值修改为0 .
Ldr (+0xC)
(仅适用xp系统,另外利用附加功能将运行的进程附加到调试器时,不适用)调试进程时,未使用的的堆内存全部填充0xFEEFEEE,利用这一特征判断是否处于调试状态。
PEB.Ldr成员是一个指向_PEB_LDR_DATA结构体的指针,_PEB_LDR_DATA结构体是在堆内存中创建的,扫描该区域可轻松查找是否存在0xFEEEFEEE区域。
破解之法:
将该区域全部复写为NULL。
ProcessHeap(+0x18)
PEB.ProcessHeap成员是指向HEAP结构体的指针。
进程处于非调试状态时,Flag(+0xC)为0x2,Force Flag 为0x0
PEB.ProcessHeap既可以从PEB结构体获取,也可通过GetProcessHeap()获取
破解之法:
将这两个值设置为2与0即可。