国际C语言混乱代码大赛作品分析

 

#include <stdio.h>
main(t,_,a)char *a;{return!0<t?t<3?
main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?
main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

 

 

这段程序的输入(一首诗):http://justjavac.iteye.com/blog/171560

 

怎么样?乍一看蛮吓人的吧?我们今天就分析它啦!可能有人要说,分析这种程序根本没有意义,那我冒昧借用Linus的一句名言“Just for fun”!只当是没事了自我娱乐而已吧!:-)

如果你有一个支持语法高亮的编辑器,立刻可以看到,程序中有一大段字符串,我们知道,被双引号括起来的字符串里的内容是不会解释成代码语句的(转义字符就算了吧),那我们第一步就是把这些字符串提取出来,现在代码看起来是这样的:

#include <stdio.h>
main(t,_,a)
char *a;
{

char * STRA="%s %d %d\n";
char * STRB="@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
char * STRC="%s";
char * STRD="!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";

return

!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a))
:1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,STRA):9:16:t<0?t<-72?main(_,t,STRB)
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,STRC):*a=='/'||main(0,main(-61,*a,STRD),a+1);

}
怎么样?代码是不是一下子清晰了很多?好,我们继续观察:在抽取了字符串后,我们发现程序的实际语句只有一个return(如果觉得不可思议你可以搜索一 下";" C语言一个分号对应一条语句嘛,可以发现,除了字符串中的内容,的确只有一个分号)。然后我们又发现,语句里有很多"?"和":",这是什么?对了,是三 目运算符,而C语言中三目运算符的优先级基本上是最低的(除了赋值和逗号运算符之外,再次搜索代码部分,发现根本没有赋值语句,而逗号运算符只有两个), 我们把'?'':'','当作分隔符,任意两个分隔符直接的内容都用大写字母代替,那么程序可以变成这样:

#include <stdio.h>

#define A !0<t
#define B t<3
#define C main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a))
#define D1 1
#define D2 t<_
#define E main(t+1,_,a)
#define F1 3
#define F2 main(-94,-27+t,a)&&t==2
#define G _<13
#define H main(2,_+1,STRA)
#define I 9
#define J 16
#define K t<0
#define L t<-72
#define M main(_,t,STRB)
#define N t<-50
#define O _==*a
#define P putchar(31[a])
#define Q main(-65,_,a+1)
#define R main((*a=='/')+t,_,a+1)
#define S 0<t
#define T main(2,2,STRC)
#define U *a=='/'||main(0,main(-61,*a,STRD),a+1)

main(t,_,a)
char *a;
{

char * STRA="%s %d %d\n";
char * STRB="@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
char * STRC="%s";
char * STRD="!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";


return
A ? B ? C : D1 , D2 ? E : F1 , F2 ? G ? H : I : J : K ? L ? M : N ? O ? P : Q : R : S ? T : U ;
}

替换的到底正确与否呢?编译,通过,运行,和原来相同!说明替换成功!
下面的重点就是分析A ? B ? C : D1 , D2 ? E : F1 , F2 ? G ? H : I : J : K ? L ? M : N ? O ? P : Q : R : S ? T : U ;这个语句。
我们需要复习一下运算符的优先级和结合性的知识:
不同运算符之间按优先级识别,相同优先级的运算符直接按结合性识别,而"?:"运算符的结合性是从右向左的,那么我们可以模拟编译器读入此语句的方式得到:
A
A ?
A ? B
A ? (B ?
A ? (B ? C
A ? (B ? C :
A ? (B ? C : D1)
A ? (B ? C : D1) ,
A ? (B ? C : D1) , D2
A ? (B ? C : D1) , (D2 :
A ? (B ? C : D1) , (D2 : E
A ? (B ? C : D1) , (D2 : E :
A ? (B ? C : D1) , (D2 : E : F1)
A ? (B ? C : D1) , (D2 : E : F1) ,
A ? (B ? C : D1) , (D2 : E : F1) , F2
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? G
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : K
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? L
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : N)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? O
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R))
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : S)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T : U))
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T : U));
为了便于观察,我们简写出最终识别结果:
return A ? (B?C:D1),(D2?E:F1),(F2?(G?H:I):J)) : (K?(L?M:(N?(O?P:Q):R)):(S?T:U));

