我需要在exe中略微更改一个字符串,我没有源代码了。它是在C中写的。
我注意到C字符串文字似乎根本没有出现在机器代码列表中 - 不管是原始ASCII,还不是utf8 / 16/32或类似的东西。它们似乎是编码的,我猜测它是32位操作码的一部分。例如,我知道代码有c行: print(“我的字符串”);通过字节'm''y''''等等但字符串似乎根本没有出现,甚至在任何utf8 / 16/32编码中都没有出现,甚至不是1/2/3/4/5每个字符之间的/ 6/7/8字节(我检查了所有这些组合)。
根据我的理解,文字可以是立即操作码,并且这些可以在非字节排列位置具有8位的ASCII值。有谁知道我应该寻找什么操作码?目前,即使我一点一点地移动整个文件,我仍然找不到任何看起来像字符串的东西。
答案 0 :(得分:3)
怀疑一个简单的print语句会被编译器编码。
我的猜测是以下任何一种:
EXE从其他地方获取字符串。 (另一个文件,另一个dll等......)
你看起来不够难以找到字符串。我假设您使用了一个显示ascii和八进制的十六进制编辑器?
代码的作者不顾一切地阻止你做你想做的事。
你到底想要做什么?
答案 1 :(得分:2)
而不是一点一点地移动整个文件或查看一堆不同的编码,为什么不只是反汇编可执行文件?没有代码,程序不能只做神秘的事情,你可以通过反汇编来阅读代码。如果数据存储在操作码中,则很难改变,但我无法想象为什么编译器会以这种方式存储字符串。
答案 2 :(得分:2)
虽然我不确定为什么你找不到字符串,
我确信更新字符串将是危险且非常困难的工作
答案 3 :(得分:1)
使用Dumpbin(随Visual Studio提供)或objdump(GNU工具,可在任何平台上使用)等工具。
转储名为.rodata和.text的部分的内容;字符串可能就在那里。 如果找不到,请搜索其他数据和代码部分。
如果你真的找不到它,那么可执行文件可能会被加密。 但既然你写了它,它不太可能。 =)
[编辑]
在我看来,最可能的可能性是字符串放在代码部分(可能称为.text)。 您应该将其作为数据转储,并使用十六进制编辑器的grep等工具来搜索字符串。
答案 4 :(得分:1)
使用过的一次与使用更常见的问题的可能答案是更频繁使用的问题存储在单独的部分中,但是使用的一次字符串存储在代码中(例如,在无条件跳转/分支指令之后)。为什么用十六进制编辑器看不到字符串是个谜; “加载立即字符串”操作码将是相当不寻常的(它是作为函数参数传递所需的字符串开头的地址),并且在任何情况下字符串都应该是可见的。不存储在字节边界上的字符串将非常不寻常。
建议:创建一个小的测试程序,其中包含一些使用过的字符串和一些字符串多次使用,并使用(a)objdump(b)十六进制编辑器查看它。如果编译器可以选择显示为每个源代码生成的汇编代码,请将其打开。对编译器提供的每个优化级别重复以上所有操作。然后使用在真实文件中获得的知识。
请考虑泄露涉及的机器架构和编译器(它不是国家机密,是吗?)可以更快地为您提供更好的解决方案,避免可能的问题低估; - )
答案 5 :(得分:0)
我刚刚在gcc上用C语言编译了hello world,然后在SciTE中读取了exe,我可以看到乱码中的字符串。尝试在十六进制编辑器之外的其他内容中查看exe。
编辑:我只是尝试更改我找到的字符串(在一个单词的中间添加字母到字符串),但它打破了exe。所以,我不知道你将如何更改字符串。答案 6 :(得分:0)
我跟踪了程序,发现它将字符串存储在初始化时使用DEFLATE的部分,并不容易: - )
我不知道我使用了什么编译器,我认为它是一个watcom编译器。该代码已超过10年。