[C++]使用FS寄存器判断进程是否被调试

昨天研究了一下IsDebuggerPresent这个函数的实现代码,发现真的很简单,只有区区4行:

mov eax, dword ptr fs:[018H]
mov eax, dword ptr [eax + 030H]
movzx eax, dword ptr [eax + 02H]
ret

参考了一些大牛的文章,原来第一行是获取TEB的地址,第二行是获取PEB地址,第三行是获得BeingDebugged标记的值,BeingDebugged值为1则进程被调试,值为0则进程没有被调试器附加,于是我写了以下的代码,可以实现和IsDebuggerPresent相同的检测功能:

while (1)
{
	DWORD dwFS = 0;
	dwFS = __readfsdword(0x18);
	dwFS = *(DWORD *)(dwFS + 0x30);
	dwFS = *(DWORD *)(dwFS + 0x02) & 0x000000FF;
	printf("%08X\n", dwFS);
	__asm
	{
		mov eax, dword ptr fs:[018H]
		mov eax, dword ptr [eax + 030H]
		movzx eax, dword ptr [eax + 02H]
		mov dwFS, eax
	}
	printf("%08X\n", dwFS);

	system("Pause");
}


使用__readfsdword函数前请#include <intrin.h>

参考了这篇文章,感谢文章作者:http://cxc200026.blog.163.com/blog/static/3426867200841764521515/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值