首页
社区
课程
招聘
[原创]IsDebuggerPresent原理及其 c++实现
发表于: 2018-10-8 21:34 3563

[原创]IsDebuggerPresent原理及其 c++实现

2018-10-8 21:34
3563

用x32dbg在IsDebuggerPresent下断,步入得到如下代码:



750E38F0 | 64 A1 18 00 00 00        | mov eax,dword ptr fs:[18]               | eax:std::cout
750E38F6 | 8B 40 30                 | mov eax,dword ptr ds:[eax+30]           | eax:std::cout
750E38F9 | 0F B6 40 02              | movzx eax,byte ptr ds:[eax+2]           | eax:std::cout
750E38FD | C3                       | ret                                     |
750E38FE | CC                       | int3                                    |
750E38FF | CC                       | int3                                    |
750E3900 | CC                       | int3                                    |
750E3901 | CC                       | int3                                    |
750E3902 | CC                       | int3                                    |
由此可知 实际就是读取    [fs:[0x18] + 0x30] +2 地址的一个字节的值。如果1 的话就为TRUE否则为FALSE

然后在内存窗口ctrl+g 输入fs:[18]得到fs:[18的]值
实际得出fs:[18] =7EFDD000



eax+30就是这里


再来看看7EFDE000里的值 和 7EFDE000 +2的字节值


[eax+2]   = 1 .所以此时是调试状态 
知道原理,那么就可以用c++来实现了,如下代码用c++实现修改这个调试标志的值让IsDebuggerPresent返回为FALSE:

*((unsigned char *)(*(DWORD*)(__readfsdword(0x18) + 0x30)) + 0x2) = 0;



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-10-9 22:02 被xtayaitak编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
图片挂了一些
2018-10-9 00:21
0
游客
登录 | 注册 方可回帖
返回
//