【问题标题】:Who access a certain memory in windbg谁访问了windbg中的某个内存
【发布时间】:2022-12-14 11:48:52
【问题描述】:

我如何检查 WinDbg 可执行文件(反汇编)中的哪部分代码访问某个内存地址? 例如,(伪)“get_addresses_use 140000”-> 14853、12435(文本部分的地址访问地址 140000)。

【问题讨论】:

  • 通常你会设置一个观察点并运行程序。这将找到通过指针访问它的代码,这是静态分析不容易找到的。
  • 谷歌搜索“windbg breakpoint on memory write”出现了thisba (Break on Access)的页面:ba 命令设置处理器断点(通常称为数据断点,不太准确)。当访问指定的内存时触发此断点。
  • stackoverflow.com/q/51221203/2189500 的可能重复项,它已经有一个非常详细的答案。

标签: debugging assembly x86 reverse-engineering windbg


【解决方案1】:

内存地址在运行时分配给程序。对于不运行的反汇编程序,没有分配地址。地址 140000 可能永远不会被使用。

即使你运行一个很难找到的可执行文件。让我们举个例子:

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> data(1'000'000,00); // improper spacing can be fun
    int index;
    std::cin >> index;
    std::cout << data[index];
}

如果您知道哪个地址已分配给向量,您就无法判断将访问哪个地址,因为它取决于用户输入。如果用户输入负数或太大的数字,那甚至是未定义的行为。

但是,您可以在地址上使用内存断点ba。这样您就可以在访问特定地址时查看是否访问了该地址。到目前为止,无论我做了什么,这就足够了。

【讨论】:

  • 术语说明:您为 ba 描述的是其他一些调试器(例如 GDB)所称的“观察点”。
  • @PeterCordes:谢谢。我不做 Linux 开发,所以我几乎没有 GDB 知识。也许我应该参与其中。在脚本方面,GDB 似乎更加强大和一致。
  • 我自己从未接触过编写 GDB 脚本。如果你打算学习一个新的调试器,据说来自 LLVM 的 LLDB 不错。我假设从 GDB 的成功和错误中获得后见之明,他们希望做出好的设计选择。因为我已经知道很多 GDB 命令,所以我自己也没有玩过 LLDB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多