什么是反调试
反调试是一种重要的软件保护技术,特别是在各种游戏保护中被尤其重视。另外, 恶意代码往往也会利用反调试来对抗安全分析。当程序意识到自己可能处于调试中 的时候,可能会改变正常的执行路径或者修改自身程序让自己崩溃,从而增加调试 时间和复杂度。
反调试技术(1)
函数检测
函数检测就是通过 Windows 自带的公开或未公开的函数直接检测程序是否处于调 试状态。最简单的调试器检测函数是 IsDebuggerPresent() :
该函数查询进程环境块(PEB)中的 BeingDebugged 标志,如果进程处在调试 上下文中,则返回一个非零值,否则返回零。
比如:
BOOL CheckDebug(){
return IsDebuggerPresent();
}
CheckRemoteDebuggerPresent()参考链接
用于检测一个远程进程是否处于调试状态:
BOOL WINAPI CheckRemoteDebuggerPresent(
_In_ HANDLE hProcess,
_Inout_ PBOOL pbDebuggerPresent );
如果 hProcess 句柄表示的进程处于调试上下文,则设置 pbDebuggerPresent 变量被设置为 TRUE ,否则被设置为 FALSE
例子:
BOOL CheckDebug()
{
BOOL ret; //bool型返回值
CheckRemoteDebuggerPresent(GetCurrentProcess(),
&ret);
return ret; }
NtQueryInformationProcess用于获取给定进程的信息:
NTSTATUS WINAPI NtQueryInformationProcess(
_In_ HANDLE ProcessHandle,
_In_ PROCESSINFOCLASS ProcessInformationClass,
_Out_ PVOID ProcessInformation,
_In_ ULONG ProcessInformationLength,
_Out_opt_ PULONG ReturnLength );
第二个参数 ProcessInformationClass 给定了需要查询的进程信息类型。当给 定值为 0 ( ProcessBasicInformation )或 7 ( ProcessDebugPort ) 时,就能得到相关调试信息,返回信息会写到第三个参数 ProcessInformation 指向的缓冲区中。
实例:
BOOL CheckDebug() {
DWORD dbgport = 0;
HMODULE hModule = LoadLibrary("Ntdll.dll"); //动态调用dll部分
NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hModule, "NtQueryInformationProcess");
NtQueryInformationProcess(GetCurrentProcess(), 7, &dbgPort, sizeof(dbgPort), NULL);
return dbgPort != 0; }
时间不早,后续会更新实际程序应用部分。。。。