【问题标题】:Application Reverse Engineering Protection / Hardening应用逆向工程保护/硬化
【发布时间】:2011-03-10 02:07:45
【问题描述】:

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

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

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

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

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

提前感谢您的帮助。

【问题讨论】:

  • 你在保护什么,从谁那里得到保护?

标签: security visual-c++ reverse-engineering code-access-security


【解决方案1】:

恐怕没那么容易。

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

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


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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      最常见的方法就是使用打包器。这是在许多恶意软件以及一些商业软件中完成的。有像 upx 这样的标准打包程序来执行此后期编译,但任何逆向工程师都可以轻松解决这个问题。

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 这并不能真正保护它。此类保护方案已通过简单地在解密时捞出代码并重建解密版本来破解。如果部分代码是在加密狗本身上执行的,那将是另一种情况。经验法则:如果它在我的 CPU 上运行,我可以窃取它。
        • @Cyber​​Shadow:一般来说你是对的,但它可能很难在经济上合理。有一些对策,我已经提到过:永远不要一次解密整个二进制文件。对可执行文件的不同部分使用多个密钥。对抗已知的调试器。 ...
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2018-05-24
          • 2017-09-21
          • 2021-02-08
          • 1970-01-01
          • 1970-01-01
          • 2020-05-02
          • 2017-05-28
          • 2019-10-11
          • 2016-03-08
          相关资源
          最近更新 更多