【问题标题】:Scrub through memory arbitrarily while avoiding Read Access Violations任意擦洗内存,同时避免读取访问冲突
【发布时间】:2020-03-23 13:33:39
【问题描述】:

我正在编写一个调试工具,它从另一个进程获取内存地址并显示那里的内存以及它周围的所有内存。通常情况下,像这样读取内存可能会导致读取访问冲突,具体取决于地址,但我不想在用户刷入进程不拥有的内存或选择奇怪的地址时崩溃。

给定一个地址,即使是像0x00000000 这样肯定会失败的地址,如果它违反了我如何尝试访问它而不中止我的程序?

【问题讨论】:

  • 你试过try-catch吗?在 MS C++ 中,它确实会捕获那些新的,但不会捕获堆栈中的那些。我不知道 cygwin/mingw GNU C++ 或 Windows 平台上可用的其他 C++ 编译器。
  • 使用ReadProcessMemory - 无论如何你都需要。它不会使目标应用程序崩溃,而只是在内存地址对读取无效的情况下返回失败。
  • @cup: try catch 用于 C++ 异常,而不是访问冲突。但这也不是访问冲突,正如上面的评论所解释的那样。

标签: c++ windows debugging memory


【解决方案1】:

VirtualQueryEx 可用于迭代您有权访问的任何进程的所有页面,以检查页面保护。

QueryWorkingSetEx 类似但过滤为在内存中分页,也称为working set,可以提供更详细的信息。

ReadProcessMemory 本质上是一个封装在内核异常处理程序中的 memcpy。使用它(正确地)您永远不会崩溃,并且可以检查GetLastError 以了解发生任何故障的原因。

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多