现在整个程序除了宏定义,字符串声明,函数头之外就只剩下这一句有效代码了!
再次验证我们分析的结果:编译,运行...与原程序完全相同。

下面我们开始分析具体的语句:

A                   // !0<t 为假 ,故然后执行 (K(LM(N(OPQ)R))(STU))
K                   // t<0 为假 ,故然后执行 (STU)
S                   // 0<t   为真,故执行 T
T                   // main(2,2,"%s")递归调用自身,表达式的值为函数返回值,现在无法确定,
//进入main(2,2,"%s") 将此处标记为一号位置
A                   // 1<2 为真,故执行 (B?C:D1),(D2?E:F1),(F2?(G?H:I):J)) 这是一个逗号表达式,执行次序是从左向右依次求值,
                  // 最终取值却是最后一个逗号表达式的值,即 (F2?(G?H:I):J))的值,虽然前面的表达式的值并不被引用,但仍然要执行
//故先进入 (B?C:D1) 将此处标记为二号位置
B                   //   t<3 为真,故执行
C                   //   main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)),首先,这里再次递归调用自身,表达式的值为函数返回值,现在无法确定,将此处标记为三号位置
                  //其次,在递归调用的同时,传递参数分别又调用两次自身,而C语言的函数参数是从右向左入堆栈,所以先调用 main(-86,0,a+1)
//下面进入main(-86,0,a+1) 将此处标记为四号位置
A                   //   1<-86为假
K                   //   -86<0为真
L                   // -86<-72为真
M                   // 调用 main(_,t,STRB),即main(0,-86,STRB)
//进入 main(0,-86,STRB)   将此处标记为五号位置
A                   // 1<0为假
K                   // 0<0为假
S                   // 0<0为假
U                   // *a此时为'@',故为假,那么继续判断 main(0,main(-61,*a,STRD),a+1),此过程又将进入 main(-61,*a,STRD)
//进入main(-61,*a,STRD),即使 main(-61,'n',STRD) 注意参数的运算顺序,先调用了a+1,然后才调用此函数,经过此函数,a已经指向STRD了
A                   // 1<-61为假
K                   //   -61<0为真
L                   // -61<-72为假,那么继续 (N(OPQ)R)
N                   // -61<-50 为真,那么继续 (OPQ)
O                   // 变量'_'此时的值为'n',而*a为'!',故为假
Q                   //   调用main(-65,_,a+1)       
//进入main(-65,_,a+1),即main(-65,'@','e') ,
A                   // 1<-65为假
K                   // -65<0为真
L                   // -65<-72为假
N                   // -65<-50为真
O                   // 为假
Q                   //调用 main(-65,_,a+1)
//进入main(-65,_,a+1),即main(-65,'@','k'),这里可以看到,每调用一次Q,a指针向后移动一次,直到a指向STRD中的@
//中间过程不用再重复了,我们直接考虑当a指向STRD中的@时的情况:
A                   //
K                   //
L                   //
N                   //
O                   // 此时终于为真,那么调用P
P                   // putchar(31[a]);这是什么意思呢?其实数组在编译的过程是转换为指针运算的,31[a]也就相当于a[31] ,而a此时所指的
                      //位置是STRD中的'@',相当于a[0],那么,a[31]就是 'O',到这里终于该从层层的递归中返回了,那么,返回值是什么呢?
                      //返回值就是这里最后的表达式P的值,也就是putchar()函数的返回值,它返回什么呢?返回输出的字符的ASCII码,也就是79
