检测代码区校验和实现简易反调试

OD里下断点实际上是将代码改成int 3,又叫“CC中断”。基于这个原理,我们可以在程序中创建一个线程,实时检测代码区是否被修改,从而实现反OD下断点。

下面是代码演示:

// 校验和反调试.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 为了方便测试,请在链接器选项中关闭随机基址ASLR

#include 
#include 

DWORD g_dwCheckSum = 0; // 校验和

DWORD WINAPI CheckThread(LPVOID lpvoid)
{
	printf("校验线程开始\n");
	while (1)
	{
		// 计算校验和
		DWORD dwBaseOfCode = 0x00411000; // 代码起始地址
		DWORD dwSizeOfCode = 0x6000; // 代码长度
		DWORD dwCheckSum = 0;
		for (DWORD i = dwBaseOfCode; i < dwBaseOfCode + dwSizeOfCode; i++)
		{
			dwCheckSum += *((PBYTE)i);
		}
		if (dwCheckSum != g_dwCheckSum)
		{
			printf("检测到CC断点,程序结束\n");
			ExitProcess(1);
		}
	}
	printf("校验线程结束\n");
	return 0;
}

int main()
{
	DWORD dwBaseOfCode = 0x00411000; // 代码起始地址
	DWORD dwSizeOfCode = 0x6000; // 代码长度
	printf("%08x\n%08x\n", dwBaseOfCode, dwBaseOfCode+dwSizeOfCode);
	for (DWORD i = dwBaseOfCode; i < dwBaseOfCode + dwSizeOfCode; i++)
	{
		g_dwCheckSum += *((PBYTE)i);
	}
	// 启动代码检测线程
	CreateThread(0, 0, CheckThread, 0, 0, 0);
	int cnt = 0;
	while (1)
	{
		printf("程序正在执行...%d\n",++cnt);
		Sleep(1000);
	}
	return 0;
}

拿到OD里跑起,不下断点,结果如下:
检测代码区校验和实现简易反调试_第1张图片
随便下一个F2断点,检测线程就会结束进程。
检测代码区校验和实现简易反调试_第2张图片

你可能感兴趣的:(WINDOWS逆向)