1

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

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

4

2 回答 2

1

所以我仍然不明白为什么这里发布的代码会引起这么多问题,正如我所说,我只是从“<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,这意味着它可以工作。

于 2020-10-09T12:23:57.490 回答
1

64 位 Windows 显然使用fs指向“每个线程”内存,因为gs它是零。除了 rand() 的种子值之外,我不知道“每个线程”内存中保存了哪些变量。您可以调试一个使用 rand() 的程序,并在反汇编程序窗口中单步执行它,以查看它是如何被访问的。

向程序添加反调试器功能的成功将取决于有多大的动机来打败它。主要问题是 Windows 远程调试和/或使用在内核模式下运行的黑客安装的设备驱动程序来破坏反调试器功能。

于 2020-10-09T20:45:20.703 回答