1

我需要稍微更改 exe 中的字符串,我不再有源代码。它是用 C 写的。

我注意到 C 字符串文字似乎根本没有出现在机器代码列表中——无论如何都没有出现在原始 ASCII 中,也没有出现在 utf8/16/32 或类似的东西中。它们似乎是编码的,我猜是 32 位操作码的一部分。例如,我知道代码有 c 行: print("My string"); 通过字节 'm' 'y' ' ' 's' 等,但字符串似乎根本没有出现,甚至在任何 utf8/16/32 编码中都没有,甚至在 1/2/3/4/5 中也没有/6/7/8 每个字符之间的字节(我已经检查了所有这些组合)。

据我了解,文字可能是立即操作码,并且这些可能在非字节对齐位置具有 8 位 ASCII 值。有人知道我应该寻找什么操作码吗?目前,即使我一点一点地移动整个文件,我仍然找不到任何看起来像字符串的东西。

4

7 回答 7

3

Doubtful that a simple print statement would get encoded like that by the compiler.

My guess is any of the following:

  1. The EXE is getting the string from elsewhere. (Another file, another dll, etc...)

  2. You aren't looking hard enough to find the string. I'm assuming you used a hex editor that shows ascii as well as octal?

  3. The author of the code went out of his way to prevent you from doing what you want.

What are you really trying to do anyway?

于 2009-08-03T00:57:47.403 回答
2

与其逐位移动整个文件或查看一堆不同的编码,不如直接反汇编可执行文件?程序不能没有代码就做神秘的事情,你可以通过反汇编来阅读代码。如果数据存储在操作码中,将很难更改,但我无法想象编译器为什么会以这种方式存储字符串。

于 2009-08-03T04:03:23.467 回答
2

虽然我不确定你为什么找不到字符串,

我确信仅更新字符串将是危险且非常困难的工作

于 2009-08-03T04:57:40.200 回答
1

Use a tool such as Dumpbin (provided with Visual Studio) or objdump (a GNU tool, available on any platform).

Dump the content of the sections called .rodata and .text; the string is probably there. If you can't find it, search in the other data and code sections.

If you really can't find it, then the executable may be encrypted. But since you wrote it, it's not very likely. =)

[Edit]

In my opinion the most probable possibility is that the string was put in the code section (probably called .text). You should dump it as data, and use a tool such as grep of a hexadecimal editor to search the string.

于 2009-08-03T01:05:21.453 回答
1

对 used once 与 used more often 问题的可能答案是,经常使用的字符串存储在单独的部分中,但 used once 字符串存储在代码中(例如,在无条件跳转/分支指令之后)。为什么用十六进制编辑器看不到字符串是个谜;“加载立即字符串”操作码将是相当不寻常的(它是作为函数参数传递的字符串开头的地址)并且在任何情况下字符串都应该是可见的。不存储在字节边界上的字符串将是非常不寻常的。

建议:创建一个小测试程序,其中几个字符串使用一次,几个字符串多次使用,并使用 (a) objdump (b) 十六进制编辑器查看它。如果您的编译器可以选择显示为每个源代码行生成的汇编代码,请将其打开。对编译器提供的每个优化级别重复上述所有操作。然后使用在真实文件上获得的知识。

请考虑泄露所涉及的机器架构和编译器(这不是国家机密,是吗?)可以更快地为您提供更好的解决方案,并避免您的问题可能被否决;-)

于 2009-08-03T04:34:38.383 回答
0

我刚刚在 gcc 上用 C 语言编译了 hello world,然后在 SciTE 中读取了 exe,我可以看到乱码中的字符串。尝试在十六进制编辑器以外的其他工具中查看 exe。

编辑:我只是尝试更改找到的字符串(在单词中间的字符串中添加字母),但它破坏了 exe。所以,我不知道你将如何更改字符串。

于 2009-08-03T04:43:10.280 回答
0

我跟踪了该程序,发现它将字符串存储在初始化时使用 DEFLATE 的部分中,没有什么容易的:-)

我不知道我用的是什么编译器,我认为它是一个 watcom 编译器。该代码已有 10 多年的历史。

于 2009-08-03T06:00:49.283 回答