保护可执行文件免受逆向工程?

新手上路,请多包涵

我一直在考虑如何保护我的 C/C++ 代码免受反汇编和逆向工程的影响。通常我自己不会在我的代码中宽恕这种行为。但是,为了各种人的安全,我一直在研究的当前协议不能被检查或理解。

现在这对我来说是一个新主题,互联网在 预防逆向工程方面 并没有真正的足智多谋,而是描述了大量关于 如何逆向工程 的信息

到目前为止,我想到的一些事情是:

  • 代码注入(在实际函数调用之前和之后调用虚拟函数)
  • 代码混淆(破坏二进制文件的反汇编)
  • 编写我自己的启动例程(调试器更难绑定)
   void startup();
  int _start()
  {
      startup( );
      exit   (0)
  }
  void startup()
  {
      /* code here */
  }

  • 运行时检查调试器(如果检测到则强制退出)

  • 功能蹦床

   void trampoline(void (*fnptr)(), bool ping = false)
   {
     if(ping)
       fnptr();
     else
       trampoline(fnptr, true);
   }

  • 无意义的分配和释放(堆栈变化很大)

  • 毫无意义的虚拟呼叫和蹦床(反汇编输出中的大量跳跃)

  • 吨铸件(用于混淆拆卸)

我的意思是这些是我想到的一些事情,但它们都可以在正确的时间范围内由代码分析师解决和/或弄清楚。我还有其他选择吗?

原文由 graphitemaster 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

琥珀说的完全正确。你可以让逆向工程变得更难,但你永远无法阻止它。您永远不应该相信 依赖于防止逆向工程的“安全性”

也就是说,我见过的最好的反逆向工程技术并不专注于混淆代码,而是打破人们通常用来理解代码如何工作的工具。找到破解反汇编程序、调试程序等的创造性方法可能比仅仅生成大量可怕的意大利面条代码更有效,也更能满足智力。这对阻止一个坚定的攻击者没有任何帮助,但它确实增加了 J Random Cracker 走神并转而从事更容易的事情的可能性。

原文由 Stephen Canon 发布,翻译遵循 CC BY-SA 3.0 许可协议

传统的逆向工程技术依赖于智能代理使用反汇编程序回答有关代码问题的能力。如果你想要强大的安全性,你必须做一些可以证明阻止代理得到这样的答案的事情。

您可以依靠通常无法解决的停止程序(“程序 X 是否停止?”)来做到这一点。将难以推理的程序添加到您的程序中,会使您的程序难以推理。构建这样的程序比拆散它们更容易。您还可以将代码添加到推理难度不同的程序中;一个很好的候选者是关于别名(“指针”)的推理程序。

Collberg 等人有一篇论文(“Manufacturing Cheap, Resilient and Stealthy Opaque Constructs”)讨论了这些主题,并定义了各种“不透明”谓词,这些谓词会使代码推理变得非常困难:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.39.1946&rep=rep1&type=pdf

我还没有看到 Collberg 的具体方法应用于生产代码,尤其是 C 或 C++ 源代码。

DashO Java 混淆器似乎使用了类似的想法。 http://www.cs.arizona.edu/~collberg/Teaching/620/2008/Assignments/tools/DashO/

原文由 Ira Baxter 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题