Jim Lawless' Blog


Obfuscated C

Originally published on: Tue, 21 Apr 2009 23:51:27 +0000

I had written a little C program a while back for the 19th annual International Obfuscated C Coding contest.

Not only did my code not win ... it didn't even warrant an entry in the honorable mentions or anything like that. If you look at the winners and look back at my code, you'll immediately see why; the winners and the runners-up were much more creative than my effort.

Rather than get lost in obscurity, I felt that my entry needed to be published, so it has been given the honor of appearing in my first public blog post.

Everyone, please meet lawless.c ... a ROT-13 encoder/decoder that encodes/decodes one line at a time:


// Copyright (c) 2009 by Jim Lawless
#include <stdio.h>
#include <ctype.h>
 
char *z="DCFEBA";
int zzz;
void zzzzzzzzz(void) { zzz=zzz; }
typedef void (*ZZ)(void);
#define I
void zzzzzzz(void) { z-=6; }
#define r(x) isalpha(x) ? tolower(x)>'m' ? x-'\r' : x+'\r' : x
void zzzzzz(void) { if(!(zzz-10)) { z++; z++; } }
#define o(x) Z[*z-'A']();
#define t(x)
void zzzz(void) { zzz=fgetc(stdin); }
#define a(x) for(;*z;z++)
void zzzzz(void) { zzz=r(zzz); }
#define s(x)
void zzzzzzzz(void) { fputc(zzz,stdout); }
 
ZZ Z[12]={ zzzzzzz, zzzzzzzz, zzzz, zzzzzzzzz, zzzzzz, zzzzz };
 
int main() {
 
  I s(lit) t(he) s(heet) t(he) s(heet) I s(lit) a(nd)
     o(n) t(he) s(litted) s(heet) I s(it)
}
 
 

The rules for the 19th annual competition had noted that C preprocessor tricks might just as well not be used as each entry would be run through the preprocessor for expansion.

Here's what the above code would look like after preprocessing;


char *z="DCFEBA";
int zzz;
void zzzzzzzzz(void) { zzz=zzz; }
typedef void (*ZZ)(void);

void zzzzzzz(void) { z-=6; }

void zzzzzz(void) { if(!(zzz-10)) { z++; z++; } }


void zzzz(void) { zzz=fgetc((&_iob[0])); }

void zzzzz(void) { zzz=(__mb_cur_max > 1 ? _isctype(zzz,(0x0100|0x1|0x2)) : _pctype[zzz] &amp; (0x0100|0x1|0x2)) ? tolower(zzz)>'m' ? zzz-'\r' : zzz+'\r' : zzz; }

void zzzzzzzz(void) { fputc(zzz,(&_iob[1])); }
 
ZZ Z[12]={ zzzzzzz, zzzzzzzz, zzzz, zzzzzzzzz, zzzzzz, zzzzz };
 
int main() {
 
          for(;*z;z++)
     Z[*z-'A']();
}

I tried to use preprocessor abuse to get my cutesy "I slit the sheet..." lines into view ... but the core of the processing was done via indirect invocation of entries in an array of function-pointers.

It was a fun exercise that I hope to revisit with more seriousness in the future.

Unless otherwise noted, all code and text entries are Copyright ©2009 by James K. Lawless

del_icio_us Save to del.icio.us
stumbleupon Save to StumbleUpon
digg Digg it
reddit Save to Reddit
facebook Share on Facebook
twitter Share on Twitter
aolfav More bookmarks



Next post:E-mail cleansing


Search this Blog (and site)

Search this Site with PicoSearch


Subscribe to this Blog

 Subscribe!


Contact Me

Email: jimbo@radiks.net


Follow me on Twitter

http://twitter.com/lawlessGuy


Recent Posts

Mad Schemes : Learning Lisp via SICP

Auto Save Clipboard Images Redux

Extending SpiderMonkey JavaScript on Windows

Rhino JavaScript to EXE with launch4j

Compiling Rhino JavaScript to Java

Directory Traversal in Rhino JavaScript

Taking Shape

We've Moved!


Popular Posts

A Command-Line MP3 Player for Windows

Auto Save Images from the Clipboard

Java in a Windows EXE with launch4j

An Interview with Tom Zimmer: Forth System Developer

Setting Windows Console Text Colors in C


Random Posts

A Simple Media Control Interface Script Processor

WSH2EXE part 2

RSS feed processing with AWK

FIF Isn't Forth

BSave and BLoad for the Commodore 64

The Protection Racket

Directory Traversal in Rhino JavaScript

Setting Text Color in a Batch File

BPL: Batch Programming Language Interpreter

Choose your own Adventure with Sinatra


Full List of Posts

http://www.mailsend-online.com/bloglist.htm


Blogroll

MicroISV on a Shoestring
DadHacker
The Bottom Feeder
Writin' That Code!
The Recursive ISV
The Thomsen Blog
Prototypically Speaking
The Reinvigorated Programmer