# un-obsfuscating -> into pascal an IOCCC obsfuscated program

P

#### Peter Williams

Hi All,

I am attempting to reverse-obsfuscate an IOCCC entry, and my ultimate
goal is to convert the code into Delphi (OO Pascal).

I don't understand what the question-mark (?) operator, and the
percent (%) operator does.

How do I translate this line (obviously declaring some integers) into
pascal ???

int c = 0, *n = v + 100, j = d < u - 1 ? a : - 9000, w, z, i, g, q
= 3-f;

And how do I translate these lines to pascal ???

for(w = i = 0; i < 4; i++)
w += (m = v[h]) == f ? 300 : m == q ? - 300: (t = v[ih])
== f ? - 50: t == q ? 50 : 0;

And how do I translate these lines to pascal ???

for(; t < 1600; t += 100)
for(m = 0; m < 100; m++)
V[t + m] = m < 11 || m > 88 ||(m + 1) % 10 < 2 ? 3 : 0;

What does "<<" do ? e.g. how do I translate the next line???

return d >= u - 1 ? j + (c << 3): j;

Any help will be appreciated.

Regards,
Peter W. ))
Sandy Bay, Hobart, Tas, AU.

obsfuscated code ("lievaart2.c")
-----
#define D define
#D Y return
#D R for
#D e while
#D I printf
#D l int
#D W if
#D C y=v+111;H(x,v)*y++= *x
#D H(a,b)R(a=b+11;a<b+89;a++)
#D s(a)t=scanf("%d",&a)
#D U Z I
#D Z I("123\
45678\n");H(x,V){putchar(".XO"[*x]);W((x-V)%10==8){x+=2;I("%d\n",(x-V)/1
0-1);}}
l
V[1600],u,r[]={-1,-11,-10,-9,1,11,10,9},h[]={11,18,81,88},ih[]={22,27,72
,77},
bz,lv=60,*x,*y,m,t;S(d,v,f,_,a,b)l*v;{l
c=0,*n=v+100,j=d<u-1?a:-9000,w,z,i,g,q=
3-f;W(d>u){R(w=i=0;i<4;i++)w+=(m=v[h])==f?300:m==q?-300t=v[ih])=
=f?-50:
t==q?50:0;Y w;}H(z,0){W(E(v,z,f,100)){c++;w=
-S(d+1,n,q,0,-b,-j);W(w>j){g=bz=z;
j=w;W(w>=b||w>=8003)Y w;}}}W(!c){g=0;W(_){H(x,v)c+=
*x==f?1:*x==3-f?-1:0;Y c>0?
8000+c:c-8000;}C;j= -S(d+1,n,q,1,-b,-j);}bz=g;Y
d>=u-1?j+(c<<3):j;}main(){R(;t<
1600;t+=100)R(m=0;m<100;m++)V[t+m]=m<11||m>88||(m+1)%10<2?3:0;I("Level:"
);V[44]
=V[55]=1;V[45]=V[54]=2;s(u);e(lv>0){Z
do{I("You:");s(m);}e(!E(V,m,2,0)&&m!=99);
W(m!=99)lv--;W(lv<15&&u<10)u+=2;U("Wait\n");I("Value:%d\n",S(0,V,1,0,-90
00,9000
));I("move:
%d\n",(lv-=E(V,bz,1,0),bz));}}E(v,z,f,o)l*v;{l*j,q=3-f,g=0,i,w,*k=v
+z;W(*k==0)R(i=7;i>=0;i--){j=k+(w=r);e(*j==q)j+=w;W(*j==f&&j-w!=k){W(
!g){g=1
;C;}e(j!=k)*((j-=w)+o)=f;}}Y g;}
-----

un-obsfuscated code:
-----
/* This source has been formatted by an unregistered SourceFormatX */
/* If you want to remove this info, please register this shareware */

H(x,V)
{
putchar(".XO"[*x]);
if((x-V)%10==8)
{
x+=2;
printf("%d\n",(x-V)/10-1);
}
}

int V[1600], u, r[] =
{
- 1, - 11, - 10, - 9, 1, 11, 10, 9
}

, h[] =
{
11, 18, 81, 88
}

, ih[] =
{
22, 27, 72, 77
}

, bz, lv = 60, *x, *y, m, t;
S(d, v, f, _, a, b)int *v;
{
int c = 0, *n = v + 100, j = d < u - 1 ? a : - 9000, w, z, i, g, q
= 3-f;
if(d > u)
{
for(w = i = 0; i < 4; i++)
w += (m = v[h]) == f ? 300 : m == q ? - 300: (t = v[ih])
== f ? - 50: t == q ? 50 : 0;
return w;
}
H(z, 0)
{
if(E(v, z, f, 100))
{
c++;
w = - S(d + 1, n, q, 0, - b, - j);
if(w > j)
{
g = bz = z;
j = w;
if(w >= b || w >= 8003)return w;
}
}
}
if(!c)
{
g = 0;
if(_)
{
H(x, v)c += *x == f ? 1 : *x == 3-f ? - 1: 0;
return c > 0 ? 8000+c: c - 8000;
}
y=v+111;
H(x,v)*y++= *x;
j = - S(d + 1, n, q, 1, - b, - j);
}
bz = g;
return d >= u - 1 ? j + (c << 3): j;
}

main()
{
for(; t < 1600; t += 100)
for(m = 0; m < 100; m++)
V[t + m] = m < 11 || m > 88 ||(m + 1) % 10 < 2 ? 3 : 0;
printf("Level:");
V[44] = V[55] = 1;
V[45] = V[54] = 2;
s(u);
while(lv > 0)
{
printf("123\45678\n");
do
{
printf("You:");
s(m);
}
while(!E(V, m, 2, 0) && m != 99);
if(m != 99)lv--;
if(lv < 15 && u < 10)u += 2;
printf("123\45678\n");
printf("Wait\n");
printf("Value:%d\n", S(0, V, 1, 0, - 9000, 9000));
printf("move: %d\n", (lv -= E(V, bz, 1, 0), bz));
}
}

E(v, z, f, o)int *v;
{
int *j, q = 3-f, g = 0, i, w, *k = v + z;
if(*k == 0)
for(i = 7; i >= 0; i--)
{
j = k + (w = r);
while(*j == q)j += w;
if(*j == f && j - w != k)
{
if(!g)
{
g = 1;
y=v+111;
H(x,v)*y++= *x;
}
while(j != k)*((j -= w) + o) = f;
}
}
return g;
}
-----

lievaart.hint
-----
Grand Prize:

Roemer B. Lievaart
VU Informatica
Churchilllaan 173-IV
Amsterdam, The Netherlands

We believe that you too will be amazed at just how much power Mr.
Lievaart packed into 1024 bytes!

This Plays the game of reversi (Othello)! Compile and run. It then
asks for a playing level. Enter 0-10 (easy-hard). It then asks for
your move. A move is a number within 11-88, or a 99 to pass. Illegal
moves (except for an illegal pass) are rejected. Then the computer
does its move (or a 0 to pass), until the board is full. It plays
rather well, for such a small program! Lievaart had to leave out the
board printing routine, so you'll have to take a real game board to
play it. ... Also due to space-limitations (the rules for 1987 had a
limit of 1024 byes), Lievaart took out the passing-handler, which
makes its ending-game rather poor. But further it knows all the
rules, uses alpha-beta pruning, and it plays f.i. on mobility(!).
Most important: it can play a pretty good game of Reversi!

The Author was kind enough to supply the fully functional version of the
program. The file lievaart2.c contains what the program would have
been without the size restriction. This version has the full end game
logic and displays the board after each move!

Copyright (c) 1987, Landon Curt Noll & Larry Bassel.
non-profit use is granted provided this this copyright and notice are
included in its entirety and remains unaltered. All other uses must
receive prior permission in writing from both Landon Curt Noll and
Larry Bassel.
-----

M

#### Mark McIntyre

Hi All,

I am attempting to reverse-obsfuscate an IOCCC entry, and my ultimate
goal is to convert the code into Delphi (OO Pascal).

I don't understand what the question-mark (?) operator,

?...: is more or less equivalent to if.. else...
and the percent (%) operator does.

remainder operator. 6%4 = 2
How do I translate this line (obviously declaring some integers) into
pascal ???

int c = 0, *n = v + 100, j = d < u - 1 ? a : - 9000, w, z, i, g, q = 3-f;

this declares a bunch of ints and one pointer to an int.
What does "<<" do ? e.g. how do I translate the next line???

bit left-shift operator. 0x01 << 4 = 0x10

C

#### CBFalconer

Peter said:
I am attempting to reverse-obsfuscate an IOCCC entry, and my
ultimate goal is to convert the code into Delphi (OO Pascal).

I don't understand what the question-mark (?) operator, and the
percent (%) operator does.

How do I translate this line (obviously declaring some integers)
into pascal ???

int c = 0, *n = v + 100, j = d < u - 1 ? a : - 9000, w, z,
i, g, q = 3-f;

VAR
c, j, w, z, i, q : integer;
n : ^integer;

c := 0;
n := v + 100; (* Very questionable operation,
Pascal doesn't bandy pointers about *)
IF d < u-l THEN j := a
ELSE j := -9000;
q := 3 - f;

P

#### Peteris Krumins

Peter said:
Hi All,

I am attempting to reverse-obsfuscate an IOCCC entry, and my ultimate
goal is to convert the code into Delphi (OO Pascal).

What's that 'Delphi (OO Pascal)'?

P.Krumins

K

#### Keith Thompson

Peteris Krumins said:
What's that 'Delphi (OO Pascal)'?

This is comp.lang.c, so we can't give you a good answer to that
question. I note, however, that there are at least 10 newsgroups
concerned with Delphi and that a Google search for "Delphi" will give
you more and better information than you could possibly get here.

P

#### Peter Williams

Hi All,

I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

Regards,
Peter W. ))
Sandy Bay, Hobart, Tas, AU.

P

#### Peter Nilsson

Peter said:
I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

An alternative way to write this is...

while (j != k)
{
j = j - w;
j[o] = f;
}

M

#### Mark McIntyre

Hi All,

I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

it says
while j is not equal to k, set whatever is pointed to by (j-w+o) equal to
f, and subtract w from j.

K

#### Keith Thompson

Peter Nilsson said:
Peter said:
I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

An alternative way to write this is...

while (j != k)
{
j = j - w;
j[o] = f;
}

Which requires pointer arithmetic. Last time I looked, Pascal didn't
support pointer arithmetic. Then again, the last time I looked was a
very long time ago.

P

#### Peter Nilsson

Keith said:
Peter Nilsson said:
Peter said:
I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

An alternative way to write this is...

while (j != k)
{
j = j - w;
j[o] = f;
}

Which requires pointer arithmetic. Last time I looked, Pascal
didn't support pointer arithmetic.

True, but that's not clc's problem. However, judging from the
original post, the OP has already realised that a conversion in
methodology is required for things like: while(*j == q)j += w;

Since they likely got past that line, I figured it was only the
*(x + y) to x[y] bit they were having problems with.

I simply supplied alternative C. You have already pointed out
elsethread that there are other groups available which could no
doubt assist with the actual translation to Delphi.

A

#### Andrey Tarasevich

Keith said:
I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

An alternative way to write this is...

while (j != k)
{
j = j - w;
j[o] = f;
}

Which requires pointer arithmetic. Last time I looked, Pascal didn't
support pointer arithmetic. Then again, the last time I looked was a
very long time ago.

The last pre-Delphi version of Borland Pascal did support C-style
pointer arithmetic, although at that time it was an undocumented feature
of the compiler. If Delphi inherited this feature from BP, the OP can
convert this code without any serious problems.

C

#### CBFalconer

Andrey said:
Keith said:
I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

An alternative way to write this is...

while (j != k)
{
j = j - w;
j[o] = f;
}

Which requires pointer arithmetic. Last time I looked, Pascal
didn't support pointer arithmetic. Then again, the last time I
looked was a very long time ago.

The last pre-Delphi version of Borland Pascal did support C-style
pointer arithmetic, although at that time it was an undocumented
feature of the compiler. If Delphi inherited this feature from
BP, the OP can convert this code without any serious problems.

No Pascal ever supported pointer arithmetic. Turbo/Borland/Delphi
is not Pascal. They all fail to meet even the minimum requirements
of the language.

However the point is to convert the C statement "while (j != k)
*((j -= w) + o) = f;" into Pascal, which requires knowledge of both
languages. Even in C there exists the requirement that all the
pointers point into the same object, which means that each pointer
can be replaced by a base pointer and an index value. Thus replace
*j by p[j], *k by p[k], etc for dereferencing purposes, and detect
equality etc by operations on the indices. So:

VAR
p : ARRAY [someindex] OF sometype;
j, k : someindex;
w, o : integer;
f : sometype;

....
WHILE j <> k DO BEGIN
j := j - w + o;
p[j] := f;
END;

which isn't very frightening once you type the variables properly.

A

#### Andrey Tarasevich

CBFalconer said:
...
I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

An alternative way to write this is...

while (j != k)
{
j = j - w;
j[o] = f;
}

Which requires pointer arithmetic. Last time I looked, Pascal
didn't support pointer arithmetic. Then again, the last time I
looked was a very long time ago.

The last pre-Delphi version of Borland Pascal did support C-style
pointer arithmetic, although at that time it was an undocumented
feature of the compiler. If Delphi inherited this feature from
BP, the OP can convert this code without any serious problems.

No Pascal ever supported pointer arithmetic. Turbo/Borland/Delphi
is not Pascal. They all fail to meet even the minimum requirements
of the language.
...

Yes, but the OP's question is about translating the original code into
Delphi, not into formal "Pascal".

C

#### CBFalconer

Andrey said:
CBFalconer said:
...
I can't quite figure out how to convert this line:

while(j != k)*((j -= w) + o) = f;

An alternative way to write this is...

while (j != k)
{
j = j - w;
j[o] = f;
}

Which requires pointer arithmetic. Last time I looked, Pascal
didn't support pointer arithmetic. Then again, the last time I
looked was a very long time ago.

The last pre-Delphi version of Borland Pascal did support C-style
pointer arithmetic, although at that time it was an undocumented
feature of the compiler. If Delphi inherited this feature from
BP, the OP can convert this code without any serious problems.

No Pascal ever supported pointer arithmetic. Turbo/Borland/Delphi
is not Pascal. They all fail to meet even the minimum requirements
of the language.
...

Yes, but the OP's question is about translating the original code
into Delphi, not into formal "Pascal".

But Delphi does support arrays and indexes into such. So why not
use that and eliminate the insecurities of pointer arithmetic.