By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
 424,836 Members | 1,840 Online + Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,836 IT Pros & Developers. It's quick & easy.

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

 P: n/a 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[i]]) == f ? 300 : m == q ? - 300: (t = v[ih[i]]) == 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;au){R(w=i=0;i<4;i++)w+=(m=v[h[i]])==f?300:m==q?-300:(t=v[ih[i]])= =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 =V=1;V=V=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[i]);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 */ /* Please visit http://www.textrush.com to get more information */ H(x,V) { putchar(".XO"[*x]); if((x-V)%10==8) { x+=2; printf("%d\n",(x-V)/10-1); } } int V, 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[i]]) == f ? 300 : m == q ? - 300: (t = v[ih[i]]) == 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 = V = 1; V = V = 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[i]); 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. All Rights Reserved. Permission for personal, educational or 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. ----- Nov 14 '05 #1
Share this Question
14 Replies

 P: n/a On Sun, 06 Mar 2005 07:12:35 GMT, in comp.lang.c , "Peter Williams" wrote: Hi All, I am attempting to reverse-obsfuscate an IOCCC entry, and my ultimategoal 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) intopascal ??? 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 -- Mark McIntyre CLC FAQ CLC readme: Nov 14 '05 #2

 P: n/a Peter Williams wrote: 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; -- "If you want to post a followup via groups.google.com, don't use the broken "Reply" link at the bottom of the article. Click on "show options" at the top of the article, then click on the "Reply" at the bottom of the article headers." - Keith Thompson Nov 14 '05 #3

 P: n/a Peter Williams wrote: 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 Nov 14 '05 #4

 P: n/a "Peteris Krumins" writes: Peter Williams wrote: 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)'? 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. -- Keith Thompson (The_Other_Keith) ks***@mib.org San Diego Supercomputer Center <*> We must do something. This is something. Therefore, we must do this. Nov 14 '05 #5

 P: n/a Hi All, I can't quite figure out how to convert this line: while(j != k)*((j -= w) + o) = f; into pascal. Can someone please help? Regards, Peter W. :-))) Sandy Bay, Hobart, Tas, AU. Nov 14 '05 #6

 P: n/a Peter Williams wrote: 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; } -- Peter Nov 14 '05 #7

 P: n/a On Sun, 06 Mar 2005 23:13:52 GMT, in comp.lang.c , "Peter Williams" wrote: 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. -- Mark McIntyre CLC FAQ CLC readme: Nov 14 '05 #8

 P: n/a "Peter Nilsson" writes: Peter Williams wrote: 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. -- Keith Thompson (The_Other_Keith) ks***@mib.org San Diego Supercomputer Center <*> We must do something. This is something. Therefore, we must do this. Nov 14 '05 #9

 P: n/a CBFalconer, Sun20050306@15:00:05(CET): Peter Williams wrote: int c = 0, *n = v + 100, j = d < u - 1 ? a : - 9000, w, z, i, g, q = 3-f; IF d < u-l THEN j := a Oops, that "l" should be a "1". -- David Serrano Nov 14 '05 #10

 P: n/a Keith Thompson wrote: "Peter Nilsson" writes: Peter Williams wrote: 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. -- Peter Nov 14 '05 #11

 P: n/a Keith Thompson wrote: 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. -- Best regards, Andrey Tarasevich Nov 14 '05 #12

 P: n/a Andrey Tarasevich wrote: Keith Thompson wrote: 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. -- "If you want to post a followup via groups.google.com, don't use the broken "Reply" link at the bottom of the article. Click on "show options" at the top of the article, then click on the "Reply" at the bottom of the article headers." - Keith Thompson Nov 14 '05 #13

 P: n/a CBFalconer wrote:> ...> 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". -- Best regards, Andrey Tarasevich Nov 14 '05 #14

 P: n/a Andrey Tarasevich wrote: CBFalconer wrote:>> ...>> 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. -- Chuck F (cb********@yahoo.com) (cb********@worldnet.att.net) Available for consulting/temporary embedded and systems. USE worldnet address! Nov 14 '05 #15

### This discussion thread is closed

Replies have been disabled for this discussion. 