假设您的应用中有一些带有硬编码字符串的代码。
If somevalue = "test123" Then
End If
编译应用程序后,是否有人可以修改 .exe 文件并将“test123”更改为其他内容?如果是这样,它是否仅在字符串包含相同数量的字符时才有效?
假设您的应用中有一些带有硬编码字符串的代码。
If somevalue = "test123" Then
End If
编译应用程序后,是否有人可以修改 .exe 文件并将“test123”更改为其他内容?如果是这样,它是否仅在字符串包含相同数量的字符时才有效?
通过在任何十六进制编辑器中打开它们,可以很容易地在编译的可执行文件中找到没有任何混淆技术的硬编码字符串。找到后,可以通过 2 种方式替换字符串:
如果以下情况适用于您的情况,这是修改可执行二进制文件中硬编码字符串的一种非常快速的方法。
length(new-string) <= length(old-string)
仅当新字符串等于或短于旧字符串时,这是一个可行的选项。使用十六进制编辑器查找旧字符串的出现并将其替换为新字符串。NULL
用ie填充一个额外的空间0x00
例如old-long-string
在二进制
被修改为较短new-string
并用空字符填充到与二进制可执行文件中的原始字符串相同的长度
请注意,任何代码都会检测到对可执行文件的此类修改,该代码会根据原始二进制可执行文件的预计算校验和验证二进制文件的校验和。
将二进制文件反编译为本机代码打开了修改任何字符串(甚至代码)并重建它以获得新的二进制可执行文件的可能性。
有几十个这样的反编译工具可以反编译vb.net
(通常是 Visual Studio.net)。可以在此处找到最流行的(ILspy、JustDecompile、DotPeek、.NET Reflector 等)的详细比较。
确实存在即使更困难的方法也不会成功的情况。当原始开发人员使用混淆技术来防止字符串在可执行二进制文件中被检测和修改时,就会出现这种情况。一种这样的混淆技术是存储加密字符串。
这是可能的,但不一定是直截了当的。例如,如果您的字符串加载到内存中,有人可以使用内存管理器工具直接修改字符串地址的值。
或者,他们可以反编译您的应用程序,更改字符串,然后重新编译它以使用新字符串创建一个新程序集。但是,这是否可能发生取决于您的应用程序以及更改该字符串的重要性。
您可以使用混淆器使其更难做,但最终,一个坚定的破解者将能够做到这一点。问题是该字符串是否重要到需要担心,如果是这样,也许可以考虑另一种方法,例如使用 Web 服务来提供字符串。