我怎么知道我可以在x86程序集中读写哪些内存地址?

问题描述 投票:0回答:1

我正在尝试了解有关x86汇编(masm)及其如何处理内存的更多信息。具体来说,我遇到了以下语句:

mov eax,ds:0x83f413c

我知道这会将内存地址0x83f413c中的内容复制到eax中,这引发了问题。我可以只读取和写入每个内存位置吗?我怎么知道0x83f413c是否是有效的内存位置?

assembly memory memory-management x86 masm
1个回答
1
投票

上下文就是一切:) 如果该行是在已加载的userland程序中找到的(OP并未提及,但我要假定),这可能是它的起源。 mov指令正在从程序的数据部分读取一个有效的DWORD大小的变量,并且该模块已加载到其首选的加载地址,或者包含将mov命令中的地址调整为正确地址的重定位记录。 。

ds:前缀只是反汇编程序试图覆盖所有基数的情况。 mov reg, mem命令默认使用ds

通常,您无法访问任何旧地址。但是,任何程序都需要一些内存-至少要存储其静态声明的变量。当操作系统加载程序时,它必须为代码和数据分配一些内存。一旦加载,程序在内存中的布局是可以预测的。链接器知道,如果从0x8300000开始加载程序,则会在0x83f413c处找到名为foo的变量。因此,读取该变量的值可以直接进行编码-假设程序已加载到其首选地址,在此示例中为0x8300000。首选地址存储在程序头中,以便操作系统在加载时知道该地址。

如果未将程序加载到首选地址该怎么办?然后还有另一种技术在起作用,称为重定位。程序标头包含一组记录,这些记录告诉加载程序在加载时调整代码。像这样:“在偏移量为0x7000的代码段中,有一个mov reg, mem命令正在使用相对于加载地址的内存偏移量,请相应地进行调整”。程序加载器是操作系统的一部分,可以看到并按照提示进行操作。

总共,像这样的mov命令,i。 e。 只要它是由知道它在做什么的构建工具链(编译器/链接器)生成的,]是安全的。在基于OS的程序加载器的帮助下,可以安全地使用此类静态地址。


所有这些假设都是假设OP在针对保护模式OS(Windows,Linux等)的已编译用户态程序中遇到了相关行。例如,如果它是在设备驱动程序中或在OS内核中,在引导加载程序中或在实模式下的32位程序(存在!),那么将适用不同的注意事项。

© www.soinside.com 2019 - 2024. All rights reserved.