//一层层返回,每次返回值都是79,那么这个79最终到达哪里了呢? 对,返回到五号位置的U语句了
//那我们继续 main(0,-86,STRB) 的U语句:
U                   //   main(0,main(-61,*a,STRD),a+1)即可变成   main(0,79,'n'),很不幸,我们需要继续判断这个函数的返回值,这里标记为五号位置
//进入 main(0,79,'n')
A                   // 1<0为假
K                   // 0<0为假
S                   // 0<0 为假
U                   // 非常不幸,又是U ! 这个时候参数a是多少呢?对了,a 的值其实在上面已经计算并且入栈了,所以还是'n'
                      // 还是不等于'/' ,那么,还要重复上面的过程!其实我们已经可以找到点规律了:
                      // 这次进入main(-61,*a,STRD)函数又会输出什么呢? 可以看出,传递进去的参数a又重新指向STRD的首地址了,
                      // 这次是一直循环到等a指向 'n'的时候,再次后移31位并输出,我们可以算出,这次应该输出 'n',并返回'n'的ASCII码110
其实,分析到这里我们就可以大概了解整个代码的运行过程了,可以看到,程序中输出语句只有一个putchar(),然而,用./a.out | wc统计得到,该程序
一共输出字符数是2358个!!!那么可以想到,要输出完这些字符,函数至少递归了2358次!(其实不止这个数)考虑到分析该程序的目的“just for fun”,
我们就到此为至了吧!

经过分析,我们不由得不佩服这段代码的作者,虽说这样的代码风格是绝对不提倡的,但能设计出这样的代码,不能不说是种“强悍”!

国际C乱码大赛 源码 学习C语言的人大概都知道国际C乱码大赛吧。这是各界C乱码大赛的获奖作品。让我们这些热爱C语言的人一起体会一下大师们的智慧吧。 立即下载

相关推荐

单细胞数据分析实战:用scDblFinder快速搞定异质性双细胞检测(附完整R代码)

本文详细介绍了如何使用scDblFinder工具在单细胞RNA测序数据中精准识别异质性双细胞。通过完整的R代码示例,从环境准备、数据加载到核心分析流程和结果可视化,帮助研究人员高效解决双细胞检测问题,提升单细胞数据分析的准确性。scDblFinder的集成算法和鲁棒性设计使其成为处理单细胞数据中技术噪音的理想选择。

weixin_29098117的博客 420

国际C语言混乱代码大赛(IOCCC)1988年获奖作品

国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。目的是写出最有创意的最让人难以理解的C语言代码。

CaptainUniverse_的博客 4206

SAP中MRP运行计划行超限问题的分析与解决

SAP中基于生产性物料的采购特点,通常会采用采购计划协议的方式进行采购。其具体的采购计划通常来自于成品计划独立需求,然后通过物料清单,经由MRP跑出。 在采购计划协议中的计划行中,存在一个计划行号,随着MRP在不断跑出新的计划行,该行号资源会消耗完。当计划行号消耗完后,MRP不会再跑出新的计划行。且在MD04或MD02中看不到类似提示信息。此时可以通过MD05来查看是否出现类似下图的提示信息。 ...

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 3844

【赏析】国际C语言混乱代码大赛代码

通常有10种类型的获胜者:“对规则的最奇怪的滥用”,“最具创意的源代码布局”,“最简单的单行代码”等。(unix)["have"]+"fun"-0x60就相当于0x61-0x60+"fun"相当于 0x01+"fun" ,相当于字符指针后移并指向"un"了。这里的unix相当于1 ,那么unix["have"]相当于 "have"[1] 我们都知道"have"是个字符数组。那么 "have"[1]就相当于引用这个"have"数组下标为1的字符了,实际上就是a;%s实际上是刚刚讲过的"un"的格式。

qq_65102825的博客 1034

HDMI协议介绍(一)--Overview

HDMI全称(High Definition Multimedia Interface)高清多媒体接口,支持在单线缆上传输全数字高清视频和多声道音频。

