可以更改已编译的exe中的硬编码字符串吗?

时间:2013-08-03 11:38:51

标签: vb.net

假设您的应用中有一些带有硬编码字符串的代码。

If somevalue = "test123" Then

End If

编译应用程序后,是否有人可以修改.exe文件并将“test123”更改为其他内容?如果是这样,只有当字符串包含相同数量的字符时它才会起作用吗?

2 个答案:

答案 0 :(得分:1)

这是可能的,但不一定是直截了当的。例如,如果您的字符串已加载到内存中,则有人可以使用内存管理器工具直接修改字符串地址的值。

或者,他们可以反编译您的应用程序,更改字符串,然后重新编译它以使用新字符串创建新程序集。但是,这是否可能发生取决于您的应用程序以及更改该字符串的重要性。

你可以使用混淆器来使它更难做,但最终,一个坚定的破解者能够做到这一点。问题是该字符串是否足够重要,如果是这样,可能会考虑另一种方法,例如使用Web服务来提供字符串。

答案 1 :(得分:1)

通过在任何HEX编辑器中打开它们,可以在编译的可执行文件中轻松找到没有任何混淆技术的硬编码字符串。找到后,可以通过两种方式替换字符串:

1。简单方法(*条件适用)

如果您的情况适用以下条件,这是一种非常快速的方法来修改可执行二进制文件中的硬编码字符串。

  • length(new-string) <= length(old-string)
  • 代码中没有逻辑用于检查使用CRC的可执行修改。

仅当新字符串等于或短于旧字符串时,这是一个可行的选项。使用十六进制编辑器查找旧字符串的出现次数并将其替换为新字符串。用NULL填充额外的空格,即0x00

例如二进制文件中的old-long-string old long string in a hex-editor

被修改为更短的new-string并用空字符填充到与二进制可执行文件中的原始字符串相同的长度 enter image description here

请注意,对可执行文件的此类修改由任何代码检测,该代码根据原始二进制可执行文件的预计算校验和来验证二进制文件的校验和。

2。更难的方式(几乎适用于所有情况)

将二进制文件反编译为本机代码可以修改任何字符串(甚至代码)并重建它以获取新的二进制可执行文件。

有很多这样的解编译工具可以反编译 vb.net (一般来说是Visual Studio.net)。可以找到最受欢迎的(ILspy,JustDecompile,DotPeek,.NET Reflector等)的详细比较 here

有些情况下,即使是更难的方式也不会成功。当原始开发人员使用混淆技术来防止在可执行二进制文件中检测和修改字符串时就是这种情况。一种这样的混淆技术是 storing encrypted strings