验证正在访问的地址是否是程序集中进程内存的一部分
verify if the address being accessed is a part of a process memory in Assembly
我怎么知道我要访问的地址是进程内存的一部分?我的意思是,例如,如果我尝试在随机过程中执行此操作 mov eax, [0x010],它将崩溃,因为 0x10 不是在进程的内存中,使用寄存器进行间接内存访问也是如此。
那么在访问地址之前是否有办法通过进程自己的代码验证地址 readable/writable?
除了访问页面并捕获 OS 发送给您的访问无效页面的信号或异常之外,没有其他方法可以查明页面是否可访问。
这是因为您的操作系统的分页机制会捕获页面错误,然后确定该页面是否应该有内存。如果是,它会分配内存并将页面 table 配置为指向该内存。然后它重新启动您的程序,该程序访问新分配的页面,就好像它一直在那里一样。由于硬件不知道 OS 计划这样做,因此它无法告诉您页面是否有效,即使它有办法告诉您。
考虑研究 OS 枚举进程内存映射的具体机制。例如,在 Linux 上,您可以检查 proc 文件系统以获得内存映射。使用此内存映射,您可以检测是否为您的进程分配了哪些地址范围。
我怎么知道我要访问的地址是进程内存的一部分?我的意思是,例如,如果我尝试在随机过程中执行此操作 mov eax, [0x010],它将崩溃,因为 0x10 不是在进程的内存中,使用寄存器进行间接内存访问也是如此。
那么在访问地址之前是否有办法通过进程自己的代码验证地址 readable/writable?
除了访问页面并捕获 OS 发送给您的访问无效页面的信号或异常之外,没有其他方法可以查明页面是否可访问。
这是因为您的操作系统的分页机制会捕获页面错误,然后确定该页面是否应该有内存。如果是,它会分配内存并将页面 table 配置为指向该内存。然后它重新启动您的程序,该程序访问新分配的页面,就好像它一直在那里一样。由于硬件不知道 OS 计划这样做,因此它无法告诉您页面是否有效,即使它有办法告诉您。
考虑研究 OS 枚举进程内存映射的具体机制。例如,在 Linux 上,您可以检查 proc 文件系统以获得内存映射。使用此内存映射,您可以检测是否为您的进程分配了哪些地址范围。