1

通常 .exe 文件中的字符串(如对话框的内容/标题)存储在某种资源中。

但是在最近的一些我反汇编/资源检查的exe中,我找不到任何包含该字符串的资源,但它以某种方式用db's 硬编码到程序源代码中。

  • 如何提取和修改直接位于程序中的字符串?我假设那些只是相当于const char*C++ 中的 s ?

  • 为什么有人不“外包”对话框、菜单等的内容?

4

3 回答 3

3

到目前为止,从 PE 中获取字符串的最简单方法是strings我遇到的每个 Linux 发行版(甚至 uCLinux)都标配的实用程序。它几乎只是遍历整个二进制文件,寻找一系列以空字符结尾、可打印的 ascii 字符……这是您的规范字符串。 strings --help向您显示可用的参数,例如要查找的最小长度字符串、编码、架构助手以及您可能不需要的其他内容。

如果您没有运行 Linux,我建议您启动 Ubuntu Live CD 以获取大量简单而有效的命令行实用程序。

于 2010-03-23T02:26:02.770 回答
1

字符串位于资源或 PE 文件的只读数据部分中。当字符串不是控件的标题/标题时,第二种更为常见。拆卸时它们只是一段记忆,没有特别标记。像 IDA 这样的智能反汇编器可以注意到代码中对地址的引用并突出显示字符串定义。

  • 提取和修改。如果您知道字符串的地址,则很容易提取和修改它。您获取字符串的地址,然后减去图像基址,然后减去部分的 RVA,然后添加部分的物理偏移量。这将为您提供文件中字符串的位置。在那里您可以使用十六进制编辑器对其进行修改。查找地址很难 - 您需要分析反汇编代码。
  • 为什么有人不“外包”对话框、菜单等的内容?不知道。有人可能会声明 const char* 然后将其设置为标题,而不注意它实际存储在哪里。
于 2010-03-16T15:26:41.620 回答
1

如果您想访问 PE 文件中的数据,请尝试使用此实用程序(附带源代码和友好(非 GPL)许可证,以便您可以在自己的应用程序中使用该代码)。

PE 文件格式 DLL

您应该能够轻松找到相应部分的地址,然后通过数据进行操作。还有一个使用 DLL 的 PE 文件资源管理器项目(带有源代码),因此您可以了解如何为您的应用调用 DLL。

于 2010-03-29T19:19:17.910 回答