如何找到更复杂的未知数据结构的地址

逆向工程 艾达 视窗 记忆 字符串
2021-06-16 13:50:39

我正在尝试从(32 位 Windows 应用程序)聊天窗口读取消息。不幸的是,窗口有一个自定义类,因此GetWindowText()没有帮助。我需要以某种方式从内存中读取数据。

我使用 CheatEngine 对其进行了调查,并在多个地方找到了我正在寻找的字符串。但是,它们的位置似乎不时发生变化,因为地址处的值发生了变化,例如在聊天中输入了新文本时。

不幸的是,我不是这方面的专家。我天真的假设是,字符串包含在一些类似向量的数据结构中(地址处的变化值可能是由重新分配引起的?),但我当然不确定。我已经编写了一个基本的 MemoryScanner,它能够找到一些整数值(我相信我也可以扩展它来查找字符串),但是如果我不知道聊天消息的地址和底层数据结构的确切布局?

我很感激任何建议!

编辑:我已经开始用 IDA Pro 分析程序。我发现了几个字符串(在 .rdata 部分),它们经常在聊天中使用,甚至是类似 'printf' 的名称替换。我在这些字符串以及调用这些字符串的函数上设置了断点。但是,输入聊天消息时不会触发它们。

关于 .rdata 段,我有什么需要了解的吗?例如,它是否在程序启动时加载?如果是这样,我将如何从这里开始?

1个回答

对于这种可能,我还开发了开箱即用的解决方案,用于从特殊工业相机获取 IR 图像馈送,仅作为相机软件中的预览提供。我需要在我自己的应用程序中实时调节一些热过程。我想出了这个:

  1. 获取目标窗口 Windows 处理程序

    Windows App 中的每个可视化组件都有自己的处理程序,有些也作为窗口处理。所以:

    1. 列出系统中运行的所有应用程序
    2. 检测哪一个是你的聊天
    3. 列出它的所有子句柄/子窗口
    4. 检测正确的聊天子窗口/子组件

    有关更多信息和 C++ 源代码,请参阅:

  2. 获取其 Canvas 图像

  3. OCR吧

    Chats 通常具有像素完美的单一字体,所以它应该很容易,如果做得好也不会太慢,所以 RealTime 应该是可能的。您可以使用直接像素比较或更高级但仍然简单的方法,例如:

    或者使用任何 OCR 库,如 Tesseract ......

  4. 用文本做你的事情......