需要帮助解释混淆的C++代码?

Cha*_*han 7 c obfuscation


这段代码片段让我抓狂,有人可以帮我解释一下吗?

#include <stdio.h>
char*_="XxTIHRCXCxTIHRXRCxTIHXHRCxTIXIHRCxTXTIHRCxXxTIHRCX";
int main(int l){for(l+=7;l!=putchar(010);++l);if(*(++_))main
    (*_!=88?(putchar(*_^073)|putchar(33))&1:0xffff2a8b);}
Run Code Online (Sandbox Code Playgroud)

谢谢,
Chan Nguyen

peo*_*oro 7

为了理解此代码的工作原理,请以可读的方式重新编写代码:

#include <stdio.h>

char*_="XxTIHRCXCxTIHRXRCxTIHXHRCxTIXIHRCxTXTIHRCxXxTIHRCX";

int main(int l)
{
    for( l += 7; l != putchar(010); ++l ) {
    }

    if( *(++_) ) {
        main( ( *_ != 88 ) ? ( putchar(*_^073) | putchar(33) )&1 : 0xffff2a8b );
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在让我们理解它:

  • 它的参数l(如果运行没有参数的程序,则为1)增加7(变为8)

  • 循环将打印010(八进制为8:ascii退格)直到l==8(因此在运行程序时它不会执行任何操作

  • 如果_(它x现在)指向的下一个字符不同于0(这可能意味着"直到我们到达"的结尾_),main被调用,但让我们看看在我们评估其参数时会发生什么:

    • 当前指向的字符_与88(88 x在ascii中)不同,因此main的参数将是表达式的结果( putchar(*_^073) | putchar(33) )&1:

      在评估main参数时,将打印两个字符

      • 第一个是:*_^073,就是这样,120^59(因为x是120,在ascii中,并且八进制中的073是十进制的59),这是67:120(0b1000011)XOR 59(0b111011)= 670b1000011

      • 第二个是33(!)

      main参数将是结果(67|33)&1,即1

如果你真的想了解的细节发生了什么,你必须去与这项工作,但你能够看到通过运行程序会发生什么(也许把一个usleep(10000)地方,让你可以看到输出).它会写一个反复的字符串" Corsix!".

编写这样的程序非常简单:一旦你决定你的算法如何工作,很容易生成一个字符串,比如_,使算法生成你想要的东西,但是对它进行逆向工程要困难得多.