在编译的C程序中添加/编辑字符串?

时间:2013-11-11 23:56:30

标签: c++ c ansi

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

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

7 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

许多posix平台附带程序strings,它将读取搜索字符串的二进制文件。可以选择打印字符串的偏移量。例如:

strings -td myexec

从那里你可以使用十六进制编辑器,但主要问题是你将无法创建一个更大的字符串。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

此技术可用于更改嵌入在二进制文件中的URL,也可用于将许可证密钥嵌入到二进制文件中,或将应用程序校验和值嵌入到二进制文件中,以便可以检测到何时二进制已经改变了。

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

答案 5 :(得分:0)

除非你想在生成的十六进制或汇编代码中找到它。

答案 6 :(得分:0)

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

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

很幸运,我制作了一个程序在Windows上执行此操作,它仅适用于32位程序here