努力加载中。。。 2023-06-03 20:40 采纳率: 66.7%
浏览 35
已结题

vs下汇编无法访问FS寄存器


.CODE
GetLdr PROC
        assume fs:nothing     如果加上这个就无法识别    error A2008: syntax error : fs
        mov rax,fs:[60h]       此处 引发的异常: 0xC0000005: 读取位置 0x0000000000000060 时发生访问冲突.
        ret
GetLdr ENDP

END

或者给一份64位用户态下,汇编读取FS寄存器的样例.

  • 写回答

5条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-19 04:02
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自chatgpt:

      回答:

      在Visual Studio中使用汇编访问FS寄存器的问题,主要是由于Windows平台下默认情况下无法从用户态访问FS寄存器。因此,我们需要使用Windows API函数来获取FS寄存器的值。以下是一个64位用户态下的汇编代码示例,演示如何读取FS寄存器:

      section .data
          msg db "Hello, world!", 0
      section .text
          global main
      main:
          ; 获取FS寄存器的值
          mov rax, qword [gs:0x30]
      
          ; 访问FS寄存器中的数据例如NT_TIB结构
          mov rax, qword [rax + 0x60]
          ; 将NT_TIB结构中的StackBase地址存储在RCX中
          mov rcx, qword [rax + 0x8]
      
          ; 在栈上分配内存
          sub rsp, 0x1000
      
          ; 将msg字符串复制到栈上
          mov rdi, rsp
          mov rsi, msg
          mov rcx, len(msg)
          rep movsb
      
          ; 打印msg字符串
          mov edx, len(msg)
          mov ecx, rsp
          call print_string
      
          ; 释放栈上的内存
          add rsp, 0x1000
      
          ; 退出程序
          xor eax, eax
          ret
      
      print_string:
          ; 输出msg字符串
          ; 这里省略了具体实现
          ; 可以使用C库函数printf或WinAPI函数WriteConsole等来实现
          ret
      
      len equ $-msg
      

      在这份代码中,我们首先使用GS段寄存器获取NT_TIB结构的基地址,然后从该结构中获取StackBase的地址。接下来,我们使用栈分配内存,并将msg字符串复制到栈上。最后,我们打印msg字符串,并释放在栈上分配的内存。

      请注意,这份代码使用了许多汇编指令和语言结构,并且需要理解Windows API函数的使用。根据具体情况,可能需要进一步的修改和调整。如果有任何疑问,请在下方评论区留言。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 6月27日
  • 已采纳回答 6月19日
  • 修改了问题 6月18日
  • 赞助了问题酬金15元 6月18日
  • 展开全部