SlamDunk的博客 2万+

抓包抖音充值页面实现微信支付宝充值抖币,可提供api

抓包抖音充值接口教程,实现微信支付宝充值抖币收款通道

eeeee1212的博客 1万+

ioccc代码分析(1)

在四级考试的前一天,咸鱼的我不仅没有学英语,还开始研究起了IOCCC(国际混乱C语言代码大赛)。个人C语言学的也比较渣,在看了这些大神的代码之后,更加感觉自己C语言都学狗身上去了,先看第一个代码: int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\ o, world!\n",'/'/'/'));}read(j,i,p...

qq_41529799的博客 1220

权重衰减weight_decay参数从入门到精通

Weight Decay是一个正则化技术,作用是**抑制模型的过拟合**,以此来提高模型的泛化性。 目前网上对于Weight Decay的讲解都比较泛,都是短短的几句话,但对于其原理、实现方式大多就没有讲解清楚,本文将会逐步解释weight decay机制。

iioSnail的博客 4万+

国际C语言混乱代码大赛

    国际C语言混乱代码大赛(IOCCC)是一项年度竞赛,自1984年以来一直延续至今。它由Landon Curt和Larry Bassel在USENET上举办,冬天接收参赛作品,春天评判,夏天公布获胜者。     1988年的获胜者是cdecl程序的一个混乱版本,作者是Gopi Reddy。回想一下,非混乱的cdecl代码大概是150行,而混乱版本的代码只有12行。     下面就是混乱代码:

sakulafly的专栏 4687

华为OD最新机试真题-池化资源共享

摘要:该问题要求管理n台设备的资源池,处理资源申请和释放操作。申请操作需返回满足条件且剩余资源最少的设备ID,释放操作需将指定申请的资源归还。采用线段树数据结构维护各设备当前最大可用资源值,支持快速查询和更新。线段树实现了单点修改、区间最大值查询以及查找最左满足条件的节点功能。算法时间复杂度为O((n+m)logn),空间复杂度O(n),适用于大规模操作。提供了C++、Java和Python三种实现方案。

面试高手的博客 324

【补充篇】三万字了解AUTOSAR软件架构(一)

主要讲解了AUTOSAR软件架构的分层及各个栈的作用

weixin_47571898的博客 1117

第21届国际C语言混乱代码大赛获奖作品

小行踪 2012-10-22 14:10 第21届国际C语言混乱代码大赛(IOCCC)正式发布了获奖源代码。IOCCC要求参赛者写出最有创意且最让人难以理解的C语言代码,大小限制在4 kb以内,因此每位参赛者的作品都让人印象深刻。获胜者包括1名法国人,1名韩国人,5名美国人,1名比利时人,1名以色列人,1名英国人,4名日本人和1名中国人。 选取了几个代表性作品大家...

weixin_33971205的博客 846

Claude Code 100个真实案例 - 用AI搭建LangChain多工具Agent(自主搜索+查询)

本案例展示如何使用 Claude Code 搭建一个 LangChain 多工具 Agent 系统。Agent 能够自主决定调用搜索引擎、数据库查询、天气查询、计算器等工具,像人类助手一样拆解问题并逐步解决。

yueyeguzhuo的专栏 558

国际C语言混乱代码大赛作品分析!

国际C语言混乱代码大赛作品分析! #include main(t,_,a)char *a;{return!0<t?t<3? main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? main(2,_+1,"%s %d %d\n"):9:16:t<

king110108的专栏 2919

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c语言毁电脑代码,国际C语言混乱代码大赛作品分析! -电脑资料

#include main(t,_,a)char *a;{return!0main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,tmain(2,_+1,"%s %d %dn"):9:16:t<0?tmain(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,...

weixin_31431507的博客 526

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言混淆代码解析:IOCCC获奖作品背后的编译原理与逆向工程

