首页 > 解决方案 > 为什么在visual studio x64(MASM)上gs段寄存器的地址设置为0x0000000000000000?

问题描述

我目前正在阅读“终极反调试参考”,并且正在尝试实施一些技术。

要检查 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

我对在 Visual Studio 2017 上运行 x64 代码进行了所有正确的调整,我使用了本教程。

我使用此指令访问 NtGlobalFlag

lodsq gs:[rsi]

因为他们的语法在 Visual Studio 上不起作用。

但是,它仍然没有用。

在调试时,我注意到gs寄存器的值设置为 0x0000000000000000,而fs寄存器设置为实际值 0x0000007595377000。

我不明白为什么GS的值为零,因为它的值应该设置在 x64 上。

标签: c++visual-studioassemblymasmmasm64

解决方案


所以我仍然不明白为什么这里发布的代码会引起这么多问题,正如我所说,我只是从“<a href="https://anti-reversing.com/Downloads/Anti-Reversing/The_Ultimate_Anti -Reversing_Reference.pdf" rel="nofollow noreferrer">终极“反​​调试参考”

 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

但我找到了一个更简单的完美解决方案。

正如@“Peter Cordes”所说,我应该很好地访问没有 lodsq 的值,就像这样 -

mov rax, gs:[60h]

经过进一步调查,我发现了这个参考

代码 -

mov rax, gs:[60h]
mov al, [rax+BCh]
and al, 70h
cmp al, 70h
jz  being_debugged

我为我的程序稍微修改了一下——

    .code
GetValueFromASM proc
    
    mov rax, gs:[60h]
    mov al, [rax+0BCh]
    and al, 70h
    cmp al, 70h
    jz  being_debugged
    mov rax,0
    ret

    being_debugged:
    mov rax, 1

    ret

GetValueFromASM endp
end

只需要注意一件事——

在 Visual Studio 2017 中运行时,返回的结果为 0。这意味着没有附加调试器,这是错误的(因为我使用了本地 Windows 调试器)。

但是当使用 WinDBG 启动该进程时,它确实返回 1,这意味着它可以工作。


推荐阅读