c - 这段经过混淆的 C 代码声称可以在没有 main() 的情况下运行,但它到底做了什么?

标签 c c-preprocessor obfuscation

#include <stdio.h>
#define decode(s,t,u,m,p,e,d) m##s##u##t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
    printf("Ha HA see how it is?? ");
}

这是否间接调用了 main?怎么办?

最佳答案

C 语言将执行环境定义为两类:独立托管。在这两个执行环境中,一个函数被环境调用以启动程序。
独立 环境中,程序启动函数可以实现定义,而在托管 环境中,它应该是main。在定义的环境中,如果没有程序启动功能,C 中的任何程序都不能运行。

在您的例子中,main 被预处理器定义隐藏了。 begin() 将扩展为 decode(a,n,i,m,a,t,e) 进一步扩展为 main .

int begin() -> int decode(a,n,i,m,a,t,e)() -> int m##a##i##n() -> int main() 

decode(s,t,u,m,p,e,d) 是一个有 7 个参数的参数化宏。此宏的替换列表是 m##s##u##tm、s、ut 是第 4、第 1st、第 3rd 和替换列表中使用的第 2 个nd 参数。

s, t, u, m, p, e, d
1  2  3  4  5  6  7

其余的没有用(只是为了混淆)。传递给 decode 的参数是 "a,n,i,m,a ,t,e"因此,标识符 m、s、ut 被替换为参数 m、a、i n,分别。

 m --> m  
 s --> a 
 u --> i 
 t --> n

关于c - 这段经过混淆的 C 代码声称可以在没有 main() 的情况下运行,但它到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449358/

相关文章:

c++ - C中的实时低通滤波器

c++ - 如何在C编程中打开没有名称冲突的嵌套结构?

c - 在宏中传递参数评估方向

JavaScript 编码

.net - 是否可以将 dll 转换为源代码?

用于计算一堆定义的最大数量的 C 宏

c - 如何使用 C 中的函数查找给定字符的 ASCII 码?

Java - C-Like Fork?

c - -U 的用例

c# - 使用 Confuser 混淆 C# 代码不适用于语言资源文件 (DLL)