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

前端之家收集整理的这篇文章主要介绍了需要帮助解释混淆的C代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这段代码片段让我抓狂,有人可以帮我解释一下吗?
#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);}

谢谢,
陈阮

@H_403_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;
}

现在让我们理解它:

>它的参数l(如果运行没有参数的程序,它将为1)增加7(变为8)
>循环将打印010(八进制8:ascii退格)直到l == 8(因此当你运行程序时它不会做任何事情
>如果_(现在是x)指向的下一个字符不同于0(这可能意味着“直到我们到达_的末尾”),调用main,但让我们看看在评估其参数时会发生什么:

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

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

>第一个是:* _ ^ 073,就是它,120 ^ 59(因为x是120,在ascii中,而八进制中的073是十进制中的59),这是67:120(0b1000011)XOR 59(0b111011)= 67 0b1000011
>第二个是33(!)

然后,主参数将是(67 | 33)& 1的结果,即1

如果你真的想了解细节中发生的事情你将不得不继续这项工作,但你将能够看到运行程序会发生什么(也许在某个地方放一个usleep(10000),这样你就可以实际看到输出).它会写一个反复的字符串“Corsix!”.

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

@H_403_7@ @H_403_7@

猜你在找的C&C++相关文章