![]() |
|
|
|
|
|||||||
| Forums | Portal | Register | Forum Rules | FAQ | Contribute | Members List | Arcade | Search | Today's Posts | Mark Forums Read |
| High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here. |
|
|
Submit Tools | LinkBack | Thread Tools | Display Modes |
|
||||
|
Well this year i decided to enter the International Obfuscated C Code Contest. This was my first attempt at writing obfuscated C (at least purposely), so I am sure that this is kids-stuff for the real obfuscation gurus. Anyway, the results are out, and I am not a finalist (I wasn't expecting to be), so I figured I would share my code with you all, just for fun. If anyone else made an entry this year, please share them!
Here are the remarks included with my entry: This program grew out of a non-obfuscated utility that I threw together a while ago. I use it as a reference from time to time since different architectures produce different results (at least, the output is different on my HP-UX box than it is on my Intel box). It simply outputs a nicely formatted ascii character table. It is run with no arguments and produces its report on the standard out. I achieved obfuscation by using a couple of levels of recursion, plus some confusingly named variables and functions. I also included some additional code which does absolutley nothing just to confuse things a little more. I strived for "-Wall" cleanness. As a result I had to give up a couple minor obfuscations, but I think it is still sufficiently convoluted. This is my first attempt at obfuscated C -- it was written over the course of several weeks as a diversion. By the end it became very difficult to improve as I could no longer understand how it worked without a serious amount of thought! The code is neatly arranged in the form of my initials. Code:
# include <stdio.h>
# define d (
# define I1 1<<
# define b )
# define Il(l) \
return(l)
# define lI \
I*((I1 3)-1)+(I*(I1\
1))-(I-\
(I1 4))
#define \
_l(l) \
ll_l(l)
#define \
ll(l) l
#define \
l1 main(
long i,l,ll(I)=d(I1 5)-(I1 1)b;int _l(l)
{putchar d ll(l)b;Il(l);}int II(l,L){_l(
(l/L)+48);l-=((l/L)*L);d L/=10 b?II(l,L)
:0;Il(l);}int l1
b{*d d l b?&I:&l
b=I;if d l>(I1 8
b b Il(I1 0);_l(
32);_l(I1 5);II(
l,25<<2);_l(58);
_l(I1 5);_l(ll(l
));l%(I1 2)?0:_l
((I1 3)+(ll(I1 1)
)b;l++;Il(l1 l));
}
|
| Forum Sponsor | ||
|
|
|
||||
|
Dr. Korn's one liner seems to have been written in the days of K&R C. LivinFree uses HP-UX. HP-UX includes a old K&R C compiler for free as part of the OS. I am sure that he is using this compiler to compile the one liner.
The old C preprocessor seems to set the symbol "unix" to be "1" for some odd reason. And I guess that ansi cleaned up the name space. I never noticed this before and now I wonder what old C compilers did on, say, an old IBM pc. Set unix to 0? Or leave unix undefined and set ms-dos to 1? In any event, I got the one liner to work with ansi C by adding a line "#define unix 1". |
|
||||
|
I also got it compiled on a Linux machine with gcc.
I checked the Makefile, and I didn't see any extra options either that may be needed on some systems. I also checked the hint file again to see if some compilers didn't like it... The commands I used were: $ gcc -o korn korn.c $ ./korn unix What system are you using to compile? What compiler? |