如何安全地十六进制编辑exe文件?

时间:2011-07-27 15:31:24

标签: c# winforms

我正在开发一个小型拼图/战争游戏,其中涉及使用C#编码 Windows窗体 ..

要达到某个级别,我需要一个存储在exe中的密码。相同的exe允许我将该密码发送给存储在变量中的默认人员。密码发送是通过在MySQL数据库中更新给定用户的数据来完成的。

挑战在于用户应该十六进制编辑exe并将默认收件人更改为用户所需的用户名。但是当我十六进制编辑文件并输入所需的用户名并尝试运行它时,它显示错误“ x.exe不是有效的win32应用程序”.. < / p>

有没有办法安全地十六进制编辑文件而不会遇到此错误。或者有没有办法修改源代码,这样就可以使用十六进制编辑器安全地编辑一个变量..

4 个答案:

答案 0 :(得分:2)

以十六进制编辑PE图像将很困难,因为如果更改部分的长度需要更新PE图像的各个部分,或者如果EXE已签名,则也会使其无效。如果您想了解需要更新的所有字段,可以找到PE图像规范here。如果你想要一个漂亮的UI,我会使用类似CFF Explorer的东西来正确编辑PE图像。

您也可以使用ildasm(仅适用于.NET程序集)来反汇编EXE,编辑IL,然后使用ilasm重新组装并运行它。这样就不需要编辑PE图像并且更安全。

答案 1 :(得分:0)

假设这不是对可执行文件的非法更改......(这听起来像是竞赛中的挑战,就是你的措辞。)

您的更改很可能导致程序无法再验证checksum。如果您希望成功更改exe,则需要重新计算校验和。 (这只是解释为什么exe被破坏的一种可能的解释。)

改变已编译的可执行文件并使其正常工作至少可以说是棘手的。这是一个非常高级的主题,不太可能在这里完全回答。

答案 2 :(得分:0)

在我记得之前我做了类似的事情时,我必须用相同长度的字符串替换变量才能正常工作。例如“someone@example.com”可以替换为“another@example.net”或“myname@anexample.us”。如果你使用的是Gmail,那会更容易,因为“mynameis@gmail.com”is the same as“my.name.is ... + slim.shady@gmail.com”。

尽管如此,我认为@David Stratton的想法可能与exe有关。我很确定我编辑的文件只是数据文件(很久以前),但我知道只要我没有添加或删除文件中间的任何字节,一切都有效。 / p>

答案 3 :(得分:0)

在修改EXE / DLL文件中的字符串时,重要的是要保持字符串的长度相同,例如,如果我将“ Hello User”更改为“ Welcome User”,我们将堆栈溢出2个字节

这显然会导致错误。为了成功完成编辑,重要的是,放置的修改后的字符串不会溢出您要插入的字符串。

TLDR;

如果您要编辑的字符串长12个字符,则总共只能更改12个字符。