5 unsigned char Data[100001];
6 unsigned char keystream[1001];
10 main (int argc,char *argv[]) {
21 int Rall[300]; /* resource allocation table */
24 printf("usage: glide filename (username)");
30 fd=fopen(argv[1],"rb");
32 printf("can't open file %s",argv[2]);
37 Data[size++]=fgetc(fd);
47 char *p = strrchr(name,'/');
50 printf("Username: %s\n",name);
52 /* copy encrypted text into keystream */
54 if(cracked<0) cracked=0;
55 if(cracked>1000) cracked=1000;
56 memcpy(keystream,Data+0x208,cracked );
58 /* generate 20 bytes of keystream */
68 /* find allocated resources */
70 sizemask=keystream[0]+(keystream[1]<<8);
71 printf("Sizemask: %04X\n",sizemask);
73 for(i=0;i<256;i++) Rall[i]=0;
76 for(i=0x108;i<0x208;i++) {
79 if (Data[i]>maxr) maxr=Data[i];
82 maxr=(((maxr/16)+1)*16); /* resource pointer table size appears
83 to be divisible by 16 */
85 /* search after resources */
87 Rpoint[0]=0x0208+2*maxr+20+2; /* first resource */
89 /* find size of current resource */
91 rsz=Data[pos]+(Data[pos+1]<<8);
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");
102 /* Resources have a tendency to have the wrong size for some
104 /* check for correct size */
107 while(Data[pos+3]!=keystream[1]) {
108 printf(":(%02x)",Data[pos+3]);
109 pos+=2; /* very rude may fail */
113 pos+=2; /* include pointer in size */
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;
125 printf("%d bytes of keystream recovered\n",cracked);
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]);