1

我有一个奇怪的问题,我想知道是否有办法在编译后添加/编辑字符串(或可以通过 C 程序访问的东西(内部,即不是外部文件))?

目的是在 Linux 上通过 PHP 更改 Windows 程序上的 URL(显然我不能只编译它)。

4

7 回答 7

2

许多 posix 平台都带有该程序,该程序strings将读取二进制文件以搜索字符串。有一个选项可以打印出字符串的偏移量。例如:

strings -td myexec

从那里您可以使用十六进制编辑器,但主要问题是您无法制作比现有更大的字符串。

于 2013-11-12T00:03:24.957 回答
1

十六进制编辑器可能是您最好的选择。

于 2013-11-11T23:58:24.613 回答
1

正如其他人所建议的,您可以使用二进制文件编辑器(十六进制编辑器)来更改可执行文件中的字符串。您将希望在字符串中嵌入一个标记(唯一的字节序列),以便您可以在文件中找到该字符串。您需要确保以正确的偏移量读取/写入文件。

正如 OP 所说的计划在 linux 上使用 PHP 来重写文件,您将需要使用 fseek 将文件指针定位到此 URL 字符串的起始位置,确保在替换字节时保持在字符串的大小范围内,然后使用 fseek/rewind 和 fwrite 来更改文件。

此技术可用于更改嵌入二进制文件中的 URL,也可用于将许可证密钥嵌入二进制文件,或将应用程序校验和值嵌入二进制文件,以便检测二进制文件何时发生更改.

正如一些海报所建议的那样,您可能需要重新计算校验和或重新签署二进制文件。检查此行为的一种快速方法是编译具有不同 URL 值的两个版本的二进制文件。然后比较文件,看看除了 URL 值之外是否存在差异。

于 2013-11-12T00:44:58.277 回答
1

十六进制编辑器可以工作,但您必须小心不要更改可执行文件的大小。如果字符串恰好在 .res 文件中,您可以使用 ResEdit。

于 2013-11-12T00:00:25.177 回答
1

有专门的工具可以修改现有的可执行文件。一个值得注意的工具是 Resource Tuner,它可用于编辑可执行文件中的各种资源。

另一种选择是使用文本编辑器,如Hex Workshop来编辑可执行文件字符串中的字符。但是,请记住,使用此方法,您只能编辑可执行文件中的现有字符串,并且替换的字符串的长度必须等于或小于原始字符串的长度,否则您最终会修改可执行代码。

于 2013-11-12T00:03:36.380 回答
1

要在已编译的程序中正确编辑字符串,您需要:

  1. 读入文件字节
  2. 在 .rdata 中搜索字符串并记录字符串第一次出现的地址
  3. 使用文件头中的一些数据将该地址转换为虚拟地址
  4. 将新的 .rdata 写入可执行文件并将新字符串写入其中,记录其地址并获取其虚拟地址。
  5. 在 .text 部分中搜索对旧字符串的虚拟地址的引用,并将其替换为对新字符串的引用。

幸运的是,我在Windows 上做了一个程序,它只适用于 32 位程序

于 2019-06-28T12:47:27.400 回答
0

除非您想在生成的十六进制或汇编代码中四处寻找。

于 2013-11-11T23:58:52.573 回答