3

我想保护我的应用程序免受逆向工程。

我想做的是保护可执行文件免受任何篡改,例如十六进制编辑器、资源编辑器和反汇编篡改。

我的想法是让应用程序根据来自服务服务器的版本文件(可能是 xml 文件或平面文件)中的导入值检查自身的哈希值,然后关闭应用程序或以某种方式完全禁用它的功能,如果值不匹配。

我在这里处于陌生的水域,所以如果有人有任何意见、建议、想法或代码示例,我将不胜感激。

开发语言是 C++,但我很乐意从任何语言中举例。

提前感谢您的任何帮助。

4

5 回答 5

4

恐怕没那么容易。

如果有人有能力修改可执行文件,那么他们就有能力删除应用程序针对已知哈希所做的任何检查。

您可以做更复杂的事情,例如使用已知可执行文件的哈希作为密钥来加密应用程序的数据,但这只会使规避变得更加困难。


几十年来,各种非常昂贵的软件的制造商一直在努力想出一个解决方案——而他们的努力一直是由资源少得多的人来解决的。

于 2010-06-30T11:36:55.223 回答
1

简短的回答是你不能。你可以让它变得更加困难,但最终你的代码必须在处理器上运行,因此可以即时读取、修改或忽略指令。

如果你可以控制硬件,那么你可以让它变得更难,但最终如果人们有足够的决心,他们可以突破你所做的任何事情。

呼吁人们的诚实,这对你来说更容易,而且可能同样有效!

于 2010-06-30T11:49:38.197 回答
1

最常见的方法就是使用打包器。这是在许多恶意软件以及一些商业软件中完成的。有标准的打包器喜欢upx做这个后编译,但任何逆向工程师都会很容易地解决这个问题。

商业软件使用打包程序作为尽力而为的混淆,并通过其压缩功能减小二进制文件的大小。它们也被(主要)原始恶意软件使用。在这里要小心,因为许多 AV 会将您的二进制文件标记为恶意软件,只是为了识别加壳程序和自我修改/混淆代码的存在。

阅读有关恶意软件/病毒反调试和打包程序/加密程序的历史和最新技术,有一些关于此的 Phrack 杂志文章以及病毒/恶意软件研究站点和论坛上的资源。请记住,它们只是减速带。

唯一正确/不可战胜(非减速带)的方法是使用强大的算法(如 AES)加密代码,然后在运行时使用密钥对其进行解密- 但是用户需要一个密钥来运行它。如前所述,预共享密钥/密码或商业流行的加密狗解决方案是最常见的)

编辑:大多数编译后打包程序和加密程序在很大程度上与语言无关

于 2017-04-09T14:53:01.400 回答
0

真正防止您的软件被篡改的唯一解决方案是加密可执行文件并仅解密当前执行的部分 - 并且只有在“受信任的设备”(例如 USB 加密狗)中完成解密的情况下。

有一些产品非常好,例如我雇主的产品。

所有纯软件保护方案都或多或少容易被欺骗。

于 2010-06-30T11:59:27.090 回答
0

尝试对代码进行混淆,这样它会挫败任何试图对其进行逆向工程的人,或者如果有人试图篡改它,它就会自我毁灭!

于 2010-07-02T00:40:50.797 回答