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

需要帮助解释混淆的C代码?,第1张

概述这段代码片段让我抓狂,有人可以帮我解释一下吗? #include <stdio.h>char*_="XxTIHRCXCxTIHRXRCxTIHXHRCxTIXIHRCxTXTIHRCxXxTIHRCX";int main(int l){for(l+=7;l!=putchar(010);++l);if(*(++_))main (*_!=88?(putchar(*_^073)|putcha 这段代码片段让我抓狂,有人可以帮我解释一下吗?
#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!”.

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

总结

以上是内存溢出为你收集整理的需要帮助解释混淆的C代码?全部内容,希望文章能够帮你解决需要帮助解释混淆的C代码?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存