我如何知道我可以在 x86 汇编中读写哪些内存地址?
How do I know which memory addresses I can read-write in x86 assembly?
我想了解更多关于 x86 汇编 (masm) 以及它如何处理内存的信息。
具体来说,我遇到了以下声明:
mov eax,ds:0x83f413c
我理解这会将内存地址 0x83f413c 上的内容复制到 eax 中,这引发了问题。我可以只读取和写入每个内存位置吗?我怎么知道 0x83f413c 是否是一个有效的内存位置?
上下文就是一切:) 如果 该行是在加载的用户态程序中找到的(OP 没有提到,但我假设),这可能是它是如何起源的。 mov
指令正在从程序的数据部分读取一个有效的 DWORD 大小的变量,并且模块被加载到它的首选加载地址,或者包含一个重定位记录,该记录将调整 mov
命令中的地址到正确的地址。
ds:
前缀只是反汇编程序试图覆盖所有基础的一个例子。 mov reg, mem
命令默认使用ds
。
一般来说,您无法访问任何旧地址。但是,任何程序都需要一些内存——至少要存储其静态声明的变量。当 OS 加载程序时,它必须为代码和数据分配一些内存。一旦加载,程序在内存中的布局是可以预测的。链接器知道如果程序是从 0x8300000 开始加载的,它的名为 foo
的变量将在 0x83f413c 处找到。因此读取该变量的值可以直接编码——假设程序加载到它的首选地址,在这个例子中是 0x8300000。首选地址存储在程序头中,以便 OS 在加载时知道它。
如果程序没有加载到首选地址怎么办?然后还有另一种技术在起作用,它称为重定位。程序头包含一组记录,告诉加载程序在加载时调整代码。类似于:"in the code section at offset 0x7000 there's a mov reg, mem
command that's using a memory offset that's relative to the loading address, please adjust accordingly"。程序加载器是 OS 的一部分,它会看到并按照指示执行。
总而言之,像这样的mov
命令,我。 e.从静态地址读取是安全的,只要它是由知道它在做什么的构建工具链 (compiler/linker) 生成的。在基于 OS 的程序加载器的帮助下,像这样的静态地址可以安全使用。
所有这些都是假设 OP 在针对保护模式的已编译用户态程序中遇到了相关行 OS(Windows、Linux 等) .如果它是,比如说,在设备驱动程序或 OS 内核中,或引导加载程序中,或实模式 32 位程序中(存在!),那么将适用不同的考虑因素。
我想了解更多关于 x86 汇编 (masm) 以及它如何处理内存的信息。 具体来说,我遇到了以下声明:
mov eax,ds:0x83f413c
我理解这会将内存地址 0x83f413c 上的内容复制到 eax 中,这引发了问题。我可以只读取和写入每个内存位置吗?我怎么知道 0x83f413c 是否是一个有效的内存位置?
上下文就是一切:) 如果 该行是在加载的用户态程序中找到的(OP 没有提到,但我假设),这可能是它是如何起源的。 mov
指令正在从程序的数据部分读取一个有效的 DWORD 大小的变量,并且模块被加载到它的首选加载地址,或者包含一个重定位记录,该记录将调整 mov
命令中的地址到正确的地址。
ds:
前缀只是反汇编程序试图覆盖所有基础的一个例子。 mov reg, mem
命令默认使用ds
。
一般来说,您无法访问任何旧地址。但是,任何程序都需要一些内存——至少要存储其静态声明的变量。当 OS 加载程序时,它必须为代码和数据分配一些内存。一旦加载,程序在内存中的布局是可以预测的。链接器知道如果程序是从 0x8300000 开始加载的,它的名为 foo
的变量将在 0x83f413c 处找到。因此读取该变量的值可以直接编码——假设程序加载到它的首选地址,在这个例子中是 0x8300000。首选地址存储在程序头中,以便 OS 在加载时知道它。
如果程序没有加载到首选地址怎么办?然后还有另一种技术在起作用,它称为重定位。程序头包含一组记录,告诉加载程序在加载时调整代码。类似于:"in the code section at offset 0x7000 there's a mov reg, mem
command that's using a memory offset that's relative to the loading address, please adjust accordingly"。程序加载器是 OS 的一部分,它会看到并按照指示执行。
总而言之,像这样的mov
命令,我。 e.从静态地址读取是安全的,只要它是由知道它在做什么的构建工具链 (compiler/linker) 生成的。在基于 OS 的程序加载器的帮助下,像这样的静态地址可以安全使用。
所有这些都是假设 OP 在针对保护模式的已编译用户态程序中遇到了相关行 OS(Windows、Linux 等) .如果它是,比如说,在设备驱动程序或 OS 内核中,或引导加载程序中,或实模式 32 位程序中(存在!),那么将适用不同的考虑因素。