C-如何判断指定的内存地址是否有可读写权限?
用gdb调试程序时, 用x命令可以打印内存值, 当内存不可读时, 会显示"Cannot access memory at address ...", 请问下gdb是如何判断某个内存区域是否可读写的呢?请高手指教。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
用gdb调试程序时, 用x命令可以打印内存值, 当内存不可读时, 会显示"Cannot access memory at address ...", 请问下gdb是如何判断某个内存区域是否可读写的呢?请高手指教。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
是根据cpu(如x86)体系结构中的地址转译判断的。
CPU要处理一个地址时,首先判断此虚拟地址指定的段,此段是否可读写以及特权级,内核空间可指定所属段的特权级,使应用程序不能访问。
CPU再根据段转译的线性地址(未开启PAE下包括页目录索引、页表索引、页内偏移)定位到页表项,再由此页表项(PTE)的W(写)、U(写 多处理器用)位判断是否可写。由页表项最终定位到物理地址。
gdb的源码层次很深,看起来挺麻烦的,attach到目标进程之后,可以使用mach api进行目标内存空间的内存读取操作,mach_vm_region在读取的时候会返回该region的属性,基本上有VM_PROT_READ,VM_PROT_WRITE和VM_PROT_EXECUTE,根据这些属性可以做一个判断。