/* 文件名:wpscode.c

 

*=====================================================================*

                    WPS密码解密程序  (傅叔平编)

*=====================================================================*

 

    WPS密码

 

        位置:离文件首偏移量 2DD

        长度:8个字节

        存放方式:每个字节的高4位与低4位交换位置后逐位取反,

                  ASCII字符以外的键(如功能键)均视其码为0(存放时为FF)

        : 若无密码,8个字节全为0;若密码不足8个字节,则以00为结束标志

 

----------------------------------------------------------------------

 

*/

 

#define CODELEN 8  /* 密码长度 */

#define Esc  0x1b

#define BS   0x08

#define Tab  0x09

#define F1 0xff  /* 除可见字符、控制字符以外的键,WPS的密码都以0xff存贮,

                    <F1> 代表 */

 

#include <stdio.h>

#include <ctype.h>

 

void main(int argc,char *argv[])

{ unsigned char code[8];

  FILE *wps;

  int i, codeflag;

  if(argc!=2)

  {

     printf("\7请用如下格式:\n    WPSCODE <WPS文件名>\n");

     exit(0);

  }

  if ((wps=fopen(argv[1],"r"))==NULL)

  {

     printf("\n\n不能读文件:%s\n",argv[1]);

     exit(0);

  }

  if(fseek(wps,0x2dd,SEEK_SET))

  {

     printf("\n\n读文件“%s”出错!\n",argv[1]);

     exit(0);

  }

  if(!fread(code,1,CODELEN,wps))

  {

     printf("\n\n读文件“%s”出错!\n",argv[1]);

     exit(0);

  }

  fclose(wps);

  codeflag=0;

  for(i=0;i<CODELEN && code[i]!=0;i++)

  {

     codeflag=1;          /* code[i] 0,有密码,标志置1 */

     if(code[i]!=F1)      /* 有密码但不是功能键等非ASCII字符 */

     {

        code[i]=~code[i];

        code[i]=(code[i]<<4) | (code[i]>>4);

     }

  }

  if(codeflag==0)

     printf("\n\n文件“%s”没有密码。\n",argv[1]);

  else

  {

     printf("\n\n文件“%s”的密码是:",argv[1]);

     for(i=0;i<CODELEN && code[i]!=0;i++)

     {

        if(isprint(code[i]))

        {

           printf("%c",code[i]); continue;

        }

        if(code[i]==Esc)

        {

           printf("<Esc>"); continue;

        }

        if(code[i]==BS)

        {

           printf("<BS>"); continue;

        }

        if(code[i]==Tab)

        {

           printf("<Tab>"); continue;

        }

        if(code[i]==F1)

        {

           printf("<F1>"); continue;

        }

        if(iscntrl(code[i]))

           printf("^%c",code[i]+'A'-1);

     }

     printf("\n");

  }

}