这个混淆的C行如何打印"EMIL"?

Ada*_*zyk 3 c deobfuscation

你能解释下面的代码是如何工作的吗?

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)

你可以在Ideone上测试它.我在unwind的个人资料中发现了这一行.

Duk*_*ing 7

可以在逐步的基础上轻松地进行反混淆.

白色空间总是有帮助:

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)

是谁写的呢?嗯,据我所知,当谈到混淆代码时,这几乎是个谜.


Cod*_*odo 5

如果您将代码转换为更好的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() 在成功返回时,字符只是写入控制台.
  • 打印换行符(ASCII代码10)是停止递归的条件.
  • 原始代码取决于未声明变量属于类型的旧C规则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代码.