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