我目前正在阅读"The Ultimate Anti Debugging Reference",并且正在尝试实现某些技术。
为了检查NtglobalFlag的值,他们使用此代码-

 push 60h
 pop rsi
 gs:lodsq ;Process Environment Block
 mov al, [rsi*2+rax-14h] ;NtGlobalFlag
 and al, 70h
 cmp al, 70h
 je being_debugged
我使用this教程对在Visual Studio 2017上运行x64代码进行了所有正确的调整。
我使用此指令来访问NtGlobalFlag
lodsq gs:[rsi]
因为它们的语法在Visual Studio上不起作用。
但是仍然没有用。
调试时,我注意到 gs 寄存器的值设置为0x0000000000000000,而 fs 寄存器的值设置为实际值0x0000007595377000。
我不明白为什么 GS 的值归零,因为应该在x64上设置它的值。

最佳答案

由于fs为零,因此64位Windows显然使用gs指向“每个线程”的内存。除了rand()的种子值之外,我不知道什么变量保留在“每个线程”的内存中。您可以调试使用rand()的程序,并在反汇编程序窗口中逐步查看它的访问方式。
向程序中添加反调试器功能的成功与否取决于击败它的动机。主要问题是Windows远程调试,和/或使用在内核模式下运行的黑客安装的设备驱动程序,以消除反调试器功能。

关于c++ - 为什么在Visual Studio x64(MASM)上将gs段寄存器的地址设置为0x0000000000000000?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64277989/

10-10 22:37