以调试模式启动程序

一、以调试模式启动程序

我们在调用系统函数创建进程的时候,可以指定 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);
	}

}

通过这种方式虽然能够防止进程被附加,但是无疑会降低程序的运行效率,只作为一种反调试的方法作为参考。

posted @ 2025-03-03 19:12  lostin9772  阅读(4)  评论(0)    收藏  举报