⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glide.cpp

📁 《攻击与防护网络安全与实用防护技术》源代码,一本好书
💻 CPP
字号:

#include <stdio.h>
#include <string.h>
#include <process.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>

unsigned char 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<maxr;i++) {
		/* find size of current recource */
		pos=Rpoint[i];
		rsz=Data[pos]+(Data[pos+1]<<8);
		rsz^=sizemask;
		printf("Analyzing block with size: %04x\t(%d:%d)\n",rsz,i,Rall[i]);
		if( (Rall[i]==0) && (rsz!=0) ) {
			printf("unused resource has nonzero size !!!\n");
			printf("If last line produced any : You may try to recover\n");
			printf("press y to attempt recovery\n");
			ch=getch();
			if(ch!='y') exit(0);
			rsz=2;
			i-=1;
		}

		pos+=rsz;

		/* Resources have a tendency to have the wrong size for some reason */
		/* check for correct size */

		if(i<maxr-1) {
			while(Data[pos+3]!=keystream[1]) {
				printf(":",Data[pos+3]);
				pos+=2; /* very rude may fail */
			}
		}

		pos+=2;	/* include pointer in size */
		Rpoint[i+1]=pos;
	}
	Rpoint[maxr]=size;

	/* insert Table data into keystream */
	for(i=0;i <= maxr;i++) {
		keystream[20+2*i]^=Rpoint[i] & 0x00ff;
		keystream[21+2*i]^=(Rpoint[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<rsz;j++) printf("%c",Data[Rpoint[i]+j]^keystream[j]);
		printf("\n");
	}


	exit(0);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -