【问题标题】:Tutorials for Code Obfuscation in C [closed]C中的代码混淆教程[关闭]
【发布时间】:2013-06-09 11:10:33
【问题描述】:

我对人们混淆他们的代码(主要是 C)的方式很着迷(这里的例子:http://ioccc.org/),并且想学习同样的各种技术。有人告诉我有一本书,“Obfuscated C and other Mysteries”,但我无法得到那本书。 是否有任何教程或书籍提供有关此主题的提示? 谢谢你。

【问题讨论】:

  • 我不认为有一种通用的技术可以用于此...必须要有创意。
  • codegolf 上的很多混淆。

标签: c obfuscation


【解决方案1】:

你能做的最好的就是阅读 IOCCC 上程序作者的 cmets。他们描述了他们如何设法混淆他们的代码。这里有几点建议:

简短而无意义的标识符

因为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:它不需要像 X-macros 那样繁重——你会经常在混淆的代码条目中看到普通的旧宏定义。例如,重新定义关键字会使阅读程序变得相当痛苦:#define char k['a']
  • @MichaelBurr 但我已经在第二点中谈到了#defining 的东西 :)
  • @Morwenn:我明白了。我错过了它,因为它不是“顶级”项目。
  • @Morwenn 我知道你提到的要点。正在寻找细节。不管怎么说,多谢拉。不错的链接,顺便说一句。 :)
【解决方案2】:

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

例如,字符串char s[N] 可以被认为是从索引到字符的映射,因此任何字符串都可以由一个函数来表示,该函数在使用指定索引char f(int i) 调用时总是提供适当的字符。现在阅读this。疯了吧?

【讨论】:

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