C语言代码混淆教程

9
我对人们混淆他们的代码(主要是C语言)的方式感到着迷(这里有一些例子:http://ioccc.org/),我想学习相应的技巧。我听说过一本名为“Obfuscated C and other Mysteries”的书,但我找不到这本书。 是否有任何教程或书籍可以提供关于这个主题的提示? 谢谢。

我认为这并不存在通用技巧...必须得有创意。 - user529758
1
codegolf上有很多混淆的内容。 - luser droog
2个回答

28
最好的方法是阅读IOCCC程序作者的评论。他们会描述如何使代码模糊不清。以下是一些指针:

短而无意义的标识符

因为a = aaa * aa;总是比result = value * factor;更加模糊。
为了拥有短的标识符,混淆器倾向于使用#define定义许多东西。

反转数组索引

你只需记住var [3]3 [var]是等效的。

双字母符和三字母符

if(a< <:b+aa??))??<f();%> 应该比以下内容更难读取: if (a < (b+aa)) { f(); }

类似的字符

有时,很难分辨出l1Io0O.例如,如果你写10l,我敢打赌每个人都会读成101

编码样式指南

一般来说,尽量找到好的编码指南,并尝试违反所有规则。你可以在网上找到这些文件,它们可能会比大部分东西都更有帮助,并且不需要购买任何东西。
以下是一些链接:

@MichaelBurr 噢,使用X-macros进行递归文件包含以完全混淆的方式生成一些代码。 - Morwenn
@Morwenn: 不需要像 X-macros 那样沉重 - 通常会在混淆代码条目中看到普通的宏定义。例如,重新定义关键字可能会使阅读程序变得非常痛苦:#define char k['a'] - Michael Burr
@MichaelBurr 但是我已经在我的第二点谈到了“#define”的东西 :) - Morwenn
@Morwenn:我知道了,因为它不是一个“顶层”项目,所以我错过了它。 - Michael Burr
@Morwenn 我知道你提到的主要观点。我正在寻找具体的细节。不管怎样,还是谢谢你。顺便说一句,链接很好。 :) - Chandra

7

Morwenn的回答很好地涵盖了语法混淆。但还有另一层面,那就是语义混淆。考虑经常提到的图灵机与任何其他编程语言具有相同的计算能力(忽略输入和输出方面的考虑)。事实上,所有各种计算模型都有等效能力的姊妹模型。

例如,一个字符串char s[N]可以被视为从索引到字符的映射,因此任何字符串都可以通过一个函数来表示,该函数在调用指定索引char f(int i)时始终返回适当的字符。现在阅读这篇文章。疯狂吧?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接