混淆基于C的二进制文件以避免反编译

有没有办法混淆基于C的可执行文件或库来防止反编译?

不。你可以让反编译变得更加困难 ,但是你无法阻止它。 我的建议是不要浪费你的时间,而是集中精力提供具有不断改进function的梦幻产品。

然后人们愿意为此付出代价。

您的主要问题是使代码无法解密的唯一方法是使其无法运行。 任何可以加载到PC中的东西都可以破解。 那些为了娱乐,利润或名望而进行逆向工程的人通常都非常擅长这一点,而且你所做的任何尝试和阻止他们的工作都不会分开。

他们可以访问工具,使得解密代码的工作比模糊处理工作容易得多:-)更好地说服全世界你的软件值得购买,并将盗版视为可能转换的机会“小偷”给真正的用户。

例如,找出他们为什么不为您的软件付费并尝试解决这个问题。 你永远不会转换100%的人,有些人只是为了它的乐趣而盗用你的代码。

查看关于CwF + RtB的techdirt上运行的一系列文章(与粉丝联系以及购买理由)。 我发现那里提出的许多要点都适用于软件行业。

简单的方法 :购买打包机/加密/混淆产品。 有些是昂贵的,在游戏中使用,有些则不然。 谷歌为他们提供“复制保护”等流行语。

快速方式 :使用UPX打包,然后在某处修改标题,以便它仍然可以加载到内存中并运行正常,但upx实用程序将失败并出现错误(尝试版本字段)。 如果upx实用程序失败,95%将放弃。

困难的方法 :写自己的包装工。

哦,我忘记了:

真正简单的方法 :按原样发货。 没有 – 无论你做什么,人们仍然可以对你的代码进行逆向工程。 你投入的努力量限制了可以扭转它的数量。

编译完全优化。

“混淆的可执行文件”毫无意义。 硬件必须能够“理解”能够执行它的代码,并且硬件可以理解它,逆向工程人类可以理解它。 你能做的最多就是让它理解起来更加乏味,但可能不是很多,而且要付出代价。

为了让它更难? 当然。 请不要那样做。

为了防止它? 不会。任何要运行二进制文件的系统都需要软件来解密您提出的任何方案。 他们将能够反编译,然后看看你的模糊二进制文件是如何被解释的。

我想如果你谈论编译的二进制文件,你可以做的事情并不多,(可能只应用UPX或相关的工具),因为它可以被颠倒,所以它没有那么多。

如果您谈论编写新代码,请尝试Self Modyfing C Code ,这可能是重新设计应用程序的最难方法。

使用优化编译器编译C代码使得无法恢复原始源代码或任何甚至远程类似的代码。 它比目前流行的任何Java或.NET混淆器都安全得多。 如果要将可执行文件缩小并在发布之前隐藏任何符号名称,请务必删除它。 但是,请注意,这也使调试( 应用程序崩溃时)几乎不可能。

即便如此,如果有人真的想破解你的软件,他会在汇编级别上这样做,可能使用加载器软件或其他技巧 – 无论你试图阻止他做什么。 许多公司都尝试过,但都没有成功。 使用这样的黑客只会让最终用户感到沮丧,因为它们可能会使应用程序崩溃甚至导致Windows的内置调试程序崩溃。

当你应该改进程序时,不要浪费时间考虑混淆。

如果从中获得商业收益,为什么要混淆代码呢? 说实话,假设商业代码已经足够优化并且模糊不清,并且有效,然后发生了一件令人尴尬的事情的母亲 – 一个小故障……你被卡住了,因为生产二进制代码被混淆了,这使得它变得更难调试毛刺发生的地方很难复制,它将永远停留在BUGS列表中……

例如,试图找到堆栈跟踪,你最终会失去更多的头发,然后试图找出解组的代码来解决WTF正在那里发生,无休止的意大利面条循环。 总之,不要!

你最终会在尝试调试故障时亏本…要么你必须成为一个出色的汇编专家来读取内存转储并从混淆的代码中解决它…不要把它扔掉,只是让你漂亮的产品工作并销售……当然,有很多人有时间通过​​逆向工程代码来打破它……

打败这个原则的秘诀是 – 经常发布,经常发布,经常发布时进行改进,这样最新和最好的function将更新,然后是破解者拆解它所需的时间锻炼身体! 看一下linux源代码,补丁进来,然后它就会被释放……如果你记住这个原则,通过以更快的速度发布更多function的新版本,那么你就赢了!

反编译( No More Gotos )以及混淆实践( Flowtables )和理论( Indistinguisbility Obfuscation)都是活跃的研究领域,因此没有解决方案 – 只有工具,技术和专业知识。 如果您真的希望您的代码不受转换影响,请创建一个Web应用程序,并将敏感代码服务器放在一边。 但是如果你坚持给某人提供二进制文件的模式,那么你必须明智地判断你想要在安全性和性能之间做出的权衡。 混淆是有代价的,但仍然是完美的。 一些选择

  • 使用除UPX以外的打包器(UPX安装在许多Linux发行版中)。 性能成本很低,大多数人没有手动解包二进制文件以进行静态分析的技能。 但对于经验丰富的逆转器,拆包的成本并不重要
  • 查看Tigress,这是一个多样化的虚拟化器/混淆器,具有丰富的C源到源混淆function。 为了获得更好的性能,依靠支持转换,控制流平坦化,函数合并/拆分,文字编码
  • 如果你想要更好的保护,请查看Tigress的主要转变:虚拟化,JITing等,但我相当确定这些转换成本更高,如果你使用这些转换,你的用户可能会注意到速度变慢。

巴拉克等人关于黑盒混淆不可能的开创性工作不要气馁。 他只certificate了黑盒混淆器的不可能性,而不是许多实际和有价值的混淆的不可能性。 (黑匣子混淆是程序的内部运作是完全无法理解的)也不要被海盗劝阻。 如果产品好的话,总会有人把它作为购买产品的重点。

使事情稍微困难的一种方法是打包它们。 UPX将打包你的二进制文件,这使得开箱即用的反编译变得更加困难。 从技术上讲,它可以解压缩然后反编译,但它会提高一点。 假设你在一个vanilla用户操作系统上运行,你可以做很多事情来防止反编译而不使用讨厌的技巧。

如果你真的想混淆它,你需要一个单独的程序来做到这一点。 作为开发人员,您可以用最干净,最易读的forms编写代码。 在编译后,您运行单独的应用程序来进行模糊处理。 您可以以约10万美元的价格购买此类应用程序。

如果你的目的是阻止代码被反向设计,那可能会起作用。 如果你的目的是阻止某人破解安全性,那么单独的混淆不会阻止一个坚定的攻击者。 在某些时候,有一个是/否的决定,他们不需要理解代码来找到它,也不需要绕过它。

修改了Tiny C编译器以生成混淆代码: http : //blogs.conus.info/node/58

为这里的答案提供一些理论支持:2001年Barak等。 人。 事实certificate,程序混淆是不可能的 。