以调试模式启动程序
一、以调试模式启动程序
我们在调用系统函数创建进程的时候,可以指定 DEBUG_PROCESS
参数来以调试方式启动程序,通过这种方式启动的进程由于已经处于调试状态,因此无法再次被其他调试器附加。
1 通过 CreateProcessA 函数以调试方式启动
原理比较简单,我们首先以调试方式启动进程,然后循环等待进程发送过来的调试事件,然后处理并返回,恢复进程继续运行,代码如下:
#include <stdio.h>
#include <Windows.h>
int main()
{
// 以调试模式打开进程
STARTUPINFOA sInfo = { 0 };
sInfo.cb = sizeof(STARTUPINFOA);
PROCESS_INFORMATION pInfo = { 0 };
BOOL ret = CreateProcessA("D://File//Lily5.0//Tools//PETool//CFF Explore//CFF Explorer.exe",
NULL, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &sInfo, &pInfo);
if (!ret)
{
printf("进程打开失败\r\n");
return 0;
}
while (TRUE)
{
// 等待调试事件
DEBUG_EVENT debugEvent = { 0 };
BOOL rdebug = WaitForDebugEvent(&debugEvent, INFINITE);
if (rdebug)
{
printf("EventCode=%d\r\n", debugEvent.dwDebugEventCode);
}
// 恢复被调试程序
ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);
}
}
通过这种方式虽然能够防止进程被附加,但是无疑会降低程序的运行效率,只作为一种反调试的方法作为参考。