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

标签 c deobfuscation

<分区>

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

main(O){10<putchar(4^--O?77-(15&5128>>4*O):10)&&main(2+O);}

输出:

EMIL

您可以在 Ideone 上进行测试.我在 unwind 上找到了这条线的个人资料。

最佳答案

去混淆可以在逐步的基础上轻松完成。

空白总是有帮助的:

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/

相关文章:

c++ - Apple 只允许 Objective-C 吗?

c - 如何在结构中存储多数据值并使用它们?

javascript - 编码的 JavaScript : How to decode?

javascript - 如何使用 "[][filter][constructor]..."反混淆 javascript 代码?

c - C 中的 LinkedList 元素交换问题

c++ - 相当于 LocalAlloc(LMEM_ZEROINIT, size) 的 Posix

c - 暂停执行 C 代码的 exe

java - 如何混淆 11 个字符的字符串?

javascript - 帮助反混淆此 JS 攻击

javascript - 这段 JavaScript 代码对 MD5 哈希值做了什么?