你能解释下面的代码是如何工作的吗?
main(O){10<putchar(4^--O?77-(15&5128>>4*O):10)&&main(2+O);}
Run Code Online (Sandbox Code Playgroud)
输出:
EMIL
Run Code Online (Sandbox Code Playgroud)
可以在逐步的基础上轻松地进行反混淆.
白色空间总是有帮助:
main(O)
{
10 < putchar(4 ^ --O ? 77 - (15 & 5128 >> 4 * O)
: 10)
&& main(2+O);
}
Run Code Online (Sandbox Code Playgroud)
添加变量:
main(O)
{
int i = 4 ^ --O ? 77 - (15 & 5128 >> 4 * O)
: 10;
i = putchar(i);
10 < i && main(2+O);
}
Run Code Online (Sandbox Code Playgroud)
替换?:为if-else:
main(O)
{
int i;
if (4 ^ --O)
i = 77 - (15 & 5128 >> 4 * O)
else
i = 10;
i = putchar(i);
10 < i && main(2 + O);
}
Run Code Online (Sandbox Code Playgroud)
替换&&为if:
main(O)
{
int i;
if (4 ^ --O)
i = 77 - (15 & 5128 >> 4 * O)
else
i = 10;
i = putchar(i);
if (10 < i)
main(2 + O);
}
Run Code Online (Sandbox Code Playgroud)
支架清晰度:
main(O)
{
int i;
if (4 ^ --O)
i = 77 - (15 & (5128 >> (4 * O)))
else
i = 10;
i = putchar(i);
if (10 < i)
main(2 + O);
}
Run Code Online (Sandbox Code Playgroud)
从这里开始,应用运算符的基本C知识就是一个简单的例子.
运行代码:(初始参数main为1,我们可以检查一下)
main(1)
4 ^ 0 = 4 = true
5128 >> 4 * 0 = 5128
15 & 5128 = 8
i = 77 - 8 = 69
putchar(69) -> 'E'
10 < 69
call main(2+0)
main(2)
...
Run Code Online (Sandbox Code Playgroud)
是谁写的呢?嗯,据我所知,当谈到混淆代码时,这几乎是个谜.
如果您将代码转换为更好的C,那么它可能如下所示:
int main(int i)
{
int ch;
i--;
if (i ^ 4)
ch = 77 - (15 & (5128 >> (4 * i)));
else
ch = 10;
ch = putchar(ch);
if (ch > 10)
main(i + 2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意:
main() 为每个字符递归调用.putchar() 在成功返回时,字符只是写入控制台.int.i在第一次调用时的值为1(实际上是argc参数).if,变量i在五次迭代中具有值0,1,2,3,4.对于值4,if条件变为false并使用换行符(ASCII 10).77 - (15 & (5128 >> (4 * i)))为字母E,M,I,L生成i值为0,1,2,3 的ASCII代码.