|
|
1.1 root 1: /* $Id: unbaja.c,v 1.34 2006/09/09 02:16:31 rswindell Exp $ */
2:
3: #include <stdio.h>
4: #include <string.h>
5:
6: #include <stdlib.h>
7:
8: #include "dirwrap.h"
9:
10: #include "crc32.h"
11:
12: #include "cmdshell.h"
13: #include "ars_defs.h"
14:
15: int indent=0;
16: int indenteol=0;
17:
18: /* table of variables for use by bsearch() */
19:
20: struct var_table_t {
21: unsigned long crc;
22: char *var;
23: } var_table[] = {
24: { 0x00000000, "STR" }, { 0x01837ca9, "r2" }, { 0x023e4b48, "fattr" },
25: { 0x02408dc5, "_SYS_TIMEZONE" }, { 0x038a840b, "k1" },
26: { 0x0400f83f, "e2" }, { 0x04807a11, "_USERON.LOGONS" },
27: { 0x057e4cd4, "_TIMELEFT" }, { 0x07954570, "_USERON.XEDIT" },
28: { 0x08f65a2a, "_USERON.MODEM" }, { 0x094cc42c, "_USERON.ROWS" },
29: { 0x098bdfcb, "_USERON.TLAST" }, { 0x0bf3b87a, "w3" },
30: { 0x0c1a1011, "_USERON.FLAGS2" }, { 0x0c8dcf3b, "_USERON.FBACKS" },
31: { 0x0e42002a, "_EXPIRED_EXEMPT" }, { 0x0ea515b1, "_USERON.LASTON" },
32: { 0x10bfc6e9, "_EXPIRED_FLAGS2" }, { 0x11c83294, "_SYS_PSNUM" },
33: { 0x12e7d6d2, "_USERON.EXEMPT" }, { 0x12e8893b, "v3" },
34: { 0x15755030, "_COMSPEC" }, { 0x167ea426, "pos" },
35: { 0x16e2585f, "_CLIENT_SOCKET" }, { 0x176b0dad, "a3" },
36: { 0x18984de8, "s2" }, { 0x19982a4f, "log" }, { 0x1a91b54a, "j1" },
37: { 0x1c4455ee, "_DTE_RATE" }, { 0x1d1bc97e, "d2" },
38: { 0x1e5052a7, "_MAX_MINUTES" }, { 0x1ef214ef, "_USERON.FIRSTON" },
39: { 0x2039a29f, "_USERON.POSTS" }, { 0x205ace36, "_AUTOTERM" },
40: { 0x2060efc3, "s" }, { 0x20cb6325, "_NEW_REST" },
41: { 0x20deebb9, "t3" }, { 0x2105d2b9, "_SOCKET_ERROR" },
42: { 0x222d1c26, "ss" }, { 0x22f01d71, "_NEW_FLAGS3" },
43: { 0x23edbcbc, "nodes_wfc" }, { 0x255d6f2f, "c3" },
44: { 0x270d2bda, "w" }, { 0x274e4d59, "nm" }, { 0x27a9fc7c, "attempt" },
45: { 0x28a7d7c8, "h1" }, { 0x2aa89801, "_NODE_SWAP" },
46: { 0x2aae2f6a, "q2" }, { 0x2aaf9bd3, "_USERON.EXPIRE" },
47: { 0x2b3c257f, "_CUR_CPS" }, { 0x2c0c389a, "dir" },
48: { 0x2f2dabfc, "f2" }, { 0x30ffd1ff, "cmdline" },
49: { 0x31178ba2, "_NEW_CDT" }, { 0x3178f9d6, "_USERON.COMMENT" },
50: { 0x31bce689, "i1" }, { 0x328ed476, "_USERON.LEVEL" },
51: { 0x32ebcea0, "attr" }, { 0x330c7795, "k" }, { 0x33b51e2b, "p2" },
52: { 0x3461b38c, "o" }, { 0x357b23ee, "total" },
53: { 0x3587ad08, "cursor" }, { 0x36369abd, "g2" },
54: { 0x381d3c2a, "_SYS_STATUS" }, { 0x396b7167, "_NETMAIL_COST" },
55: { 0x39c5daf8, "u3" }, { 0x3a37c26b, "_NODE_EXT" },
56: { 0x3aba3bbe, "g" }, { 0x3c465e6e, "b3" }, { 0x3d39d372, "argc" },
57: { 0x3dc166bb, "path" }, { 0x3dd7ffa7, "c" },
58: { 0x41239e21, "_CONNECTION" }, { 0x4131aa2b, "g3" },
59: { 0x430178ec, "_UQ" }, { 0x4366831a, "n" }, { 0x440b4703, "j" },
60: { 0x44b22ebd, "p3" }, { 0x455cb929, "_FTP_MODE" },
61: { 0x4569c62e, "_EXPIRED_REST" }, { 0x46cd817e, "bytes" },
62: { 0x490873f1, "_USERON.ALIAS" }, { 0x4a16a4ea, "filepos" },
63: { 0x4a9f3955, "_USERON.EMAILS" }, { 0x4ad0cf31, "b" },
64: { 0x4b0aeb24, "_NEW_EXEMPT" }, { 0x4b416ef8, "b2" },
65: { 0x4b8a0705, "connect" }, { 0x4ccb12cc, "l1" },
66: { 0x4db200d2, "_LEECH_PCT" }, { 0x4dbd0b28, "f" },
67: { 0x4ec2ea6e, "u2" }, { 0x4ee1ff3a, "_USERON.LOCATION" },
68: { 0x4f02623a, "_NODE_MINBPS" }, { 0x500a1b4c, "v" },
69: { 0x5053a71b, "z1" }, { 0x50e43799, "argv" }, { 0x525a5fb9, "c2" },
70: { 0x52996eab, "_USERON.TTODAY" }, { 0x55d0238d, "m1" },
71: { 0x55f72de7, "_NEW_FLAGS2" }, { 0x5767df55, "r" },
72: { 0x57d9db2f, "t2" }, { 0x582a9b6a, "f3" }, { 0x5863165a, "fname" },
73: { 0x590175f1, "time" }, { 0x59bc5767, "z" },
74: { 0x5a22d4bd, "_NODEFILE" }, { 0x5aaccfc5, "_ERRNO" },
75: { 0x5b0d0c54, "_USERON.NS_TIME" }, { 0x5be35885, "guest" },
76: { 0x5c1c1500, "_TOS" }, { 0x5da91ffc, "q3" },
77: { 0x5de44e8b, "_USERON.NAME" }, { 0x5e049062, "_QUESTION" },
78: { 0x5e914a47, "nodes_inuse" }, { 0x5eeaff21, "_NETMAIL_MISC" },
79: { 0x606c3d3b, "a2" }, { 0x613b690e, "_ROWS" },
80: { 0x6178e75f, "handle" }, { 0x61be0d36, "_USERON.QWK" },
81: { 0x6265c599, "x1" }, { 0x6392dc62, "_SYS_AUTODEL" },
82: { 0x640f7f81, "addr" }, { 0x65efb9ad, "v2" },
83: { 0x665ac227, "_USERON.CHAT" }, { 0x67b8f67f, "_EXPIRED_FLAGS3" },
84: { 0x67e6410f, "o1" }, { 0x682d973f, "start" },
85: { 0x68b693b2, "name" }, { 0x698d59b4, "_SYS_NODES" },
86: { 0x69d4f019, "ftime" }, { 0x6a1cf9e8, "d3" },
87: { 0x6a9fd069, "LIMIT_REPSIZE" }, { 0x6c8e350a, "_NEW_LEVEL" },
88: { 0x6f9f7d7e, "s3" }, { 0x6fb1c46e, "_SYS_EXP_WARN" },
89: { 0x709c07da, "_NODE_MISC" }, { 0x7166336e, "hubid" },
90: { 0x717231d6, "MAX_REPSIZE" }, { 0x7307c8a9, "e3" },
91: { 0x7342a625, "_NEW_EXPIRE" }, { 0x7345219f, "_NEW_MIN" },
92: { 0x7504b078, "port" }, { 0x75dc4306, "_NEW_PROT" },
93: { 0x761cc978, "rep" }, { 0x76844c3f, "r3" },
94: { 0x78afeaf1, "_SYS_PWDAYS" }, { 0x79f47b28, "attempts" },
95: { 0x7ade6ef8, "local_file" }, { 0x7b1d2087, "_USERON.FLAGS3" },
96: { 0x7b7ef4d8, "y1" }, { 0x7c602a37, "_USERON.MISC" },
97: { 0x7c72376d, "_USERON.TIMEON" }, { 0x7cf488ec, "w2" },
98: { 0x7d0ed0d1, "_CONSOLE" }, { 0x7dd9aac0, "_USERON.LEECH" },
99: { 0x7e29c819, "_SYS_MISC" }, { 0x7efd704e, "n1" },
100: { 0x7fbf958e, "_LNCNTR" }, { 0x81911c52, "s1" },
101: { 0x82d9484e, "_INETMAIL_COST" }, { 0x82f6983b, "int" },
102: { 0x8398e4f0, "j2" }, { 0x83aa2a6a, "_LOGONTIME" },
103: { 0x83dea272, "pasv_mode" }, { 0x841298c4, "d1" },
104: { 0x86cbce1e, "qwk" }, { 0x89b69753, "_EXPIRED_FLAGS1" },
105: { 0x89c91dc8, "_USERON.PWMOD" }, { 0x89e82023, "o3" },
106: { 0x8b12ba9d, "_POSTS_READ" }, { 0x8bf8a29a, "status" },
107: { 0x8c6ba4b5, "x3" }, { 0x8e395209, "_LOGON_FBACKS" },
108: { 0x908ece53, "_USERON.NUMBER" }, { 0x90f31162, "n3" },
109: { 0x90fc82b4, "_CID" }, { 0x9154f82b, "logfile" },
110: { 0x92fb364f, "_USERON.CDT" }, { 0x94d59a7a, "_USERON.BIRTH" },
111: { 0x951341ab, "_USERON.FLAGS1" }, { 0x957095f4, "y3" },
112: { 0x965b713b, "end" }, { 0x979ef1de, "_USERON.HANDLE" },
113: { 0x97f99eef, "_ONLINE" }, { 0x988a2d13, "r1" },
114: { 0x9a13bf95, "_USERON.ETODAY" }, { 0x9a7d9cca, "_LEECH_SEC" },
115: { 0x9a83d5b1, "k2" }, { 0x9aab7a61, "len" }, { 0x9c0bdace, "date" },
116: { 0x9c5051c9, "_LOGON_POSTS" }, { 0x9d09a985, "e1" },
117: { 0x9e70e855, "_USERON.SEX" }, { 0x9e7638c7, "logonlst" },
118: { 0xa0023a2e, "_STARTUP_OPTIONS" }, { 0xa15faa1f, "mode" },
119: { 0xa1f0fcb7, "_NODE_SCRNBLANK" }, { 0xa278584f, "_NEW_MISC" },
120: { 0xa2c573e0, "l3" }, { 0xa3b36a04, "d" },
121: { 0xa4a51044, "bbs_name" }, { 0xa842c43b, "_USERON.ADDRESS" },
122: { 0xa8b5b733, "i2" }, { 0xaa05262f, "h" }, { 0xaabc4f91, "p1" },
123: { 0xabb91f93, "_USERON.DLB" }, { 0xabc4317e, "_USERON.PROT" },
124: { 0xac58736f, "_LOGON_ULS" }, { 0xac72c50b, "_USERON.TEXTRA" },
125: { 0xad1a21f0, "hash_mode" }, { 0xad68e236, "l" },
126: { 0xadae1681, "_NODE_IVT" }, { 0xae256560, "_CUR_RATE" },
127: { 0xae92d249, "_LAST_NS_TIME" }, { 0xaeb16536, "repsize" },
128: { 0xaf3fcb07, "g1" }, { 0xb17e7914, "_NODE_VALUSER" },
129: { 0xb1ae8672, "h2" }, { 0xb1bcba28, "_LOGON_DLS" },
130: { 0xb31b556d, "phone" }, { 0xb3a77ed0, "q1" },
131: { 0xb3f64be4, "_NEW_SHELL" }, { 0xb50cb889, "_NS_TIME" },
132: { 0xb624fa46, "f1" }, { 0xb65dd6d4, "_USERON.ULB" },
133: { 0xb7b2364b, "x" }, { 0xb9603173, "sock" }, { 0xb969be79, "p" },
134: { 0xba0adba4, "file" }, { 0xba483fc2, "tmp" },
135: { 0xbb063bfd, "user" }, { 0xbbde42a1, "m3" },
136: { 0xbc9488d2, "_NEW_FLAGS4" }, { 0xbd1cee5d, "_USERON.LTODAY" },
137: { 0xbda3fa42, "ascii_mode" }, { 0xbe047a60, "t" },
138: { 0xbe5dc637, "z3" }, { 0xbef3c427, "dest" },
139: { 0xbf31a280, "_ANSWERTIME" }, { 0xc0b506dd, "y" },
140: { 0xc1093f61, "_USERON.DLS" }, { 0xc1ea73f2, "bbs_name_length" },
141: { 0xc6a9b6e4, "h3" }, { 0xc6e8539d, "_LOGON_ULB" },
142: { 0xc70d2fc0, "waitforstr" }, { 0xc7e0e8ce, "_USERON.NETMAIL" },
143: { 0xc82ba467, "_LOGON_EMAILS" }, { 0xc8cd5fb7, "_USERON.COMP" },
144: { 0xc9034af6, "u" }, { 0xc9082cbd, "_USERON.PTODAY" },
145: { 0xc95af6a1, "z2" }, { 0xcb530e03, "c1" },
146: { 0xcc7aca99, "_USERON.NOTE" }, { 0xccd97237, "m2" },
147: { 0xccfe7c5d, "_NEW_FLAGS1" }, { 0xcdb7e4a9, "_USERON.PASS" },
148: { 0xce6e8eef, "q" }, { 0xced08a95, "t1" },
149: { 0xcf9ce02c, "_CDT_MIN_VALUE" }, { 0xd0a99c72, "_USERON.MIN" },
150: { 0xd2483f42, "b1" }, { 0xd28e9da9, "debug_mode" },
151: { 0xd3606303, "_USERON.TMPEXT" }, { 0xd3d99e8b, "a" },
152: { 0xd42ccd08, "buf" }, { 0xd4b45a92, "e" }, { 0xd5c24376, "l2" },
153: { 0xd7ae3022, "_USERON.FREECDT" }, { 0xd7cbbbd4, "u1" },
154: { 0xd8222145, "sm" }, { 0xd859385f, "_SYS_DELDAYS" },
155: { 0xd92803bb, "waitforbuf" }, { 0xda6fd2a0, "m" },
156: { 0xdb0c9ada, "_LOGON_DLB" }, { 0xdcedf626, "_USERON.ULS" },
157: { 0xdd0216b9, "i" }, { 0xdd982780, "_SYS_AUTONODE" },
158: { 0xdf391ca7, "_SYS_LASTNODE" }, { 0xdfb287a5, "i3" },
159: { 0xe277a562, "y2" }, { 0xe3920695, "result" },
160: { 0xe51c1956, "_LOGFILE" }, { 0xe558c608, "_INETMAIL_MISC" },
161: { 0xe579b524, "_USERON.FLAGS4" }, { 0xe5fdd956, "w1" },
162: { 0xe7a7fb07, "_NODE_NUM" }, { 0xe7f421f4, "n2" },
163: { 0xeb6c9c73, "_ERRORLEVEL" }, { 0xec2b8fb8, "_USERON.PHONE" },
164: { 0xed84e527, "k3" }, { 0xedc643f1, "_MAX_QWKMSGS" },
165: { 0xedf6aa98, "_USERON.SHELL" }, { 0xf000aa78, "_USERON.ZIPCODE" },
166: { 0xf16182e9, "files" }, { 0xf19cd046, "_WORDWRAP" },
167: { 0xf3f1da99, "password" }, { 0xf49fd466, "j3" },
168: { 0xf53db6c7, "_NODE_SCRNLEN" }, { 0xf6e36607, "src" },
169: { 0xf8e53990, "pass" }, { 0xf9656c81, "a1" },
170: { 0xf9dc63dc, "_EXPIRED_FLAGS4" }, { 0xfa387529, "filename" },
171: { 0xfad17b8e, "flen" }, { 0xfb394e27, "_EXPIRED_LEVEL" },
172: { 0xfb6c9423, "x2" }, { 0xfcb5b274, "_CDT_PER_DOLLAR" },
173: { 0xfce6e817, "v1" }, { 0xfcf3542e, "_MIN_DSPACE" },
174: { 0xfd4b63d7, "htmlfile" }, { 0xfed3115d, "_USERON.REST" },
175: { 0xfeef10b5, "o2" },
176: };
177:
178: #define members(x) (sizeof(x)/sizeof(x[0]))
179:
180: const char *char_table="________________________________________________123456789!_______BCDEFGHIJKLMNOPQRSTUVWXYZ0____A________________________________________________________________________________________________________________________________________________________________";
181: const char *first_char_table="_________________________________________________________________BCDEFGHIJKLMNOPQRSTUVWXYZ!____A________________________________________________________________________________________________________________________________________________________________";
182: unsigned char *brute_buf=NULL;
183: unsigned long *brute_crc_buf=NULL;
184: size_t brute_len=0;
185: char **bruted=NULL;
186: size_t bruted_len=0;
187: char **badbruted=NULL;
188: size_t badbruted_len=0;
189:
190: void add_bruted(unsigned long name, char good, char *val, int save)
191: {
192: char **new_bruted;
193: char *p;
194: FILE *cache;
195:
196: bruted_len++;
197: p=(char *)malloc(strlen(val)+6);
198: if(p==NULL)
199: return;
200: new_bruted=realloc(bruted, sizeof(char *)*bruted_len);
201: if(new_bruted==NULL) {
202: free(p);
203: return;
204: }
205: *(long *)p=name;
206: p[4]=good;
207: strcpy(p+5,val);
208: new_bruted[bruted_len-1]=p;
209: bruted=new_bruted;
210: if(*val && save) {
211: cache=fopen("unbaja.brute","a");
212: if(cache!=NULL) {
213: fprintf(cache,"%08x,%hhd,%s\n",name,good,val);
214: fclose(cache);
215: }
216: }
217: }
218:
219: int check_bruted(long name,char *val)
220: {
221: int i;
222:
223: for(i=0; i<bruted_len; i++) {
224: if(*(long *)bruted[i]==name) {
225: if(!strcmp(val,bruted[i]+5))
226: return(*(bruted[i]+4));
227: }
228: }
229: return(2);
230: }
231:
232: char *find_bruted(long name)
233: {
234: int i;
235:
236: for(i=0; i<bruted_len; i++) {
237: if(*(long *)bruted[i]==name && *(bruted[i]+4))
238: return(bruted[i]+5);
239: }
240: return(NULL);
241: }
242:
243: char* bruteforce(unsigned long name)
244: {
245: long this_crc=0;
246: char *ret;
247: int counter=0;
248: unsigned char *pos;
249: size_t l=0;
250: size_t i,j;
251:
252: if(!brute_len)
253: return(NULL);
254: if((ret=find_bruted(name))!=NULL) {
255: if(!(*ret))
256: return(NULL);
257: return(ret);
258: }
259: memset(brute_buf,0,brute_len+1);
260: memset(brute_crc_buf,0,brute_len*sizeof(long));
261: printf("Brute forcing var_%08x\n",name);
262: this_crc=crc32(brute_buf,0);
263: for(;;) {
264: pos=brute_buf+l;
265: if(pos>brute_buf) {
266: pos--;
267: while(pos>brute_buf) {
268: if(*pos!='9') { /* last char from more_chars */
269: *pos=char_table[*pos];
270: pos++;
271: i=(size_t)(pos-brute_buf);
272: memset(pos,'_',l-i);
273: /* Calculate all the following CRCs */
274: for(i--;brute_buf[i];i++)
275: brute_crc_buf[i]=ucrc32(brute_buf[i],brute_crc_buf[i-1]);
276: goto LOOP_END;
277: }
278: else
279: pos--;
280: }
281: }
282: if(*pos=='Z' || *pos==0) { /* last char from first_chars */
283: /* This the max? */
284: if(l==brute_len) {
285: printf("\r%s Not found.\n",brute_buf);
286: add_bruted(name,1,"",0);
287: return(NULL);
288: }
289: /* Set string to '_' with one extra at end */
290: memset(brute_buf,'_',++l);
291: brute_crc_buf[0]=ucrc32(brute_buf[0],~0UL);
292: for(i=1;brute_buf[i];i++)
293: brute_crc_buf[i]=ucrc32(brute_buf[i],brute_crc_buf[i-1]);
294: /* String is pre-filled with zeros so no need to terminate */
295: goto LOOP_END;
296: }
297: *pos=first_char_table[*pos];
298: memset(brute_buf+1,'_',l-1);
299: brute_crc_buf[0]=ucrc32(brute_buf[0],~0UL);
300: for(i=1;brute_buf[i];i++)
301: brute_crc_buf[i]=ucrc32(brute_buf[i],brute_crc_buf[i-1]);
302:
303: LOOP_END:
304: this_crc=~(brute_crc_buf[l-1]);
305: if(this_crc==name) {
306: switch(check_bruted(name,brute_buf)) {
307: case 0:
308: break;
309: case 2:
310: add_bruted(name,1,brute_buf,1);
311: case 1:
312: goto BRUTE_DONE;
313: }
314: if(check_bruted(name,brute_buf))
315: break;
316: }
317: if(!((++counter)%10000))
318: printf("\r%s ",brute_buf);
319: }
320:
321: BRUTE_DONE:
322: printf("\r%s Found!\n",brute_buf);
323: return(brute_buf);
324: }
325:
326: /* comparison function for var_table */
327: static int vt_compare(const void *key, const void *table) {
328: if (*(unsigned long *)key == (*(struct var_table_t *)table).crc) return 0;
329: if (*(unsigned long *)key < (*(struct var_table_t *)table).crc) return -1;
330: return 1;
331: }
332:
333: char *getvar(long name)
334: {
335: static char varname[20];
336: struct var_table_t *found;
337: char *brute;
338:
339: found = (struct var_table_t *)bsearch( &name, var_table, members( var_table ),
340: sizeof( struct var_table_t ), vt_compare );
341:
342: if (found) {
343: strcpy( varname, (*found).var );
344: } else {
345: brute=bruteforce(name);
346: if(brute)
347: strcpy(varname,brute);
348: else
349: sprintf(varname,"var_%08x",name);
350: }
351:
352: return(varname);
353: }
354:
355: void write_var(FILE *bin, char *src)
356: {
357: long lng;
358:
359: fread(&lng, 1, 4, bin);
360: sprintf(strchr(src,0),"%s ",getvar(lng));
361: }
362:
363: void write_cstr(FILE *bin, char *src)
364: {
365: uchar ch;
366: char* p;
367:
368: strcat(src,"\"");
369: while(fread(&ch,1,1,bin)==1) {
370: if(ch==0)
371: break;
372: if((p=c_escape_char(ch))!=NULL)
373: sprintf(strchr(src,0),"%s",p);
374: else if(ch<' ' || ch > 126)
375: sprintf(strchr(src,0), "\\%03d", ch);
376: else
377: sprintf(strchr(src,0), "%c", ch);
378: }
379: strcat(src,"\" ");
380: }
381:
382: void write_lng(FILE *bin, char *src)
383: {
384: long lng;
385:
386: fread(&lng,4,1,bin);
387: sprintf(strchr(src,0),"%ld ",lng);
388: }
389:
390: void write_short(FILE *bin, char *src)
391: {
392: short sht;
393:
394: fread(&sht,2,1,bin);
395: sprintf(strchr(src,0),"%d ",sht);
396: }
397:
398: void write_ushort(FILE *bin, char *src)
399: {
400: ushort sht;
401:
402: fread(&sht,2,1,bin);
403: sprintf(strchr(src,0),"%d ",sht);
404: }
405:
406: void write_ch(FILE *bin, char *src)
407: {
408: char ch;
409:
410: fread(&ch,1,1,bin);
411: sprintf(strchr(src,0),"%c ",ch);
412: }
413:
414: void write_uchar(FILE *bin, char *src)
415: {
416: uchar uch;
417:
418: fread(&uch,1,1,bin);
419: sprintf(strchr(src,0),"%u ",uch);
420: }
421:
422: void write_logic(FILE *bin, char *src)
423: {
424: char ch;
425: fread(&ch,1,1,bin);
426: if(ch==LOGIC_TRUE)
427: strcat(src,"TRUE ");
428: else
429: strcat(src,"FALSE ");
430: }
431:
432: int write_key(FILE *bin, char *src, int keyset)
433: {
434: uchar uch;
435: fread(&uch,1,1,bin);
436: if(uch==0 && keyset)
437: return(uch);
438: if(uch==CS_DIGIT)
439: strcat(src,"DIGIT");
440: else if(uch==CS_EDIGIT)
441: strcat(src,"EDIGIT");
442: else if(uch==CR)
443: strcat(src,"\\r");
444: else if(uch==LF)
445: strcat(src,"\\n");
446: else if(uch==TAB)
447: strcat(src,"\\t");
448: else if(uch==BS)
449: strcat(src,"\\b");
450: else if(uch==BEL)
451: strcat(src,"\\a");
452: else if(uch==FF)
453: strcat(src,"\\f");
454: else if(uch==11)
455: strcat(src,"\\v");
456: else if(uch & 0x80)
457: sprintf(strchr(src,0),"/%c",uch&0x7f);
458: else if(uch < ' ')
459: sprintf(strchr(src,0),"^%c",uch+0x40);
460: else if(uch=='\\')
461: strcat(src,"'\\'");
462: else if(uch=='^')
463: strcat(src,"'^'");
464: else if(uch=='/')
465: strcat(src,"'/'");
466: else if(uch=='\'')
467: strcat(src,"\\'");
468: else
469: sprintf(strchr(src,0),"%c",uch);
470: if(!keyset)
471: strcat(src," ");
472: return(uch);;
473: }
474:
475: void write_keys(FILE *bin, char *src)
476: {
477: while(write_key(bin,src,TRUE));
478: strcat(src," ");
479: }
480:
481: void eol(char *src)
482: {
483: char *p;
484: p=strchr(src,0);
485: p--;
486: *p='\n';
487: indent+=indenteol;
488: indenteol=0;
489: }
490:
491: #define WRITE_NAME(name) if(indent<0) indent=0; \
492: sprintf(strchr(src,0),"%.*s"name" ",indent,"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t") \
493: /* printf("%s\n",name) */
494:
495:
496: #define KEYS(name) WRITE_NAME(name); \
497: write_keys(bin,src); \
498: eol(src); \
499: break
500:
501: #define KEY(name) WRITE_NAME(name); \
502: write_key(bin,src,FALSE); \
503: eol(src); \
504: break
505:
506: #define LGC(name) WRITE_NAME(name); \
507: write_logic(bin,src); \
508: eol(src); \
509: break
510:
511: #define NONE(name) WRITE_NAME(name); \
512: eol(src); \
513: break
514:
515: #define VAR(name) WRITE_NAME(name); \
516: write_var(bin,src); \
517: eol(src); \
518: break
519:
520: #define CH(name) WRITE_NAME(name); \
521: write_ch(bin,src); \
522: eol(src); \
523: break
524:
525: #define CHCH(name) WRITE_NAME(name); \
526: write_ch(bin,src); \
527: write_ch(bin,src); \
528: eol(src); \
529: break
530:
531: #define UCH(name) WRITE_NAME(name); \
532: write_uchar(bin,src); \
533: eol(src); \
534: break
535:
536: #define UCHUCH(name) WRITE_NAME(name); \
537: write_uchar(bin,src); \
538: write_uchar(bin,src); \
539: eol(src); \
540: break
541:
542: #define SHT(name) WRITE_NAME(name); \
543: write_short(bin,src); \
544: eol(src); \
545: break
546:
547:
548: #define LNG(name) WRITE_NAME(name); \
549: write_lng(bin,src); \
550: eol(src); \
551: break
552:
553: #define STR(name) WRITE_NAME(name); \
554: write_cstr(bin,src); \
555: eol(src); \
556: break
557:
558: #define VARVAR(name) WRITE_NAME(name); \
559: write_var(bin,src); \
560: write_var(bin,src); \
561: eol(src); \
562: break
563:
564: #define VARUCH(name) WRITE_NAME(name); \
565: write_var(bin,src); \
566: write_uchar(bin,src); \
567: eol(src); \
568: break
569:
570: #define VARVARVAR(name) WRITE_NAME(name); \
571: write_var(bin,src); \
572: write_var(bin,src); \
573: write_var(bin,src); \
574: eol(src); \
575: break
576:
577: #define VARSTR(name) WRITE_NAME(name); \
578: write_var(bin,src); \
579: write_cstr(bin,src); \
580: eol(src); \
581: break
582:
583: #define VARLNG(name) WRITE_NAME(name); \
584: write_var(bin,src); \
585: write_lng(bin,src); \
586: eol(src); \
587: break
588:
589: #define MUCH(name) WRITE_NAME(name); \
590: if(usevar) { \
591: sprintf(strchr(src,0),"%s ",getvar(var)); \
592: usevar=FALSE; \
593: fread(buf,1,1,bin); \
594: } else { \
595: write_uchar(bin,src); \
596: } \
597: eol(src); \
598: break
599:
600: #define MSHT(name) WRITE_NAME(name); \
601: if(usevar) { \
602: sprintf(strchr(src,0),"%s ",getvar(var)); \
603: usevar=FALSE; \
604: fread(buf,2,1,bin); \
605: } else { \
606: write_short(bin,src); \
607: } \
608: eol(src); \
609: break
610:
611: #define MVARLNG(name) WRITE_NAME(name); \
612: write_var(bin,src); \
613: if(usevar) { \
614: sprintf(strchr(src,0),"%s ",getvar(var)); \
615: usevar=FALSE; \
616: fread(buf,4,1,bin); \
617: } else { \
618: write_lng(bin,src); \
619: } \
620: eol(src); \
621: break
622:
623: #define MVARSHTUCH(name) WRITE_NAME(name); \
624: write_var(bin,src); \
625: write_short(bin,src); \
626: if(usevar) { \
627: sprintf(strchr(src,0),"%s ",getvar(var)); \
628: usevar=FALSE; \
629: fread(buf,1,1,bin); \
630: } else { \
631: write_uchar(bin,src); \
632: } \
633: eol(src); \
634: break
635:
636: #define MVARSHT(name) WRITE_NAME(name); \
637: write_var(bin,src); \
638: if(usevar) { \
639: sprintf(strchr(src,0),"%s ",getvar(var)); \
640: usevar=FALSE; \
641: fread(buf,2,1,bin); \
642: } else { \
643: write_short(bin,src); \
644: } \
645: eol(src); \
646: break
647:
648: #define MVARUCH(name) WRITE_NAME(name); \
649: write_var(bin,src); \
650: if(usevar) { \
651: sprintf(strchr(src,0),"%s ",getvar(var)); \
652: usevar=FALSE; \
653: fread(buf,1,1,bin); \
654: } else { \
655: write_uchar(bin,src); \
656: } \
657: eol(src); \
658: break
659:
660: #define MVARVARNZUST(name) WRITE_NAME(name); \
661: write_var(bin,src); \
662: write_var(bin,src); \
663: if(usevar) { \
664: sprintf(strchr(src,0),"%s ",getvar(var)); \
665: usevar=FALSE; \
666: fread(buf,2,1,bin); \
667: } else { \
668: fread(&ush, 2, 1, bin); \
669: if(ush) \
670: sprintf(strchr(src,0),"%u ",ush); \
671: } \
672: eol(src); \
673: break
674:
675: #define MVARVARUST(name) WRITE_NAME(name); \
676: write_var(bin,src); \
677: write_var(bin,src); \
678: if(usevar) { \
679: sprintf(strchr(src,0),"%s ",getvar(var)); \
680: usevar=FALSE; \
681: fread(buf,2,1,bin); \
682: } else { \
683: write_ushort(bin,src); \
684: } \
685: eol(src); \
686: break
687:
688: #define MVARUSTVAR(name) WRITE_NAME(name); \
689: write_var(bin,src); \
690: if(usevar) { \
691: sprintf(strchr(src,0),"%s ",getvar(var)); \
692: usevar=FALSE; \
693: fread(buf,2,1,bin); \
694: } else { \
695: write_ushort(bin,src); \
696: } \
697: write_var(bin,src); \
698: eol(src); \
699: break
700:
701: #define MVARUSTSTR(name) WRITE_NAME(name); \
702: write_var(bin,src); \
703: if(usevar) { \
704: sprintf(strchr(src,0),"%s ",getvar(var)); \
705: usevar=FALSE; \
706: fread(buf,2,1,bin); \
707: } else { \
708: write_ushort(bin,src); \
709: } \
710: write_cstr(bin,src); \
711: eol(src); \
712: break
713:
714: #define MLNG(name) WRITE_NAME(name); \
715: if(usevar) { \
716: sprintf(strchr(src,0),"%s ",getvar(var)); \
717: usevar=FALSE; \
718: fread(buf,4,1,bin); \
719: } else { \
720: write_lng(bin,src); \
721: } \
722: eol(src); \
723: break
724:
725: #define MLNGVAR(name) WRITE_NAME(name); \
726: if(usevar) { \
727: sprintf(strchr(src,0),"%s ",getvar(var)); \
728: usevar=FALSE; \
729: fread(buf,4,1,bin); \
730: } else { \
731: write_lng(bin,src); \
732: } \
733: write_var(bin,src); \
734: eol(src); \
735: break
736:
737: #define MSHTSTR(name) WRITE_NAME(name); \
738: if(usevar) { \
739: sprintf(strchr(src,0),"%s ",getvar(var)); \
740: usevar=FALSE; \
741: fread(buf,2,1,bin); \
742: } else { \
743: write_short(bin,src); \
744: } \
745: write_cstr(bin,src); \
746: eol(src); \
747: break
748:
749: #define MLNGSTR(name) WRITE_NAME(name); \
750: if(usevar) { \
751: sprintf(strchr(src,0),"%s ",getvar(var)); \
752: usevar=FALSE; \
753: fread(buf,4,1,bin); \
754: } else { \
755: write_lng(bin,src); \
756: } \
757: write_cstr(bin,src); \
758: eol(src); \
759: break
760:
761: #define MVARLNGLNG(name) WRITE_NAME(name); \
762: write_var(bin,src); \
763: if(usevar) { \
764: sprintf(strchr(src,0),"%s ",getvar(var)); \
765: usevar=FALSE; \
766: fread(buf,4,1,bin); \
767: } else { \
768: write_lng(bin,src); \
769: } \
770: write_lng(bin,src); \
771: eol(src); \
772: break
773:
774: #define MVARUCHLNG(name) WRITE_NAME(name); \
775: write_var(bin,src); \
776: if(usevar) { \
777: sprintf(strchr(src,0),"%s ",getvar(var)); \
778: usevar=FALSE; \
779: fread(buf,1,1,bin); \
780: } else { \
781: write_uchar(bin,src); \
782: } \
783: write_lng(bin,src); \
784: eol(src); \
785: break
786:
787: #define MVARCH(name) WRITE_NAME(name); \
788: write_var(bin,src); \
789: if(usevar) { \
790: sprintf(strchr(src,0),"%s ",getvar(var)); \
791: usevar=FALSE; \
792: fread(buf,1,1,bin); \
793: } else { \
794: write_ch(bin,src); \
795: } \
796: eol(src); \
797: break
798:
799: #define VARSTRVAR(name) WRITE_NAME(name); \
800: write_var(bin,src); \
801: write_cstr(bin,src); \
802: write_var(bin,src); \
803: eol(src); \
804: break
805:
806: #define UCHVARSTR(name) WRITE_NAME(name); \
807: write_uchar(bin,src); \
808: write_var(bin,src); \
809: write_cstr(bin,src); \
810: eol(src); \
811: break
812:
813: #define UCHVARVAR(name) WRITE_NAME(name); \
814: write_uchar(bin,src); \
815: write_var(bin,src); \
816: write_var(bin,src); \
817: eol(src); \
818: break
819:
820: #define UCHVAR(name) WRITE_NAME(name); \
821: write_uchar(bin,src); \
822: write_var(bin,src); \
823: eol(src); \
824: break
825:
826: #define UCHSTR(name) WRITE_NAME(name); \
827: write_uchar(bin,src); \
828: write_cstr(bin,src); \
829: eol(src); \
830: break
831:
832: #define CHSTR(name) WRITE_NAME(name); \
833: write_ch(bin,src); \
834: write_cstr(bin,src); \
835: eol(src); \
836: break
837:
838: #define VARCH(name) WRITE_NAME(name); \
839: write_var(bin,src); \
840: write_ch(bin,src); \
841: eol(src); \
842: break
843:
844: #define CHVAR(name) WRITE_NAME(name); \
845: write_ch(bin,src); \
846: write_var(bin,src); \
847: eol(src); \
848: break
849:
850: #define VARVARSHT(name) WRITE_NAME(name); \
851: write_var(bin,src); \
852: write_var(bin,src); \
853: write_short(bin,src);\
854: eol(src); \
855: break
856:
857: #define VARVARUST(name) WRITE_NAME(name); \
858: write_var(bin,src); \
859: write_var(bin,src); \
860: write_ushort(bin,src);\
861: eol(src); \
862: break
863:
864: char *decompile_ars(uchar *ars, int len)
865: {
866: static char buf[1024];
867: char *out;
868: uchar *in;
869: uint artype;
870: uint n;
871: int equals=0;
872: int not=0;
873:
874: out=buf;
875: buf[0]=0;
876: for(in=ars;in<ars+len;in++) {
877: switch(*in) {
878: case AR_NULL:
879: break;
880: case AR_OR:
881: *(out++)='|';
882: artype=*in;
883: break;
884: case AR_NOT:
885: not=1;
886: break;
887: case AR_EQUAL:
888: equals=1;
889: break;
890: case AR_BEGNEST:
891: if(not)
892: *(out++)='!';
893: not=0;
894: *(out++)='(';
895: artype=*in;
896: break;
897: case AR_ENDNEST:
898: *(out++)=')';
899: artype=*in;
900: break;
901: case AR_LEVEL:
902: *(out++)='$';
903: *(out++)='L';
904: artype=*in;
905: break;
906: case AR_AGE:
907: *(out++)='$';
908: *(out++)='A';
909: artype=*in;
910: break;
911: case AR_BPS:
912: *(out++)='$';
913: *(out++)='B';
914: artype=*in;
915: break;
916: case AR_NODE:
917: *(out++)='$';
918: *(out++)='N';
919: artype=*in;
920: break;
921: case AR_TLEFT:
922: *(out++)='$';
923: *(out++)='R';
924: artype=*in;
925: break;
926: case AR_TUSED:
927: *(out++)='$';
928: *(out++)='O';
929: artype=*in;
930: break;
931: case AR_USER:
932: *(out++)='$';
933: *(out++)='U';
934: artype=*in;
935: break;
936: case AR_TIME:
937: *(out++)='$';
938: *(out++)='T';
939: artype=*in;
940: break;
941: case AR_PCR:
942: *(out++)='$';
943: *(out++)='P';
944: artype=*in;
945: break;
946: case AR_FLAG1:
947: *(out++)='$';
948: *(out++)='F';
949: *(out++)='1';
950: artype=*in;
951: break;
952: case AR_FLAG2:
953: *(out++)='$';
954: *(out++)='F';
955: *(out++)='2';
956: artype=*in;
957: break;
958: case AR_FLAG3:
959: *(out++)='$';
960: *(out++)='F';
961: *(out++)='3';
962: artype=*in;
963: break;
964: case AR_FLAG4:
965: *(out++)='$';
966: *(out++)='F';
967: *(out++)='4';
968: artype=*in;
969: break;
970: case AR_EXEMPT:
971: *(out++)='$';
972: *(out++)='X';
973: artype=*in;
974: break;
975: case AR_REST:
976: *(out++)='$';
977: *(out++)='Z';
978: artype=*in;
979: break;
980: case AR_SEX:
981: *(out++)='$';
982: *(out++)='S';
983: artype=*in;
984: break;
985: case AR_UDR:
986: *(out++)='$';
987: *(out++)='K';
988: artype=*in;
989: break;
990: case AR_UDFR:
991: *(out++)='$';
992: *(out++)='D';
993: artype=*in;
994: break;
995: case AR_EXPIRE:
996: *(out++)='$';
997: *(out++)='E';
998: artype=*in;
999: break;
1000: case AR_CREDIT:
1001: *(out++)='$';
1002: *(out++)='C';
1003: artype=*in;
1004: break;
1005: case AR_DAY:
1006: *(out++)='$';
1007: *(out++)='W';
1008: artype=*in;
1009: break;
1010: case AR_ANSI:
1011: if(not)
1012: *(out++)='!';
1013: not=0;
1014: *(out++)='$';
1015: *(out++)='[';
1016: artype=*in;
1017: break;
1018: case AR_RIP:
1019: if(not)
1020: *(out++)='!';
1021: not=0;
1022: *(out++)='$';
1023: *(out++)='*';
1024: artype=*in;
1025: break;
1026: case AR_LOCAL:
1027: if(not)
1028: *(out++)='!';
1029: not=0;
1030: *(out++)='$';
1031: *(out++)='G';
1032: artype=*in;
1033: break;
1034: case AR_GROUP:
1035: *(out++)='$';
1036: *(out++)='M';
1037: artype=*in;
1038: break;
1039: case AR_SUB:
1040: *(out++)='$';
1041: *(out++)='H';
1042: artype=*in;
1043: break;
1044: case AR_LIB:
1045: *(out++)='$';
1046: *(out++)='I';
1047: artype=*in;
1048: break;
1049: case AR_DIR:
1050: *(out++)='$';
1051: *(out++)='J';
1052: artype=*in;
1053: break;
1054: case AR_EXPERT :
1055: if(not)
1056: *(out++)='!';
1057: not=0;
1058: *out=0;
1059: strcat(out,"EXPERT");
1060: out=strchr(buf,0);
1061: artype=*in;
1062: break;
1063: case AR_SYSOP:
1064: if(not)
1065: *(out++)='!';
1066: not=0;
1067: *out=0;
1068: strcat(out,"SYSOP");
1069: out=strchr(buf,0);
1070: artype=*in;
1071: break;
1072: case AR_QUIET:
1073: if(not)
1074: *(out++)='!';
1075: not=0;
1076: *out=0;
1077: strcat(out,"QUIET");
1078: out=strchr(buf,0);
1079: artype=*in;
1080: break;
1081: case AR_MAIN_CMDS:
1082: *out=0;
1083: strcat(out,"MAIN_CMDS");
1084: out=strchr(buf,0);
1085: artype=*in;
1086: break;
1087: case AR_FILE_CMDS:
1088: *out=0;
1089: strcat(out,"FILE_CMDS");
1090: out=strchr(buf,0);
1091: artype=*in;
1092: break;
1093: case AR_RANDOM:
1094: *(out++)='$';
1095: *(out++)='Q';
1096: artype=*in;
1097: break;
1098: case AR_LASTON:
1099: *(out++)='$';
1100: *(out++)='Y';
1101: artype=*in;
1102: break;
1103: case AR_LOGONS:
1104: *(out++)='$';
1105: *(out++)='V';
1106: artype=*in;
1107: break;
1108: case AR_WIP:
1109: if(not)
1110: *(out++)='!';
1111: not=0;
1112: *out=0;
1113: strcat(out,"WIP");
1114: out=strchr(buf,0);
1115: artype=*in;
1116: break;
1117: case AR_SUBCODE:
1118: *out=0;
1119: strcat(out,"SUBCODE");
1120: out=strchr(buf,0);
1121: artype=*in;
1122: break;
1123: case AR_DIRCODE:
1124: *out=0;
1125: strcat(out,"DIRCODE");
1126: out=strchr(buf,0);
1127: artype=*in;
1128: break;
1129: case AR_OS2:
1130: if(not)
1131: *(out++)='!';
1132: not=0;
1133: *out=0;
1134: strcat(out,"OS2");
1135: out=strchr(buf,0);
1136: artype=*in;
1137: break;
1138: case AR_DOS:
1139: if(not)
1140: *(out++)='!';
1141: not=0;
1142: *out=0;
1143: strcat(out,"DOS");
1144: out=strchr(buf,0);
1145: artype=*in;
1146: break;
1147: case AR_WIN32:
1148: if(not)
1149: *(out++)='!';
1150: not=0;
1151: *out=0;
1152: strcat(out,"WIN32");
1153: out=strchr(buf,0);
1154: artype=*in;
1155: break;
1156: case AR_UNIX:
1157: if(not)
1158: *(out++)='!';
1159: not=0;
1160: *out=0;
1161: strcat(out,"UNIX");
1162: out=strchr(buf,0);
1163: artype=*in;
1164: break;
1165: case AR_LINUX :
1166: if(not)
1167: *(out++)='!';
1168: not=0;
1169: *out=0;
1170: strcat(out,"LINUX");
1171: out=strchr(buf,0);
1172: artype=*in;
1173: break;
1174: case AR_SHELL:
1175: *out=0;
1176: strcat(out,"SHELL");
1177: out=strchr(buf,0);
1178: artype=*in;
1179: break;
1180: case AR_PROT:
1181: if(not)
1182: *(out++)='!';
1183: not=0;
1184: *out=0;
1185: strcat(out,"PROT");
1186: out=strchr(buf,0);
1187: artype=*in;
1188: break;
1189: case AR_GUEST:
1190: if(not)
1191: *(out++)='!';
1192: not=0;
1193: *out=0;
1194: strcat(out,"GUEST");
1195: out=strchr(buf,0);
1196: artype=*in;
1197: break;
1198: case AR_QNODE:
1199: if(not)
1200: *(out++)='!';
1201: not=0;
1202: *out=0;
1203: strcat(out,"QNODE");
1204: out=strchr(buf,0);
1205: artype=*in;
1206: break;
1207: default:
1208: printf("Error decoding ARS!\n");
1209: return("Unknown ARS String");
1210: }
1211: switch(*in) {
1212: case AR_TIME:
1213: if(not)
1214: *(out++)='!';
1215: if(equals)
1216: *(out++)='=';
1217: not=equals=0;
1218: in++;
1219: n=*((short *)in);
1220: in++;
1221: out+=sprintf(out,"%02d:%02d",n/60,n%60);
1222: break;
1223: case AR_AGE: /* byte operands */
1224: case AR_PCR:
1225: case AR_UDR:
1226: case AR_UDFR:
1227: case AR_NODE:
1228: case AR_LEVEL:
1229: case AR_TLEFT:
1230: case AR_TUSED:
1231: if(not)
1232: *(out++)='!';
1233: if(equals)
1234: *(out++)='=';
1235: not=equals=0;
1236: in++;
1237: out+=sprintf(out,"%d",*in);
1238: break;
1239: case AR_BPS: /* int operands */
1240: case AR_MAIN_CMDS:
1241: case AR_FILE_CMDS:
1242: case AR_EXPIRE:
1243: case AR_CREDIT:
1244: case AR_USER:
1245: case AR_RANDOM:
1246: case AR_LASTON:
1247: case AR_LOGONS:
1248: if(not)
1249: *(out++)='!';
1250: if(equals)
1251: *(out++)='=';
1252: not=equals=0;
1253: in++;
1254: n=*((short *)in);
1255: in++;
1256: out+=sprintf(out,"%d",n);
1257: break;
1258: case AR_GROUP:
1259: case AR_LIB:
1260: case AR_DIR:
1261: case AR_SUB:
1262: if(not)
1263: *(out++)='!';
1264: if(equals)
1265: *(out++)='=';
1266: not=equals=0;
1267: in++;
1268: n=*((short *)in);
1269: n++; /* convert from to 0 base */
1270: in++;
1271: out+=sprintf(out,"%d",n);
1272: break;
1273: case AR_SUBCODE:
1274: case AR_DIRCODE:
1275: case AR_SHELL:
1276: if(not)
1277: *(out++)='!';
1278: if(equals)
1279: *(out++)='=';
1280: not=equals=0;
1281: in++;
1282: n=sprintf(out,"%s ",in);
1283: out+=n;
1284: in+=n-1;
1285: break;
1286: case AR_FLAG1:
1287: case AR_FLAG2:
1288: case AR_FLAG3:
1289: case AR_FLAG4:
1290: case AR_EXEMPT:
1291: case AR_SEX:
1292: case AR_REST:
1293: if(not)
1294: *(out++)='!';
1295: if(equals)
1296: *(out++)='=';
1297: not=equals=0;
1298: in++;
1299: *(out++)=*in;
1300: break;
1301: }
1302: }
1303: *out=0;
1304: return(buf);
1305: }
1306:
1307: void decompile(FILE *bin, FILE *srcfile)
1308: {
1309: int i;
1310: char ch;
1311: uchar uch;
1312: ushort ush;
1313: long lng;
1314: long lng2;
1315: int usevar=FALSE;
1316: long var=0;
1317: char buf[80];
1318: char *p;
1319: char src[2048];
1320: int redo=FALSE;
1321: char *labels;
1322: size_t currpos=0;
1323:
1324: currpos=filelength(fileno(bin));
1325: labels=(char *)calloc(1,filelength(fileno(bin)));
1326: if(labels==NULL) {
1327: printf("ERROR allocating memory for labels\n");
1328: return;
1329: }
1330: while(1) {
1331: currpos=ftell(bin);
1332:
1333: if(fread(&uch,1,1,bin)!=1) {
1334: if(redo)
1335: break;
1336: redo=TRUE;
1337: printf("Second pass...\n");
1338: rewind(bin);
1339: continue;
1340: }
1341: src[0]=0;
1342: if(labels[currpos])
1343: sprintf(src,":label_%04x\n",currpos);
1344: switch(uch) {
1345: case CS_USE_INT_VAR:
1346: usevar=TRUE;
1347: fread(&var,4,1,bin);
1348: fread(&buf,2,1,bin); /* offset/length */
1349: continue;
1350: case CS_VAR_INSTRUCTION:
1351: fread(&uch,1,1,bin);
1352: switch(uch) {
1353: case SHOW_VARS:
1354: WRITE_NAME("SHOW_VARS");
1355: eol(src);
1356: break;
1357: case PRINT_VAR:
1358: VAR("PRINT");
1359: case VAR_PRINTF:
1360: case VAR_PRINTF_LOCAL:
1361: if(uch==VAR_PRINTF) {
1362: WRITE_NAME("PRINTF");
1363: }
1364: else {
1365: WRITE_NAME("LPRINTF");
1366: }
1367: write_cstr(bin,src);
1368: fread(&uch, 1, 1, bin);
1369: for(i=0; i<uch; i++) {
1370: write_var(bin,src);
1371: }
1372: eol(src);
1373: break;
1374: case DEFINE_STR_VAR:
1375: VAR("STR");
1376: case DEFINE_INT_VAR:
1377: VAR("INT");
1378: case DEFINE_GLOBAL_STR_VAR:
1379: VAR("GLOBAL_STR");
1380: case DEFINE_GLOBAL_INT_VAR:
1381: VAR("GLOBAL_INT");
1382: case SET_STR_VAR:
1383: VARSTR("SET");
1384: case SET_INT_VAR:
1385: VARLNG("SET");
1386: case COMPARE_STR_VAR:
1387: VARSTR("COMPARE");
1388: case COMPARE_INT_VAR:
1389: VARLNG("COMPARE");
1390: case STRNCMP_VAR:
1391: UCHVARSTR("STRNCMP");
1392: case STRSTR_VAR:
1393: VARSTR("STRSTR");
1394: case COMPARE_VARS:
1395: VARVAR("COMPARE");
1396: case STRNCMP_VARS:
1397: UCHVARVAR("STRNCMP");
1398: case STRSTR_VARS:
1399: VARVAR("STRSTR");
1400: case COPY_VAR:
1401: VARVAR("COPY");
1402: case SWAP_VARS:
1403: VARVAR("SWAP");
1404: case CAT_STR_VAR:
1405: VARSTR("STRCAT");
1406: case CAT_STR_VARS:
1407: VARVAR("STRCAT");
1408: case FORMAT_STR_VAR:
1409: WRITE_NAME("SPRINTF");
1410: write_var(bin,src);
1411: write_cstr(bin,src);
1412: fread(&uch, 1, 1, bin);
1413: for(i=0; i<uch; i++) {
1414: write_var(bin,src);
1415: }
1416: eol(src);
1417: break;
1418: case TIME_STR:
1419: VARVAR("TIME_STR");
1420: case DATE_STR:
1421: VARVAR("DATE_STR");
1422: case FORMAT_TIME_STR:
1423: VARSTRVAR("STRFTIME");
1424: case SECOND_STR:
1425: VARVAR("SECOND_STR");
1426: case STRUPR_VAR:
1427: VAR("STRUPR");
1428: case STRLWR_VAR:
1429: VAR("STRLWR");
1430: case ADD_INT_VAR:
1431: VARLNG("ADD");
1432: case ADD_INT_VARS:
1433: VARVAR("ADD");
1434: case SUB_INT_VAR:
1435: VARLNG("SUB");
1436: case SUB_INT_VARS:
1437: VARVAR("SUB");
1438: case MUL_INT_VAR:
1439: VARLNG("MUL");
1440: case MUL_INT_VARS:
1441: VARVAR("MUL");
1442: case DIV_INT_VAR:
1443: VARLNG("DIV");
1444: case DIV_INT_VARS:
1445: VARVAR("DIV");
1446: case MOD_INT_VAR:
1447: VARLNG("MOD");
1448: case MOD_INT_VARS:
1449: VARVAR("MOD");
1450: case AND_INT_VAR:
1451: VARLNG("AND");
1452: case AND_INT_VARS:
1453: VARVAR("AND");
1454: case COMPARE_ANY_BITS:
1455: MVARLNG("COMPARE_ANY_BITS");
1456: case COMPARE_ALL_BITS:
1457: MVARLNG("COMPARE_ALL_BITS");
1458: case OR_INT_VAR:
1459: VARLNG("OR");
1460: case OR_INT_VARS:
1461: VARLNG("OR");
1462: case NOT_INT_VAR:
1463: VARLNG("NOT");
1464: case NOT_INT_VARS:
1465: VARVAR("NOT");
1466: case XOR_INT_VAR:
1467: VARLNG("XOR");
1468: case XOR_INT_VARS:
1469: VARVAR("XOR");
1470: case RANDOM_INT_VAR:
1471: MVARLNG("RANDOM");
1472: case TIME_INT_VAR:
1473: VAR("TIME");
1474: case DATE_STR_TO_INT:
1475: VARVAR("DATE_INT");
1476: case STRLEN_INT_VAR:
1477: VARVAR("STRLEN");
1478: case CRC16_TO_INT:
1479: VARVAR("CRC16");
1480: case CRC32_TO_INT:
1481: VARVAR("CRC32");
1482: case FLENGTH_TO_INT:
1483: VARVAR("GET_FILE_LENGTH");
1484: case CHARVAL_TO_INT:
1485: VARVAR("CHARVAL");
1486: case GETNUM_VAR:
1487: MVARSHT("GETNUM");
1488: case GETSTR_VAR:
1489: MVARUCH("GETSTR");
1490: case GETNAME_VAR:
1491: MVARUCH("GETNAME");
1492: case GETSTRUPR_VAR:
1493: MVARUCH("GETSTRUPR");
1494: case GETLINE_VAR:
1495: MVARUCH("GETLINE");
1496: case SHIFT_STR_VAR:
1497: MVARUCH("SHIFT_STR");
1498: case GETSTR_MODE:
1499: MVARUCHLNG("GETSTR");
1500: case TRUNCSP_STR_VAR:
1501: VAR("TRUNCSP");
1502: case CHKFILE_VAR:
1503: VAR("CHKFILE");
1504: case PRINTFILE_VAR_MODE:
1505: MVARSHT("PRINTFILE");
1506: case PRINTTAIL_VAR_MODE:
1507: MVARSHTUCH("PRINTTAIL");
1508: case CHKSUM_TO_INT:
1509: VARVAR("CHKSUM");
1510: case STRIP_CTRL_STR_VAR:
1511: VAR("STRIP_CTRL");
1512: case SEND_FILE_VIA:
1513: CHSTR("SEND_FILE_VIA");
1514: case SEND_FILE_VIA_VAR:
1515: CHVAR("SEND_FILE_VIA");
1516: case FTIME_TO_INT:
1517: VARVAR("GET_FILE_TIME");
1518: case RECEIVE_FILE_VIA:
1519: CHSTR("RECEIVE_FILE_VIA");
1520: case RECEIVE_FILE_VIA_VAR:
1521: CHVAR("RECEIVE_FILE_VIA");
1522: case TELNET_GATE_STR: /* TELNET_GATE reverses argument order */
1523: WRITE_NAME("TELNET_GATE");
1524: fread(&lng,4,1,bin);
1525: write_cstr(bin,src);
1526: if(usevar) {
1527: sprintf(strchr(src,0),"%s ",getvar(var));
1528: usevar=FALSE;
1529: } else {
1530: sprintf(strchr(src,0),"%ld ",lng);
1531: }
1532: eol(src);
1533: break;
1534: case TELNET_GATE_VAR: /* TELNET_GATE reverses argument order */
1535: WRITE_NAME("TELNET_GATE");
1536: fread(&lng,4,1,bin);
1537: fread(&lng2, 1, 4, bin);
1538: sprintf(strchr(src,0),"%s ",getvar(lng2));
1539: if(usevar) {
1540: sprintf(strchr(src,0),"%s ",getvar(var));
1541: usevar=FALSE;
1542: } else {
1543: sprintf(strchr(src,0),"%ld ",lng);
1544: }
1545: eol(src);
1546: break;
1547: case COPY_FIRST_CHAR:
1548: VARVAR("COPY_FIRST_CHAR");
1549: case COMPARE_FIRST_CHAR:
1550: VARUCH("COMPARE_FIRST_CHAR");
1551: case COPY_CHAR:
1552: VAR("COPY_CHAR");
1553: case SHIFT_TO_FIRST_CHAR:
1554: MVARUCH("SHIFT_TO_FIRST_CHAR");
1555: case SHIFT_TO_LAST_CHAR:
1556: MVARUCH("SHIFT_TO_LAST_CHAR");
1557: case MATCHUSER:
1558: VARVAR("MATCHUSER");
1559: default:
1560: printf("ERROR! Unknown variable-length instruction: %02x%02X\n",CS_VAR_INSTRUCTION,uch);
1561: printf("Cannot continue.\n");
1562: free(labels);
1563: return;
1564: }
1565: break;
1566: case CS_IF_TRUE:
1567: indenteol=1;
1568: NONE("IF_TRUE");
1569: case CS_IF_FALSE:
1570: indenteol=1;
1571: NONE("IF_FALSE");
1572: case CS_ELSE:
1573: indent--;
1574: indenteol=1;
1575: NONE("ELSE");
1576: case CS_ENDIF:
1577: indent--;
1578: NONE("END_IF");
1579: case CS_CMD_HOME:
1580: NONE("CMD_HOME");
1581: case CS_CMD_POP:
1582: NONE("CMD_POP");
1583: case CS_END_CMD:
1584: indent--;
1585: NONE("END_CMD");
1586: case CS_RETURN:
1587: NONE("RETURN");
1588: case CS_GETKEY:
1589: NONE("GETKEY");
1590: case CS_GETKEYE:
1591: NONE("GETKEYE");
1592: case CS_UNGETKEY:
1593: NONE("UNGETKEY");
1594: case CS_UNGETSTR:
1595: NONE("UNGETSTR");
1596: case CS_PRINTKEY:
1597: NONE("PRINTKEY");
1598: case CS_PRINTSTR:
1599: NONE("PRINTSTR");
1600: case CS_HANGUP:
1601: NONE("HANGUP");
1602: case CS_SYNC:
1603: NONE("SYNC");
1604: case CS_ASYNC:
1605: NONE("ASYNC");
1606: case CS_CHKSYSPASS:
1607: NONE("CHKSYSPASS");
1608: case CS_LOGKEY:
1609: NONE("LOGKEY");
1610: case CS_LOGKEY_COMMA:
1611: NONE("LOGKEY_COMMA");
1612: case CS_LOGSTR:
1613: NONE("LOGSTR");
1614: case CS_CLS:
1615: NONE("CLS");
1616: case CS_CRLF:
1617: NONE("CRLF");
1618: case CS_PAUSE:
1619: NONE("PAUSE");
1620: case CS_PAUSE_RESET:
1621: NONE("PAUSE_RESET");
1622: case CS_GETLINES:
1623: NONE("GETLINES");
1624: case CS_GETFILESPEC:
1625: NONE("GETFILESPEC");
1626: case CS_FINDUSER:
1627: NONE("FINDUSER");
1628: case CS_CLEAR_ABORT:
1629: NONE("CLEAR_ABORT");
1630: case CS_SELECT_SHELL:
1631: NONE("SELECT_SHELL");
1632: case CS_SET_SHELL:
1633: NONE("SET_SHELL");
1634: case CS_SELECT_EDITOR:
1635: NONE("SELECT_EDITOR");
1636: case CS_SET_EDITOR:
1637: NONE("SET_EDITOR");
1638: case CS_INKEY:
1639: NONE("INKEY");
1640: case CS_INCHAR:
1641: NONE("INCHAR");
1642: case CS_GETTIMELEFT:
1643: NONE("GETTIMELEFT");
1644: case CS_SAVELINE:
1645: NONE("SAVELINE");
1646: case CS_RESTORELINE:
1647: NONE("RESTORELINE");
1648: case CS_IF_GREATER:
1649: indenteol=1;
1650: NONE("IF_GREATER");
1651: case CS_IF_GREATER_OR_EQUAL:
1652: indenteol=1;
1653: NONE("IF_GREATER_OR_EQUAL");
1654: case CS_IF_LESS:
1655: indenteol=1;
1656: NONE("IF_LESS");
1657: case CS_IF_LESS_OR_EQUAL:
1658: indenteol=1;
1659: NONE("IF_LESS_OR_EQUAL");
1660: case CS_DEFAULT:
1661: indenteol=1;
1662: NONE("DEFAULT");
1663: case CS_END_SWITCH:
1664: indent--;
1665: NONE("END_SWITCH");
1666: case CS_END_CASE:
1667: indent--;
1668: NONE("END_CASE");
1669: case CS_PUT_NODE:
1670: NONE("PUT_NODE");
1671: case CS_GETCHAR:
1672: NONE("GETCHAR");
1673: case CS_ONE_MORE_BYTE:
1674: fread(&uch,1,1,bin);
1675: switch(uch) {
1676: case CS_ONLINE:
1677: NONE("ONLINE");
1678: case CS_OFFLINE:
1679: NONE("OFFLINE");
1680: case CS_NEWUSER:
1681: NONE("NEWUSER");
1682: case CS_LOGON:
1683: NONE("LOGON");
1684: case CS_LOGOUT:
1685: NONE("LOGOUT");
1686: case CS_EXIT:
1687: NONE("EXIT");
1688: case CS_LOOP_BEGIN:
1689: indenteol=1;
1690: NONE("LOOP_BEGIN");
1691: case CS_CONTINUE_LOOP:
1692: NONE("CONTINUE_LOOP");
1693: case CS_BREAK_LOOP:
1694: NONE("BREAK_LOOP");
1695: case CS_END_LOOP:
1696: indent--;
1697: NONE("END_LOOP");
1698: default:
1699: printf("ERROR! Unknown one-byte instruction: %02x%02X\n",CS_ONE_MORE_BYTE,uch);
1700: }
1701: break;
1702: case CS_CMDKEY:
1703: indenteol=1;
1704: KEY("CMDKEY");
1705: case CS_NODE_ACTION:
1706: MUCH("NODE_ACTION");
1707: case CS_GETSTR:
1708: MUCH("GETSTR");
1709: case CS_GETNAME:
1710: MUCH("GETNAME");
1711: case CS_GETSTRUPR:
1712: MUCH("GETSTRUPR");
1713: case CS_SHIFT_STR:
1714: MUCH("SHIFT_STR");
1715: case CS_COMPARE_KEY:
1716: KEY("COMPARE_KEY");
1717: case CS_SETLOGIC:
1718: LGC("SETLOGIC");
1719: case CS_SET_USER_LEVEL:
1720: MUCH("SET_USER_LEVEL");
1721: case CS_SET_USER_STRING:
1722: MUCH("SET_USER_STRING");
1723: case CS_GETLINE:
1724: MUCH("GETLINE");
1725: case CS_NODE_STATUS:
1726: MUCH("NODE_STATUS");
1727: case CS_CMDCHAR:
1728: indenteol=1;
1729: CH("CMDCHAR");
1730: case CS_COMPARE_CHAR:
1731: CH("COMPARE_CHAR");
1732: case CS_MULTINODE_CHAT:
1733: MUCH("MULTINODE_CHAT");
1734: case CS_TWO_MORE_BYTES:
1735: fread(&uch,1,1,bin);
1736: switch(uch) {
1737: case CS_USER_EVENT:
1738: MUCH("USER_EVENT");
1739: default:
1740: printf("ERROR! Unknown two-byte instruction: %02x%02X\n",CS_ONE_MORE_BYTE,uch);
1741: }
1742: break;
1743: case CS_GOTO:
1744: fread(&ush,2,1,bin);
1745: labels[ush]=TRUE;
1746: WRITE_NAME("GOTO");
1747: sprintf(strchr(src,0),"label_%04x ",ush);
1748: eol(src);
1749: break;
1750: case CS_CALL:
1751: fread(&ush,2,1,bin);
1752: labels[ush]=TRUE;
1753: WRITE_NAME("CALL");
1754: sprintf(strchr(src,0),"label_%04x ",ush);
1755: eol(src);
1756: break;
1757: case CS_TOGGLE_NODE_MISC:
1758: MSHT("TOGGLE_NODE_MISC");
1759: case CS_ADJUST_USER_CREDITS:
1760: MSHT("ADJUST_USER_CREDITS");
1761: case CS_TOGGLE_USER_FLAG:
1762: CHCH("TOGGLE_USER_FLAG");
1763: case CS_GETNUM:
1764: MSHT("GETNUM");
1765: case CS_COMPARE_NODE_MISC:
1766: MSHT("COMPARE_NODE_MISC");
1767: case CS_MSWAIT:
1768: MSHT("MSWAIT");
1769: case CS_ADJUST_USER_MINUTES:
1770: MSHT("ADJUST_USER_MINUTES");
1771: case CS_REVERT_TEXT:
1772: MSHT("REVERT_TEXT");
1773: case CS_THREE_MORE_BYTES:
1774: printf("ERROR! I dont know anything about CS_THREE_MORE_BYTES.\n");
1775: printf("Cannot continue.\n");
1776: free(labels);
1777: return;
1778: case CS_MENU:
1779: STR("MENU");
1780: case CS_PRINT:
1781: STR("PRINT");
1782: case CS_PRINT_LOCAL:
1783: STR("PRINT_LOCAL");
1784: case CS_PRINT_REMOTE:
1785: STR("PRINT_REMOTE");
1786: case CS_PRINTFILE:
1787: STR("PRINTFILE");
1788: case CS_PRINTFILE_LOCAL:
1789: STR("PRINTFILE_LOCAL");
1790: case CS_PRINTFILE_REMOTE:
1791: STR("PRINTFILE_REMOTE");
1792: case CS_YES_NO:
1793: STR("YES_NO");
1794: case CS_NO_YES:
1795: STR("NO_YES");
1796: case CS_COMPARE_STR:
1797: STR("COMPARE_STR");
1798: case CS_COMPARE_WORD:
1799: STR("COMPARE_WORD");
1800: case CS_EXEC:
1801: STR("EXEC");
1802: case CS_EXEC_INT:
1803: STR("EXEC_INT");
1804: case CS_EXEC_BIN:
1805: STR("EXEC_BIN");
1806: case CS_EXEC_XTRN:
1807: STR("EXEC_XTRN");
1808: case CS_GETCMD:
1809: STR("GETCMD");
1810: case CS_LOG:
1811: STR("LOG");
1812: case CS_MNEMONICS:
1813: STR("MNEMONICS");
1814: case CS_SETSTR:
1815: STR("SETSTR");
1816: case CS_SET_MENU_DIR:
1817: STR("SET_MENU_DIR");
1818: case CS_SET_MENU_FILE:
1819: STR("SET_MENU_FILE");
1820: case CS_CMDSTR:
1821: indenteol=1;
1822: STR("CMDSTR");
1823: case CS_CHKFILE:
1824: STR("CHKFILE");
1825: case CS_GET_TEMPLATE:
1826: STR("GET_TEMPLATE");
1827: case CS_TRASHCAN:
1828: STR("TRASHCAN");
1829: case CS_CREATE_SIF:
1830: STR("CREATE_SIF");
1831: case CS_READ_SIF:
1832: STR("READ_SIF");
1833: case CS_CMDKEYS:
1834: indenteol=1;
1835: KEYS("CMDKEYS");
1836: case CS_COMPARE_KEYS:
1837: KEYS("COMPARE_KEYS");
1838: case CS_STR_FUNCTION:
1839: fread(&uch,1,1,bin);
1840: switch(uch) {
1841: case CS_LOGIN:
1842: STR("LOGIN");
1843: case CS_LOAD_TEXT:
1844: STR("LOAD_TEXT");
1845: default:
1846: printf("ERROR! Unknown string instruction: %02x%02X\n",CS_STR_FUNCTION,uch);
1847: ch=0;
1848: while(ch) fread(&ch,1,1,bin);
1849: }
1850: break;
1851: case CS_COMPARE_ARS:
1852: fread(&uch,1,1,bin);
1853: p=(char *)malloc(uch);
1854: fread(p,uch,1,bin);
1855: WRITE_NAME("COMPARE_ARS");
1856: sprintf(strchr(src,0),"%s\n",decompile_ars((uchar*)p,uch));
1857: free(p);
1858: break;
1859: case CS_TOGGLE_USER_MISC:
1860: MLNG("TOGGLE_USER_MISC");
1861: case CS_COMPARE_USER_MISC:
1862: MLNG("COMPARE_USER_MISC");
1863: case CS_REPLACE_TEXT:
1864: MSHTSTR("REPLACE_TEXT");
1865: case CS_TOGGLE_USER_CHAT:
1866: MLNG("TOGGLE_USER_CHAT");
1867: case CS_COMPARE_USER_CHAT:
1868: MLNG("COMPARE_USER_CHAT");
1869: case CS_TOGGLE_USER_QWK:
1870: MLNG("TOGGLE_USER_QWK");
1871: case CS_COMPARE_USER_QWK:
1872: MLNG("COMPARE_USER_QWK");
1873: case CS_SWITCH:
1874: indenteol=1;
1875: VAR("SWITCH");
1876: case CS_CASE:
1877: indenteol=1;
1878: LNG("CASE");
1879: case CS_NET_FUNCTION:
1880: fread(&uch,1,1,bin);
1881: switch(uch) {
1882: case CS_SOCKET_OPEN:
1883: VAR("SOCKET_OPEN");
1884: case CS_SOCKET_CLOSE:
1885: VAR("SOCKET_CLOSE");
1886: case CS_SOCKET_CONNECT:
1887: MVARVARUST("SOCKET_CONNECT");
1888: case CS_SOCKET_ACCEPT:
1889: VAR("SOCKET_ACCEPT");
1890: case CS_SOCKET_NREAD:
1891: VARVAR("SOCKET_NREAD");
1892: case CS_SOCKET_PEEK:
1893: MVARVARUST("SOCKET_PEEK");
1894: case CS_SOCKET_READ:
1895: MVARVARUST("SOCKET_READ");
1896: case CS_SOCKET_WRITE:
1897: VARVAR("SOCKET_WRITE");
1898: case CS_SOCKET_CHECK:
1899: VAR("SOCKET_CHECK");
1900: case CS_SOCKET_READLINE:
1901: MVARVARUST("SOCKET_READLINE");
1902: case CS_FTP_LOGIN:
1903: VARVARVAR("FTP_LOGIN");
1904: case CS_FTP_LOGOUT:
1905: VAR("FTP_LOGOUT");
1906: case CS_FTP_PWD:
1907: VAR("FTP_PWD");
1908: case CS_FTP_CWD:
1909: VARVAR("FTP_CWD");
1910: case CS_FTP_DIR:
1911: VARVAR("FTP_DIR");
1912: case CS_FTP_PUT:
1913: VARVARVAR("FTP_PUT");
1914: case CS_FTP_GET:
1915: VARVARVAR("FTP_GET");
1916: case CS_FTP_RENAME:
1917: VARVARVAR("FTP_RENAME");
1918: case CS_FTP_DELETE:
1919: VARVAR("FTP_DELETE");
1920: default:
1921: printf("ERROR! Unknown net function %02x%02X\n",CS_NET_FUNCTION,uch);
1922: printf("Cannot continue.\n");
1923: free(labels);
1924: return;
1925: }
1926: break;
1927: case CS_FIO_FUNCTION:
1928: fread(&uch,1,1,bin);
1929: switch(uch) {
1930: case FIO_OPEN:
1931: MVARUSTSTR("FOPEN");
1932: case FIO_CLOSE:
1933: VAR("FCLOSE");
1934: case FIO_READ:
1935: MVARVARNZUST("FREAD");
1936: case FIO_READ_VAR:
1937: VARVARVAR("FREAD");
1938: case FIO_WRITE:
1939: MVARVARNZUST("FWRITE");
1940: case FIO_WRITE_VAR:
1941: VARVARVAR("FWRITE");
1942: case FIO_GET_LENGTH:
1943: VARVAR("FGET_LENGTH");
1944: case FIO_EOF:
1945: VAR("FEOF");
1946: case FIO_GET_POS:
1947: VARVAR("FGET_POS");
1948: case FIO_SEEK:
1949: WRITE_NAME("FSEEK");
1950: write_var(bin,src);
1951: write_lng(bin,src);
1952: fread(&ush,2,1,bin);
1953: if(ush==SEEK_CUR)
1954: strcat(src,"CUR ");
1955: else if(ush==SEEK_END)
1956: strcat(src,"END ");
1957: else
1958: sprintf(strchr(src,0), "%d ",ush);
1959: eol(src);
1960: break;
1961: case FIO_SEEK_VAR:
1962: WRITE_NAME("FSEEK");
1963: write_var(bin,src);
1964: write_var(bin,src);
1965: fread(&ush,2,1,bin);
1966: if(ush==SEEK_CUR)
1967: strcat(src,"CUR ");
1968: else if(ush==SEEK_END)
1969: strcat(src,"END ");
1970: else
1971: sprintf(strchr(src,0), "%d ",ush);
1972: eol(src);
1973: break;
1974: case FIO_LOCK:
1975: VARLNG("FLOCK");
1976: case FIO_LOCK_VAR:
1977: VARVAR("FLOCK");
1978: case FIO_UNLOCK:
1979: VARLNG("FUNLOCK");
1980: case FIO_UNLOCK_VAR:
1981: VARVAR("FUNLOCK");
1982: case FIO_SET_LENGTH:
1983: VARLNG("FSET_LENGTH");
1984: case FIO_SET_LENGTH_VAR:
1985: VARVAR("FSET_LENGTH");
1986: case FIO_PRINTF:
1987: WRITE_NAME("FPRINTF");
1988: write_var(bin,src);
1989: write_cstr(bin,src);
1990: fread(&uch, 1, 1, bin);
1991: for(i=0; i<uch; i++) {
1992: write_var(bin,src);
1993: }
1994: eol(src);
1995: break;
1996: case FIO_SET_ETX:
1997: MUCH("FSET_ETX");
1998: case FIO_GET_TIME:
1999: VARVAR("FGET_TIME");
2000: case FIO_SET_TIME:
2001: VARVAR("FSET_TIME");
2002: case FIO_OPEN_VAR:
2003: MVARUSTVAR("FOPEN");
2004: case FIO_READ_LINE:
2005: VARVAR("FREAD_LINE");
2006: case FIO_FLUSH:
2007: VAR("FFLUSH");
2008: case REMOVE_FILE:
2009: VAR("REMOVE_FILE");
2010: case RENAME_FILE:
2011: VARVAR("RENAME_FILE");
2012: case COPY_FILE:
2013: VARVAR("COPY_FILE");
2014: case MOVE_FILE:
2015: VARVAR("MOVE_FILE");
2016: case GET_FILE_ATTRIB:
2017: VARVAR("GET_FILE_ATTRIB");
2018: case SET_FILE_ATTRIB:
2019: VARVAR("SET_FILE_ATTRIB");
2020: case MAKE_DIR:
2021: VAR("MAKE_DIR");
2022: case CHANGE_DIR:
2023: VAR("CHANGE_DIR");
2024: case REMOVE_DIR:
2025: VAR("REMOVE_DIR");
2026: case OPEN_DIR:
2027: VARVAR("OPEN_DIR");
2028: case READ_DIR:
2029: VARVAR("READ_DIR");
2030: case REWIND_DIR:
2031: VAR("REWIND_DIR");
2032: case CLOSE_DIR:
2033: VAR("CLOSE_DIR");
2034: default:
2035: printf("ERROR! Unknown file function %02x%02X\n",CS_FIO_FUNCTION,uch);
2036: printf("Cannot continue.\n");
2037: free(labels);
2038: return;
2039: }
2040: break;
2041: case CS_MAIL_READ:
2042: NONE("MAIL_READ");
2043: case CS_MAIL_READ_SENT:
2044: NONE("MAIL_READ_SENT");
2045: case CS_MAIL_READ_ALL:
2046: NONE("MAIL_READ_ALL");
2047: case CS_MAIL_SEND:
2048: NONE("MAIL_SEND");
2049: case CS_MAIL_SEND_BULK:
2050: NONE("MAIL_SEND_BULK");
2051: case CS_MAIL_SEND_FILE:
2052: NONE("MAIL_SEND_FILE");
2053: case CS_MAIL_SEND_FEEDBACK:
2054: NONE("MAIL_SEND_FEEDBACK");
2055: case CS_MAIL_SEND_NETMAIL:
2056: NONE("MAIL_SEND_NETMAIL");
2057: case CS_MAIL_SEND_NETFILE:
2058: NONE("MAIL_SEND_NETFILE");
2059: case CS_LOGOFF:
2060: NONE("LOGOFF");
2061: case CS_LOGOFF_FAST:
2062: NONE("LOGOFF_FAST");;
2063: case CS_AUTO_MESSAGE:
2064: NONE("AUTO_MESSAGE");
2065: case CS_MSG_SET_AREA:
2066: NONE("MSG_SET_AREA");
2067: case CS_MSG_SELECT_AREA:
2068: NONE("MSG_SELECT_AREA");
2069: case CS_MSG_SHOW_GROUPS:
2070: NONE("MSG_SHOW_GROUPS");
2071: case CS_MSG_SHOW_SUBBOARDS:
2072: NONE("MSG_SHOW_SUBBOARDS");;
2073: case CS_MSG_GROUP_UP:
2074: NONE("MSG_GROUP_UP");
2075: case CS_MSG_GROUP_DOWN:
2076: NONE("MSG_GROUP_DOWN");;
2077: case CS_MSG_SUBBOARD_UP:
2078: NONE("MSG_SUBBOARD_UP");;
2079: case CS_MSG_SUBBOARD_DOWN:
2080: NONE("MSG_SUBBOARD_DOWN");
2081: case CS_MSG_GET_SUB_NUM:
2082: NONE("MSG_GET_SUB_NUM");
2083: case CS_MSG_GET_GRP_NUM:
2084: NONE("MSG_GET_GRP_NUM");
2085: case CS_MSG_READ:
2086: NONE("MSG_READ");
2087: case CS_MSG_POST:
2088: NONE("MSG_POST");
2089: case CS_MSG_QWK:
2090: NONE("MSG_QWK");
2091: case CS_MSG_PTRS_CFG:
2092: NONE("MSG_PTRS_CFG");
2093: case CS_MSG_PTRS_REINIT:
2094: NONE("MSG_PTRS_REINIT");
2095: case CS_MSG_NEW_SCAN_CFG:
2096: NONE("MSG_NEW_SCAN_CFG");
2097: case CS_MSG_NEW_SCAN:
2098: NONE("MSG_NEW_SCAN");
2099: case CS_MSG_NEW_SCAN_ALL:
2100: NONE("MSG_NEW_SCAN_ALL");
2101: case CS_MSG_CONT_SCAN:
2102: NONE("MSG_CONT_SCAN");
2103: case CS_MSG_CONT_SCAN_ALL:
2104: NONE("MSG_CONT_SCAN_ALL");
2105: case CS_MSG_BROWSE_SCAN :
2106: NONE("MSG_BROWSE_SCAN ");
2107: case CS_MSG_BROWSE_SCAN_ALL:
2108: NONE("MSG_BROWSE_SCAN_ALL");
2109: case CS_MSG_FIND_TEXT:
2110: NONE("MSG_FIND_TEXT");
2111: case CS_MSG_FIND_TEXT_ALL:
2112: NONE("MSG_FIND_TEXT_ALL");
2113: case CS_MSG_YOUR_SCAN_CFG:
2114: NONE("MSG_YOUR_SCAN_CFG");
2115: case CS_MSG_YOUR_SCAN:
2116: NONE("MSG_YOUR_SCAN");
2117: case CS_MSG_YOUR_SCAN_ALL:
2118: NONE("MSG_YOUR_SCAN_ALL");
2119: case CS_MSG_NEW_SCAN_SUB:
2120: NONE("MSG_NEW_SCAN_SUB");
2121: case CS_MSG_SET_GROUP:
2122: NONE("MSG_SET_GROUP");
2123: case CS_MSG_UNUSED4:
2124: NONE("MSG_UNUSED4");
2125: case CS_MSG_UNUSED3:
2126: NONE("MSG_UNUSED3");
2127: case CS_MSG_UNUSED2:
2128: NONE("MSG_UNUSED2");
2129: case CS_MSG_UNUSED1:
2130: NONE("MSG_UNUSED1");
2131: case CS_FILE_SET_AREA:
2132: NONE("FILE_SET_AREA");
2133: case CS_FILE_SELECT_AREA:
2134: NONE("FILE_SELECT_AREA");
2135: case CS_FILE_SHOW_LIBRARIES:
2136: NONE("FILE_SHOW_LIBRARIES");
2137: case CS_FILE_SHOW_DIRECTORIES:
2138: NONE("FILE_SHOW_DIRECTORIES");
2139: case CS_FILE_LIBRARY_UP:
2140: NONE("FILE_LIBRARY_UP");
2141: case CS_FILE_LIBRARY_DOWN:
2142: NONE("FILE_LIBRARY_DOWN");
2143: case CS_FILE_DIRECTORY_UP:
2144: NONE("FILE_DIRECTORY_UP");
2145: case CS_FILE_DIRECTORY_DOWN:
2146: NONE("FILE_DIRECTORY_DOWN");
2147: case CS_FILE_GET_DIR_NUM:
2148: NONE("FILE_GET_DIR_NUM");
2149: case CS_FILE_GET_LIB_NUM:
2150: NONE("FILE_GET_LIB_NUM");
2151: case CS_FILE_LIST:
2152: NONE("FILE_LIST");
2153: case CS_FILE_LIST_EXTENDED:
2154: NONE("FILE_LIST_EXTENDED");
2155: case CS_FILE_VIEW:
2156: NONE("FILE_VIEW");
2157: case CS_FILE_UPLOAD:
2158: NONE("FILE_UPLOAD");
2159: case CS_FILE_UPLOAD_USER:
2160: NONE("FILE_UPLOAD_USER");
2161: case CS_FILE_UPLOAD_SYSOP:
2162: NONE("FILE_UPLOAD_SYSOP");
2163: case CS_FILE_DOWNLOAD:
2164: NONE("FILE_DOWNLOAD");
2165: case CS_FILE_DOWNLOAD_USER:
2166: NONE("FILE_DOWNLOAD_USER");
2167: case CS_FILE_DOWNLOAD_BATCH:
2168: NONE("FILE_DOWNLOAD_BATCH");
2169: case CS_FILE_REMOVE :
2170: NONE("FILE_REMOVE ");
2171: case CS_FILE_BATCH_SECTION:
2172: NONE("FILE_BATCH_SECTION");
2173: case CS_FILE_TEMP_SECTION:
2174: NONE("FILE_TEMP_SECTION");
2175: case CS_FILE_NEW_SCAN_CFG:
2176: NONE("FILE_NEW_SCAN_CFG");
2177: case CS_FILE_NEW_SCAN:
2178: NONE("FILE_NEW_SCAN");
2179: case CS_FILE_NEW_SCAN_ALL:
2180: NONE("FILE_NEW_SCAN_ALL");
2181: case CS_FILE_FIND_TEXT:
2182: NONE("FILE_FIND_TEXT");
2183: case CS_FILE_FIND_TEXT_ALL:
2184: NONE("FILE_FIND_TEXT_ALL");
2185: case CS_FILE_FIND_NAME:
2186: NONE("FILE_FIND_NAME");
2187: case CS_FILE_FIND_NAME_ALL:
2188: NONE("FILE_FIND_NAME_ALL");
2189: case CS_FILE_PTRS_CFG:
2190: NONE("FILE_PTRS_CFG");
2191: case CS_FILE_BATCH_ADD:
2192: NONE("FILE_BATCH_ADD");
2193: case CS_FILE_BATCH_CLEAR:
2194: NONE("FILE_BATCH_CLEAR");
2195: case CS_FILE_SET_LIBRARY:
2196: NONE("FILE_SET_LIBRARY");
2197: case CS_FILE_SEND:
2198: NONE("FILE_SEND");
2199: case CS_FILE_BATCH_ADD_LIST:
2200: NONE("FILE_BATCH_ADD_LIST");
2201: case CS_FILE_RECEIVE:
2202: NONE("FILE_RECEIVE");
2203: case CS_NODELIST_ALL:
2204: NONE("NODELIST_ALL");
2205: case CS_NODELIST_USERS:
2206: NONE("NODELIST_USERS");
2207: case CS_CHAT_SECTION:
2208: NONE("CHAT_SECTION");
2209: case CS_USER_DEFAULTS:
2210: NONE("USER_DEFAULTS");
2211: case CS_USER_EDIT:
2212: NONE("USER_EDIT");
2213: case CS_TEXT_FILE_SECTION:
2214: NONE("TEXT_FILE_SECTION");
2215: case CS_INFO_SYSTEM:
2216: NONE("INFO_SYSTEM");
2217: case CS_INFO_SUBBOARD:
2218: NONE("INFO_SUBBOARD");
2219: case CS_INFO_DIRECTORY:
2220: NONE("INFO_DIRECTORY");
2221: case CS_INFO_USER:
2222: NONE("INFO_USER");
2223: case CS_INFO_VERSION:
2224: NONE("INFO_VERSION");
2225: case CS_INFO_XFER_POLICY:
2226: NONE("INFO_XFER_POLICY");
2227: case CS_XTRN_EXEC:
2228: NONE("XTRN_EXEC");
2229: case CS_XTRN_SECTION:
2230: NONE("XTRN_SECTION");
2231: case CS_USERLIST_SUB:
2232: NONE("USERLIST_SUB");
2233: case CS_USERLIST_DIR:
2234: NONE("USERLIST_DIR");
2235: case CS_USERLIST_ALL:
2236: NONE("USERLIST_ALL");
2237: case CS_USERLIST_LOGONS:
2238: NONE("USERLIST_LOGONS");;
2239: case CS_PAGE_SYSOP:
2240: NONE("PAGE_SYSOP");
2241: case CS_PRIVATE_CHAT:
2242: NONE("PRIVATE_CHAT");;
2243: case CS_PRIVATE_MESSAGE:
2244: NONE("PRIVATE_MESSAGE");;
2245: case CS_MINUTE_BANK:
2246: NONE("MINUTE_BANK");
2247: case CS_GURU_LOG:
2248: NONE("GURU_LOG");
2249: case CS_ERROR_LOG:
2250: NONE("ERROR_LOG");
2251: case CS_SYSTEM_LOG:
2252: NONE("SYSTEM_LOG");
2253: case CS_SYSTEM_YLOG:
2254: NONE("SYSTEM_YLOG");
2255: case CS_SYSTEM_STATS:
2256: NONE("SYSTEM_STATS");
2257: case CS_NODE_STATS:
2258: NONE("NODE_STATS");
2259: case CS_SHOW_MEM:
2260: NONE("SHOW_MEM");
2261: case CS_CHANGE_USER:
2262: NONE("CHANGE_USER");
2263: case CS_ANSI_CAPTURE:
2264: NONE("ANSI_CAPTURE");
2265: case CS_LIST_TEXT_FILE:
2266: NONE("LIST_TEXT_FILE");
2267: case CS_EDIT_TEXT_FILE:
2268: NONE("EDIT_TEXT_FILE");
2269: case CS_FILE_SET_ALT_PATH:
2270: NONE("FILE_SET_ALT_PATH");
2271: case CS_FILE_RESORT_DIRECTORY:
2272: NONE("FILE_RESORT_DIRECTORY");
2273: case CS_FILE_GET:
2274: NONE("FILE_GET");
2275: case CS_FILE_PUT:
2276: NONE("FILE_PUT");
2277: case CS_FILE_UPLOAD_BULK:
2278: NONE("FILE_UPLOAD_BULK");
2279: case CS_FILE_FIND_OLD:
2280: NONE("FILE_FIND_OLD");
2281: case CS_FILE_FIND_OPEN:
2282: NONE("FILE_FIND_OPEN");
2283: case CS_FILE_FIND_OFFLINE:
2284: NONE("FILE_FIND_OFFLINE");
2285: case CS_FILE_FIND_OLD_UPLOADS:
2286: NONE("FILE_FIND_OLD_UPLOADS");
2287: case CS_INC_MAIN_CMDS:
2288: NONE("INC_MAIN_CMDS");
2289: case CS_INC_FILE_CMDS:
2290: NONE("INC_FILE_CMDS");
2291: case CS_PRINTFILE_STR:
2292: NONE("PRINTFILE_STR");
2293: case CS_PAGE_GURU:
2294: NONE("PAGE_GURU");
2295: case CS_SPY:
2296: NONE("SPY");
2297: default:
2298: printf("ERROR! Unknown instruction: %02X\n",uch);
2299: printf("Cannot continue.\n");
2300: free(labels);
2301: return;
2302: }
2303: if(redo)
2304: fputs(src,srcfile);
2305: }
2306: free(labels);
2307: }
2308:
2309: int main(int argc, char **argv)
2310: {
2311: int f;
2312: FILE *bin;
2313: FILE *src;
2314: char newname[MAX_PATH+1];
2315: char *p;
2316: char revision[16];
2317: FILE *cache;
2318: char cache_line[1024];
2319: char *crc,*good,*str;
2320:
2321: sscanf("$Revision: 1.34 $", "%*s %s", revision);
2322:
2323: printf("\nUNBAJA v%s-%s - Synchronet Baja Shell/Module De-compiler\n"
2324: ,revision, PLATFORM_DESC);
2325:
2326: for(f=1; f<argc; f++) {
2327: if(!strncmp(argv[f],"-b",2)) {
2328: brute_len=atoi(argv[f]+2);
2329: if(brute_len) {
2330: brute_buf=(char *)malloc(brute_len+1);
2331: if(!brute_buf)
2332: brute_len=0;
2333: brute_crc_buf=(unsigned long *)malloc(brute_len*sizeof(unsigned long));
2334: if(!brute_crc_buf) {
2335: free(brute_buf);
2336: brute_len=0;
2337: }
2338: if((cache=fopen("unbaja.brute","r"))!=NULL) {
2339: while(fgets(cache_line,sizeof(cache_line),cache)) {
2340: truncnl(cache_line);
2341: crc=strtok(cache_line,",");
2342: if(crc!=NULL) {
2343: good=strtok(NULL,",");
2344: if(good!=NULL) {
2345: str=strtok(NULL,",");
2346: if(str!=NULL) {
2347: add_bruted(strtoul(crc,NULL,16),strtoul(good,NULL,10),str,0);
2348: }
2349: }
2350: }
2351: }
2352: fclose(cache);
2353: }
2354: }
2355: printf("Will brute-force up to %d chars\n",brute_len);
2356: continue;
2357: }
2358: bin=fopen(argv[f],"rb");
2359: if(bin==NULL)
2360: perror(argv[f]);
2361: else {
2362: SAFECOPY(newname, argv[f]);
2363: p=strrchr(newname, '.');
2364: if(p==NULL)
2365: p=strchr(newname,0);
2366: strcpy(p,".decompiled");
2367: src=fopen(newname,"w");
2368: if(src == NULL)
2369: perror(newname);
2370: else {
2371: printf("\nDecompiling %s to %s\n",argv[f],newname);
2372: fputs("!include sbbsdefs.inc\n",src);
2373: fputs("!include file_io.inc\n",src);
2374: fputs("!include dir_attr.inc\n\n",src);
2375: decompile(bin, src);
2376: fclose(src);
2377: }
2378: fclose(bin);
2379: }
2380: }
2381:
2382: return(0);
2383: }
2384:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.