<分区>
你能解释一下下面的代码是如何工作的吗?
main(O){10<putchar(4^--O?77-(15&5128>>4*O):10)&&main(2+O);}
输出:
EMIL
标签 c deobfuscation
<分区>
你能解释一下下面的代码是如何工作的吗?
main(O){10<putchar(4^--O?77-(15&5128>>4*O):10)&&main(2+O);}
输出:
EMIL
最佳答案
去混淆可以在逐步的基础上轻松完成。
空白总是有帮助的:
main(O)
{
10 < putchar(4 ^ --O ? 77 - (15 & 5128 >> 4 * O)
: 10)
&& main(2+O);
}
添加一个变量:
main(O)
{
int i = 4 ^ --O ? 77 - (15 & 5128 >> 4 * O)
: 10;
i = putchar(i);
10 < i && main(2+O);
}
将 ?:
替换为 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);
}
将 &&
替换为 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);
}
为清楚起见,括号:
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);
}
从这里开始,这是一个应用运算符基本 C 知识的简单案例。
运行代码:(main
初始参数为1,we can check this)
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)
...
写它的人是怎么想出来的?好吧,据我所知,当涉及到混淆代码时,这主要是一个谜。
关于c - 这个混淆的 C 行如何打印 "EMIL"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124485/