也谈忘记密码后金山WPS文件的恢复
马山太Iw仟\交
l蟋鞭
11_?
码骆
逭
祁锦毂
《计算机世界月刊~1993年第2期登载了陈崇义先生 的《忘记密码后四通CWS,金山WPS和王码480文件的 恢复》一文.在一些普通情况下确实很有用.但文中仅给 出了一十密码对码
.还需利用DEBUG等工具,在实 际应用中有很大的不方便.另外,文中没有给出密码和 源文件的存取方式.更重要的是,原文泼有注意到 ASCII的控制字符和特殊字符也可作为密码,因此, 不仅所给的密码的对照表不全,而且该方法在很多情况 下无法应用.
本文对金山WPS密码和源文件的存取方式做了 仔细的分析,并给出了用于删除密码的c语言源程序, 该程序可以对任何密码进行解密,很好地解决了原文中 存在的问
应用时,用户只需输入待解密的文件名即 可.无需查表,也无需借助DEBUG等调试工具,方便了 用户的使用
本人在研究中发现,其密码保存在文件中偏移量为 O2DDH一02E4H的8B中(在DEBUG下是03DDH一 03E4H).密码最多为8B.不足8B时,以OH作为结束.当 02DDH为OH时,即为没有密码.密码在存放时.是将其
ASCII码先按位取反,再将高4位和低4位调换位置.然 后按顺序存放.如字母A,其
ASCII码为01000001即41H
取反后为lOI11I10即BEH
高低换位iI101011即EBH
故作为密码存放时郎为0EBH.
WPS在存放文件时,也不是直接存放文件的 AscII码,而是将文件的ASCII码同密码区的8B做循 环异或(即第一字节同密码区的第一字节异或.第二字 节同密码区的第二字节异或,……,第九字节再同密码 区的第一字节异或…?),然后将所得的结果顺序存于 文件中偏移量为0400H起始处.在文件存放时并不考虑 是否加密码以及密码的长度因此,对于同一文件,在同 情况下,有可能由于密码区的数据不同使得存于磁盘上 的数据不同(即使是都爱有加密的情况).这也是为何不 能直接将磁盘上的WPS文件内容取出使用的原因. WPS在读入文件时同样重复上述过程,由于异或的性 i毒每月刊1993.9
.-r1)16l
质.便恢复了文件内容.
根据以上的原理,本人编写了一十c语言的僻密 程序.用于删除文件中的密码.它先复制WPS的文件 头.然后将密码区清零,最后恢复源文件内容,从而完成 删除密码的工作.应用时,用户只需输入待解密文件名 和输出文件名即可.
漂程序清单:
#inctude<srdio.h> inclnde<srdlJb.h> quit(intL)
(
printCZLrlraotopenfile,i1I exit(1)'
)
main(1
(
FILE*f1.2:
LR【】'
unsignedcharpariS]{ unsignedcharrd[1.00]| intc,d|
charfin[20],routE20]I putsinputinfile})
Bcanf(&,fin);
puts(inputOUtfile:); scanf(,lout)}
((fl=fopen(fin,rb))==NULL)quit(1)l
((f2=fopen(fout-wb"))一一NULL)quit(2) [read(word.1.OxTMd.f1)' fwrite(wm~.1,0x2dd,f21' ead(p~flS,1,8,f1)'
f0r(j=0;j<10'i++) WOrdL|_一0I
fwrite(wmx1.1.8.f2)| freed(word.1.0x400--0x2dd--8.f1)|
fwrite(word.1.0x400--0x2dd一8.f21I for(e=iread(word.1.8.t1);|c—fr(word.1.8.f1)) {
|0r(j=O|l<c|i++) if(c<8)break|
fcloaeall()|
print/\n一一OK一一\n)
?