nicer formatting
[tridge/junkcode.git] / pwlcrack.c
1 #include <stdio.h>
2 #include <string.h>
3
4
5 unsigned char Data[100001];
6 unsigned char keystream[1001];
7 int Rpoint[300];
8
9
10 main (int argc,char *argv[]) {
11   FILE *fd;
12   int   i,j,k;
13   int   size;
14   char ch;
15   char *name;
16   int cracked;
17   int sizemask;
18   int maxr;
19   int rsz;
20   int pos;
21   int Rall[300]; /* resource allocation table */
22
23   if (argc<2) {
24     printf("usage: glide filename (username)");
25     exit(1);
26   }
27
28   /* read PWL file */
29
30   fd=fopen(argv[1],"rb");
31   if(fd==NULL) {
32     printf("can't open file %s",argv[2]);
33     exit(1);
34   }
35   size=0;
36   while(!feof(fd)) {
37     Data[size++]=fgetc(fd);
38   }
39   size--;
40   fclose(fd);
41
42   /* find username */
43   name=argv[1];
44   if(argc>2) {
45     name=argv[2];  
46   } else {
47     char *p = strrchr(name,'/');
48     if (p) name = p+1;
49   }
50   printf("Username: %s\n",name);
51
52   /* copy encrypted text into keystream */
53   cracked=size-0x0208;
54   if(cracked<0) cracked=0;
55   if(cracked>1000) cracked=1000;
56   memcpy(keystream,Data+0x208,cracked );
57
58         /* generate 20 bytes of keystream */
59   for(i=0;i<20;i++) {
60     ch=toupper(name[i]);
61     if(ch==0) break;
62     if(ch=='.') break;
63     keystream[i]^=ch;
64   };
65   cracked=20;
66
67
68         /* find allocated resources */
69
70   sizemask=keystream[0]+(keystream[1]<<8);
71   printf("Sizemask: %04X\n",sizemask);
72
73   for(i=0;i<256;i++) Rall[i]=0;
74
75   maxr=0;
76   for(i=0x108;i<0x208;i++) {
77     if(Data[i]!=0xff) {
78       Rall[Data[i]]++;
79       if (Data[i]>maxr) maxr=Data[i];
80     }
81   }
82   maxr=(((maxr/16)+1)*16);      /* resource pointer table size appears
83 to be divisible by 16 */
84
85         /* search after resources */
86
87   Rpoint[0]=0x0208+2*maxr+20+2; /* first resource */
88   for(i=0;i<maxr;i++) {
89     /* find size of current resource */
90     pos=Rpoint[i];
91     rsz=Data[pos]+(Data[pos+1]<<8);
92     rsz^=sizemask;
93     printf("Analyzing block with size:
94 %04x\t(%d:%d)\n",rsz,i,Rall[i]);
95     if( (Rall[i]==0) && (rsz!=0) ) {
96       printf("unused resource has nonzero size !!!\n");
97       exit(0);
98     }
99
100     pos+=rsz;
101
102                 /* Resources have a tendency to have the wrong size for some
103 reason */
104                 /* check for correct size */
105
106     if(i<maxr-1) {
107       while(Data[pos+3]!=keystream[1]) {
108         printf(":(%02x)",Data[pos+3]);
109         pos+=2; /* very rude may fail */
110       }
111     }
112
113     pos+=2;     /* include pointer in size */
114     Rpoint[i+1]=pos;
115   }
116   Rpoint[maxr]=size;
117
118         /* insert Table data into keystream */
119   for(i=0;i <= maxr;i++) {
120     keystream[20+2*i]^=Rpoint[i] & 0x00ff;
121     keystream[21+2*i]^=(Rpoint[i] >> 8) & 0x00ff;
122   }
123   cracked+=maxr*2+2;
124
125   printf("%d bytes of keystream recovered\n",cracked);
126
127   /* decrypt resources */
128   for(i=0;i < maxr;i++) {
129     rsz=Rpoint[i+1]-Rpoint[i];
130     if (rsz>cracked) rsz=cracked;
131     printf("Resource[%d] (%d)\n",i,rsz);
132     for(j=0;j<rsz;j++) printf("%c",Data[Rpoint[i]+j]^keystream[j]);
133     printf("\n");
134   }
135
136
137   exit(0);
138 }