这段代码片段让我抓狂,有人可以帮我解释一下吗?
#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);}
谢谢,
陈阮
解决方法
为了理解此代码的工作原理,请以可读的方式重新编写代码:
#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!”.
编写这样的程序非常简单:一旦你决定你的算法如何工作,很容易生成一个字符串,比如_,这使得算法生成你想要的东西,但是对它进行逆向工程则要困难得多.