根据PEB判断是否被调试

版权声明:本文为YuanChuang文章,未经博主允许转载。 https://blog.csdn.net/zzy1448331580/article/details/90678361

PEB偏移0x2地方的BeginDebugged标志着当前程序是否被调试

#include <Windows.h>
bool CheckDebug()
{
	bool bDebug = false;
	_asm
	{
		push eax						//在eax上操作就要先保存好eax的值
		mov eax,dword ptr fs:[0x30]		//获取PEB
		mov al,byte ptr ds:[eax+0x2]	//PEB偏移0x2处的BeginDebugged保存着是否被调试的值
		mov bDebug,al					//获取是否被调试的值
		pop eax							//还原eax
	}
	return bDebug;
}
int main(_In_ int argc, _In_reads_(argc) _Pre_z_ char** argv, _In_z_ char** envp)
{
	if (CheckDebug())
		MessageBoxA(0, "Yes", 0, 0);
	else
		MessageBoxA(0, "No", 0, 0);
	system("pause");
	return 0;
}

被调试的情况下

注意要使用原版的OD,现在很多魔改的OD都会自动越过这个检测。

没有被调试的情况下

当然也有一个系统的API来直接获取PEB的这个值,也就是

但是如果直接调用这个函数的话,会在调试器里面显示出来。

另外还有一个成员可以检测是否被调试,就是PEB偏移为0x68处的NtGlobalFlag,如果这个值为0x70的话,表示当前在被调试的状态下。

#include <Windows.h>
bool CheckDebug()
{
	int nValue;
	_asm
	{
		push eax
		mov eax,dword ptr fs:[0x30]
		mov eax, dword ptr ds : [eax + 0x68]//NtGlobalFlag
		mov nValue,eax
		pop eax
	}
	return nValue == 0x70;
}
int main(_In_ int argc, _In_reads_(argc) _Pre_z_ char** argv, _In_z_ char** envp)
{
	if (CheckDebug())
		MessageBoxA(0, "Yes", 0, 0);
	else
		MessageBoxA(0, "No", 0, 0);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zzy1448331580/article/details/90678361