我想混淆代码只是为了好玩。我正在查看来自国际混淆c竞赛的代码:http://www.ioccc.org/我真的不知道如何开始逆向工程这些代码以使任何有意义的东西。
有哪些常见的混淆技术以及如何理解混淆代码?
答案 0 :(得分:7)
有很多不同的技术来混淆代码,这里有一个很小的,非常不完整的列表:
标识符修改。要么您会发现人们使用像a,b,c这样的名称,要么找到与变量/函数的实际目的完全无关的标识符。反混淆将是指定合理的名称。
大量使用条件评估运算符? :
,替换if() else
的所有出现。在大多数情况下,更难以阅读,反混淆会重新插入if()
。
大量使用逗号运算符而不是;
。与2.和4.结合使用,这基本上允许整个程序在main()
中成为一个单一的语句。
main()
的递归调用。您可以通过使用main可以用来决定做什么的参数将任何函数折叠到main中。将此与通过递归替换循环相结合,最终将整个程序作为主要功能。
你可以选择与3.和4完全相反的方向,并通过创建一系列几乎没有任何功能的功能将所有东西分解成碎片。
您可以通过将值存储在堆栈中来混淆数组的存储。如果您需要两次遍历数据,总是可以fork()
调用方便地为您的堆栈制作方便的副本。
正如我所说,这是一个非常不完整的列表,但一般来说,混淆通常是对任何有效编程技术的严重,系统性滥用。如果IOCCC允许C ++条目,我会打赌输入模板代码的很多,大量使用抛出异常作为if替换,隐藏多态性背后的结构等。