#include #include #include #include #include #include unsigned char huge Data[100001]; unsigned char keystream[1001]; int Rpoint[300]; void main (int argc,char *argv[]) { FILE *fd; int i,j,k; int size; char ch; char *name; int cracked; int sizemask; int maxr; int rsz; int pos; int Rall[300]; /* recource allocation table */ if (argc<2) { printf("usage: glide filename (username)"); exit(1); } /* read PWL file */ fd=fopen(argv[1],"rb"); if(fd==NULL) { printf("can't open file %s",argv[1]); exit(1); } size=0; while(!feof(fd)) { Data[size++]=fgetc(fd); } size--; fclose(fd); /* find username */ name=argv[1]; if(argc>2) name=argv[2]; printf("Username: %s\n",name); /* copy encrypted text into keystream */ cracked=size-0x0208; if(cracked<0) cracked=0; if(cracked>1000) cracked=1000; memcpy(keystream,Data+0x208,cracked ); /* generate 20 bytes of keystream */ for(i=0;i<20;i++) { ch=toupper(name[i]); if(ch==0) break; if(ch=='.') break; keystream[i]^=ch; }; cracked=20; /* find allocated recources */ sizemask=keystream[0]+(keystream[1]<<8); printf("Sizemask: %04X\n",sizemask); for(i=0;i<256;i++) Rall[i]=0; maxr=0; for(i=0x108;i<0x208;i++) { if(Data[i]!=0xff) { Rall[Data[i]]++; if (Data[i]>maxr) maxr=Data[i]; } } maxr=(((maxr/16)+1)*16); /* recource pointer table size appears to be divisable by 16 */ /* search after recources */ Rpoint[0]=0x0208+2*maxr+20+2; /* first recource */ for(i=0;i> 8) & 0x00ff; } cracked+=maxr*2+2; printf("%d bytes of keystream recovered\n",cracked); /* decrypt resources */ for(i=0;i < maxr;i++) { rsz=Rpoint[i+1]-Rpoint[i]; if (rsz>cracked) rsz=cracked; printf("Recource[%d] (%d)\n",i,rsz); for(j=0;j