【问题标题】:How does one obfuscate code in C? [closed]如何在 C 中混淆代码? [关闭]
【发布时间】:2013-10-01 07:08:17
【问题描述】:

我想混淆代码只是为了好玩。我正在查看来自国际混淆 c 竞赛的代码:http://www.ioccc.org/ 我真的不知道如何开始对其中一些代码进行逆向工程以使其有意义。

有哪些常见的混淆技术以及如何理解混淆代码?

【问题讨论】:

  • 您是在问如何混淆代码(您标题中的问题),还是如何理解混淆代码(您问题的主体)?
  • 理解混淆代码的第一步是添加空格。那么你可能应该了解digraphs and trigraphs。然后你只需要处理代码。至于怎么混淆,大概每个人都有自己的技巧。
  • @Keith Thompson Both.. 我问“常见的混淆技术是什么”以及理解混淆代码。我想如果我能理解如何去混淆代码,那么这将有助于我理解如何混淆它。
  • @Dukeling 非常有趣。感谢您的链接 - 我以前从未听说过这样的事情
  • 最好的方法(以及赢得这些比赛的各种东西)是想出一些巧妙的新方法来混淆你的代码。使用预处理器(#define 和 trigraphs)已经很老了。如果你想要质量混淆,预处理后它应该仍然很奇怪。诸如构建自己的堆栈、将浮点数作为字节操作以及利用标准的奇怪边缘情况等都是很好的竞争者。

标签: c obfuscation


【解决方案1】:

有很多不同的技术可以混淆代码,这里有一个很小的、非常不完整的列表:

  1. 标识符损坏。您会发现人们只使用 a、b、c 之类的名称,或者您会发现与变量/函数的实际用途完全无关的标识符。去混淆是分配合理的名称。

  2. 大量使用条件评估运算符? :,替换所有出现的if() else。在大多数难以阅读的情况下,反混淆会重新插入if()。

  3. 大量使用逗号运算符而不是 ;。结合2.和4.,这基本上可以让整个程序成为main()中的一条语句。

  4. main() 的递归调用。您可以将 any 函数折叠到 main 中,方法是使用 main 可以用来决定做什么的参数。将此与通过递归替换循环结合起来,您最终会得到整个程序的主要功能。

  5. 您可以与 3. 和 4. 完全相反,通过创建大量几乎什么都不做的函数将所有内容分解成碎片。

  6. 您可以通过将值存储在堆栈上来混淆数组的存储。如果您需要两次遍历数据,随时可以使用 fork() 调用方便地复制您的堆栈。

正如我所说,这是一个非常不完整的列表,但通常,混淆通常是对任何有效编程技术的严重系统性滥用。如果 IOCCC 允许 C++ 条目,我会打赌 大量 模板代码进入,大量使用抛出异常作为 if 替换,隐藏多态背后的结构等。

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 2013-06-09
    • 2011-11-21
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多