c++ - 为什么在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 上。
解决方案
所以我仍然不明白为什么这里发布的代码会引起这么多问题,正如我所说,我只是从“<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,这意味着它可以工作。
推荐阅读
- java - 内嵌图像显示为附件:JavaMail
- c# - 这个点“•”是否算作有效的 UTF8 字符?
- python - 使用 Django 存款金额
- r - 刻面尺寸增加的不同标记
- javascript - 来自 API 的 getScript() 包含 Json 块数据库后无法向 javascript 显示数据
- mysql - 显示类别和产品中的过滤器,显示过滤器相关的过滤器帖子选择(与活动父级不相关)和每个过滤器的产品计数
- spring - 不支持内容类型空白
- certificate - 我在哪里可以找到证书、标识符和配置文件中的配置文件页面?
- angular - 无法在 ng-2charts 折线图上添加注释
- ios - 在大部分屏幕模糊的 iOS 应用上显示相机