/* 文件名: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");
}
}