代码混淆是一种通过改变程序结构隐藏原始逻辑的技术,其核心原理在于利用编程语言的语法特性和编译器行为。在C语言中,宏展开、指针运算和未定义行为等技术常被用于实现混淆,这不仅考验开发者对语言标准的深入理解,也为编译器测试和逆向工程研究提供了独特价值。IOCCC(国际C语言混乱代码大赛)作品将这种技术推向极致,通过滥用预处理指令、视觉欺骗和底层技巧,在符合C标准的前提下创造出功能完整但难以阅读的程序。这类代码虽然不具备生产环境实用性,却成为研究编译原理、探索语言边界和训练逆向分析能力的绝佳材料,尤其适合安全研究人

weixin_34242509的博客 321

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

国际c语言混乱编码大赛,国际C语言混乱代码大赛代码赏析(一)【转】

国际C语言混乱代码大赛代码赏析(一)近段时间在看《C专家编程》,里面提到国际C语言混乱代码大赛(The International Obfuscated C Code ContestIOCCC)。IOCCC有许多令人捧腹之处,不管你是自己编写还是时候分析获胜者的代码,都能够以令人惊讶的方式扩展你的知识。通常有10种类型的获胜者:“对规则的最奇怪的滥用”,“最具创意的源代码布局”,“最简单的单行代...

weixin_39880328的博客 2167

国际C语言混乱代码大赛代码赏析 一

国际C语言混乱代码大赛代码赏析 一

uffgfbft的博客 724

国际C语言混乱代码大赛代码赏析(一)【转】

本文转载自:http://blog.youkuaiyun.com/ce123_zhouwei/article/details/9073869 国际C语言混乱代码大赛代码赏析(一) 近段时间在看《C专家编程》,里面提到国际C语言混乱代码大赛(The International Obfuscated C Code ContestIOCCC)。IOCCC有许多令人捧腹之处,不管你是自己编写还是时候分...

205

国际混淆C代码大赛获奖作品部分源码

国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。目的是写出最有创意的最让人难以理解的C语言代码。 1、 1 #include<stdio.h> 2 ...

weixin_30314813的博客 3万+

国际C语言混乱代码大赛代码赏析(一)

国际C语言混乱代码大赛代码赏析(一) 近段时间在看《C专家编程》,里面提到国际C语言混乱代码大赛(The International Obfuscated C Code Contest IOCCC)。IOCCC有许多令人捧腹之处,不管你是自己编写还是时候分析获胜者的代码,都能够以令人惊讶的方式扩展你的知识。通常有10种类型的获胜者:“对规则的最奇怪的滥用”,“最具创意的源代码布局”,“最简单的单行

ce123的技术博客 1万+

1987年国际C语言混乱代码大赛获奖的一行代码

最近CoolShell博主做了一个很有意思的在线puzzle,这些谜题很有趣同时也有一定的难度。由于水平有限,我并没有通关,我觉得这些题还是很值得一做的,从中可以学到很多东西。 例如其中的第二题: 题目中给出了一个键盘和一行看不懂的字符串。我们发现这个键盘的键盘布局和现在通用的键盘(QWERTY键盘)不一样,它叫做Dvorak键盘。这里就不多作解释了,详细的可以去...

dbbaq24022的专栏 443

国际C语言混乱代码大赛代码赏析

国际C语言混乱代码大赛(The International Obfuscated C Code Contest IOCCC)。IOCCC有许多令人捧腹之处,不管你是自己编写还是时候分析获胜者的代码,都能够以令人惊讶的方式扩展你的知识。通常有10种类型的获胜者:“对规则的最奇怪的滥用”,“最具创意的源代码布局”,“最简单的单行代码”等。综合性的“最佳上镜”奖授予最难阅读、行为最为古怪(但能够运行)的

yangluoning的专栏 9211
上一篇: 传说中的世界500强面试题-数学能力(2)
下一篇: 传说中的世界500强面试题-推理能力(1)
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值