【问题标题】:Scanning all physical memory扫描所有物理内存
【发布时间】:2016-10-18 16:25:07
【问题描述】:

我正在尝试通过 nasm 扫描我的所有内存以查找特定变量。 我当前的代码看起来有点像这样:

%include "io64.inc"
%define VAR 1234
section .text
global main
main:
    mov     rax, 0x0
nxt:
    mov     rbx, [rax]
    cmp     rbx, VAR
    je      end
    inc     rax
    jmp     nxt
end:
    PRINT_HEX 8,rax
    ret

我的问题是这迟早会产生分段错误(取决于起始地址,它可能会运行几个周期然后失败)。在搜索如何做到这一点时,我没有找到关于该主题的任何答案。我怀疑 cs 和 ss 寄存器可能需要对它做些什么,但我不知道到底是怎么回事。 我知道作弊引擎能够做到这一点,所以必须有办法做到这一点。

tl;博士 尝试读取内存,出现分段错误;我该如何避免它们?还有哪些其他选择? (最好不需要管理员权限)

附加信息:

  • 操作系统:Win 10 Pro 64bit
  • CPU:Intel(R) Core(TM) i5-4210M@2.60GHz 2 核 4 线程
  • 内存:8gb DDR3

感谢您的任何回答

【问题讨论】:

  • 您无法从 Windows 下的用户模式程序扫描所有物理内存。您实际扫描的是虚拟内存,您只看到专门为该进程分配的内存。任何未分配的虚拟地址空间区域都不会被映射,尝试访问它会导致分段错误。
  • @RossRidge 谢谢^^。有什么办法绕过它?或者您可以链接我以阅读有关该主题的任何内容?
  • 你可以打开一个进程并读取它的内存,看起来就是这个意图

标签: windows assembly nasm x86-64


【解决方案1】:

首先要做的是:您在使用虚拟内存的操作系统上运行,并且您的进程仅使用并看到 virtual 地址,并且有一个地址空间(除了一些共享的只读页面) 与其他进程的地址空间分开且不同。

这意味着除非操作系统可能公开的特殊 API,否则您根本无法从 用户空间 程序扫描所有 物理 内存。

你应该明白为什么这是一件好事。如果操作系统允许随机用户空间程序扫描整个物理内存,那将是一个巨大的安全漏洞。

您的程序正在崩溃,因为您正在访问尚未映射到任何东西的虚拟地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多