我想保护我的应用程序免受逆向工程。
我想要做的是保护可执行文件免受任何篡改,例如使用十六进制编辑器,资源编辑器和拆卸篡改。
我的想法是让应用程序根据服务服务器(可能是xml文件或flatfile)的版本文件中的导入值检查自身的哈希值,然后关闭应用程序或以某种方式完全禁用它的功能,如果值不匹配。
我在这里处于陌生的水域,所以如果有人有任何意见,建议,想法或代码示例,我将不胜感激。
开发语言是C ++,但我很乐意接受任何语言的例子。
提前感谢您的任何帮助。
答案 0 :(得分:4)
我担心这不容易。
如果有人能够修改可执行文件,那么他们就可以删除应用程序对已知哈希值的任何检查。
您可以执行更复杂的操作,例如使用已知可执行文件的哈希作为密钥加密应用程序的数据,但这只会使规避起来更加困难。
各种非常昂贵的软件的制造商几十年来一直试图找到解决方案 - 他们的努力一直由资源少得多的人来解决。
答案 1 :(得分:1)
简短的回答是你不能。您可以使其变得更加困难,但最终您的代码必须在处理器上运行,因此可以即时读取,修改或忽略指令。
如果你可以控制硬件,那么你可以更难,但最终如果人们有足够的决心,他们可以突破你做的任何事情。
呼吁人们的诚实,这对你来说更容易,而且可能同样有效!
答案 2 :(得分:1)
最常见的方法是使用打包器。这是在许多恶意软件以及一些商业软件中完成的。有upx
之类的标准打包程序可以在编译后进行此操作,但任何逆向工程师都可以轻松解决这个问题。
商业软件使用打包程序作为最佳努力混淆,并通过其压缩功能减小二进制文件的大小。它们也被(大多数)原始恶意软件使用。请注意,因为许多AV会将您的二进制文件标记为恶意软件,仅用于识别打包程序和自我修改/混淆代码的存在。
了解恶意软件/病毒反调试和打包器/加密器的历史和最新技术,有一些关于此的Phrack杂志文章和有关病毒/恶意软件研究网站和论坛的资源。只记得他们只是速度颠簸。
执行此操作的唯一正确/不可行(非速度提交)方法是使用强大的算法(如AES)加密代码,然后在运行时使用密钥对其进行解密 - 但是用户需要一个键来运行它。预共享密钥/密码或商业上流行的加密狗解决方案是最常见的,如前所述)
编辑:大多数编译后的打包程序和加密程序在大多数情况下与语言无关
答案 3 :(得分:0)
真正阻止您的软件被篡改的唯一解决方案是加密可执行文件并仅解密当前执行的部分 - 并且仅当解密是在“可信设备”中完成时,例如, USB加密狗。
有一些产品非常好,例如我雇主的产品。
所有纯软件保护方案都可以或多或少地被欺骗。
答案 4 :(得分:0)
尝试对代码进行模糊处理,这样一来,如果有人试图篡改代码,就会让任何试图对其进行逆向工程的人感到沮丧,或者让自己自我毁灭!