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

时间:2010-02-16 14:37:24

标签: c obfuscation decompiler

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

13 个答案:

答案 0 :(得分:35)

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

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

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

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

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

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

答案 1 :(得分:13)

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

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

艰难的方式:编写自己的包装工具。

哦,我忘记了:

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

答案 2 :(得分:5)

完全优化编译。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

让它变得更难?当然。请不要这样做。

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

答案 5 :(得分:2)

我认为如果你谈论已编译的二进制文件,那么你可以做的事情并不多,(可能只适用于UPX或相关工具),因为它可以被颠倒过来,所以没有太大的意义。

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

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:2)

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

  • 使用除UPX以外的打包器(UPX安装在许多Linux发行版中)。性能成本很低,大多数人没有手动解压二进制文件以进行静态分析的技能。但对于经验丰富的逆转器,拆包的成本并不重要
  • 查看Tigress,这是一款多样化的虚拟化器/混淆器,具有丰富的C源到源混淆功能。为了获得更好的性能,依靠支持转换,控制流展平,函数合并/拆分,文字编码
  • 如果您想获得更好的保护,请查看Tigress的主要转型:虚拟化,JITing等,但我相当确定这些转换成本更高,如果您使用这些产品,您的用户可能会发现速度变慢变换。
巴拉克等人关于黑盒混淆不可能的开创性工作不要气馁。他只证明了黑盒混淆器的不可能性,而不是许多实际和有价值的混淆的不可能性。 (黑匣子混淆是该计划的内部运作是完全无法理解的)也不要被海盗劝阻。总而言之,如果产品好的话,那么他们就会购买你的产品。

答案 8 :(得分:1)

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

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

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

击败的秘诀是遵循以下原则 - 经常发布 ,经常发布 ,在经常发布时进行改进,这样最新和最好的功能将是更新,然后是一个饼干拆解和锻炼所需的时间!看看linux源代码,补丁进来,然后它就会被释放......如果你记住这个原则,通过以更快的速度发布具有更多功能的新版本,那么你就赢了!

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

为这里的答案提供一些理论支持:2001年Barak et. al.证明程序混淆是impossible in general