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