C# 如何安全地对exe文件进行十六进制编辑?

C# 如何安全地对exe文件进行十六进制编辑?,c#,winforms,C#,Winforms,我正在做一个小拼图/战争游戏,它涉及到用C#对Windows窗体进行编码 要达到某个级别,我需要一个存储在exe中的密码。同一个exe允许我将该密码发送给存储在变量中的默认人员。密码发送是通过更新MySQL数据库中给定用户的数据来完成的 挑战在于用户应该对exe进行十六进制编辑,并将默认收件人更改为用户所需的用户名。但是,当我编辑文件并输入所需用户名并尝试运行它时,显示了一个错误“x.exe不是有效的win32应用程序”” 是否有一种方法可以安全地对文件进行十六进制编辑而不会遇到此错误。或者有没

我正在做一个小拼图/战争游戏,它涉及到用C#对Windows窗体进行编码

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

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


是否有一种方法可以安全地对文件进行十六进制编辑而不会遇到此错误。或者有没有办法修改源代码,以便使用十六进制编辑器只安全地编辑一个变量

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


您还可以仅对.NET程序集使用
ildasm
,来反汇编EXE,编辑IL,然后使用
ilasm
重新组装并运行它。这将消除编辑PE映像的需要,并且更加安全。

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

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


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

当我在做类似的事情时,我记得我必须用相同长度的字符串替换变量才能正常工作。e、 g.“someone@example.com“可以替换为”another@example.net“或”myname@anexample.us". 如果您使用的是Gmail,这会更容易,因为“mynameis@gmail.com“我的名字是……+斯利姆。shady@gmail.com“


不过,我认为@David Stratton的想法可能与exe的想法更相关。我确信我编辑的文件只是数据文件(这是很久以前的事了),但是我知道只要我没有添加或删除文件中间的任何字节,所有的东西都能工作。

< P>在EXE/DLL文件中修改字符串时,重要的是要编辑的字符串的长度保持不变,例如,如果我改变了。“Hello User”到“Welcome User”,我们使堆栈溢出了2个字节

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

TLDR


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

为什么不将数据存储在其他地方,例如在配置文件中?您可以随时制作自己的“培训师”,并在应用程序加载到内存中时,劫持该内存存储并更改它(尽管这非常不稳定).你希望你的用户将二进制文件作为一项功能进行编辑?@chibacity这听起来像是某种黑客练习/谜语。我不认为他在编写程序。是的,我可以将其存储在配置文件中…不知道我怎么从来没有想到过这一点。用户只是在学习基本的反汇编知识,所以不得不想出一个简单的想法。.但这比我想象的要复杂..哇..我曾经用一些教程来编辑游戏文件,但从没想过会这么复杂..我要经历一整晚..谢谢你.是的,我试过这个.但它仍然显示出同样的错误..认为它会起作用..是的,这是一个简单的比赛。