主题:Word Password Recovery Master 2.0.0.4 (在线恢复word加密文档) 程序分析
作者:lzype
时间:2007-8-30
下载地址:http://www.rixler.com/download/wpasrec.zip
本程序可用于解密word 97/2000/xp/2003采用默认加密方式加密的文档(40bit有效密钥)

脱壳:
ASProtect 2.1x SKE -> Alexey Solodovnikov
Version: ASProtect 1.35 build 01.26 Release [Extract]
使用Aspr2.XX_IATfixer_v2.2s.osc脚本脱壳,用ImportREC进行修复
详细脱壳方法请搜索本论坛或网页
冰系列脱壳 参考:http://www.hack58.com/Soft/html/12/94/2007/200702079696.htm

本主题相关内容:
http://bbs1.pediy.com/showthread.php?t=26635&highlight=Word+Password+Recovery+Master
http://bbs1.pediy.com/showthread.php?t=26893&highlight=Word+Password+Recovery+Master

未注册版本只能恢复前200个字符,并在后面添加“To view full document, please register”

用抓包工具IRIS 4.07.1发现数据传输中与文档相关的内容为:
发送 engine_data 242个字符 应是121字节16进制数
接收 key 20 个字符 应是10字节16进制数,用于解密

初步观察解密过程有以下4步:
1.从服务器搜索解密密钥
2.直接复制文档为"1 (Demo).doc"(设原文档为1.doc)
3.解密"1 (Demo).doc"
4.若未注册用word打开"1 (Demo).doc"删除位置200处以后的内容,然后保存为明文档

用OllyICE载入WPasRec.exe,f9运行,选择要解密的文档1.doc
用断点设置工具下断点:CopyFileA,然后在WPasRec中点"Remove"
程序停在:
7C830053    8BFF            mov     edi, edi
按ctrl+f9返回到:
0041B03B  |.  6A 00         |push    0                               ; /FailIfExists = FALSE
0041B03D  |.  50            |push    eax                             ; |NewFileName
0041B03E  |.  51            |push    ecx                             ; |ExistingFileName
0041B03F  |.  FF15 70B24500 |call    dword ptr [<&kernel32.CopyFileA>; \CopyFileA
0041B045  |.  85C0          |test    eax, eax                        ;  返回到这里
此时文件被复制为"1 (Demo).doc",与原文档相同
一直按f8单步运行,并在每次call后观察"1 (Demo).doc"的变化
直到0041B143处:
0041B143  |.  FF10          call    dword ptr [eax]                  ;  Word_Pas.0040C4B0
文档被修改,可用word打开,但密码变了,说明文档被程序用一个已知的密码重新加密
再按f8,直到0041B143处:
0041B26F  |.  68 B8F54600   push    0046F5B8                         ;  ASCII "Z!gjVy>#XelYjT"
发现可疑字符,用这14个字符居然可以打开"1 (Demo).doc",内容与原文档一样,惊喜!!! 
暂时分析到此。。。

小结:
1.在0041B143处的call后暂停,可用0041B26F处的字符"Z!gjVy>#XelYjT"打开"1 (Demo).doc",另存为明文档即可,突破200字符限制。
2.0041B143处的call重新加密文档,此过程需要进一步分析
3.与服务器传输的数据engine_data和key与文档和原密钥之间的关系需要进一步分析

附:
Word加密过程: 97,2000,XP,2003
(1)将最多15字节的口令->Unicode->md5
(2)取前5字节+16字节随机数a1=21字节,反复16次得336字节->md5
(3)取前5字节(s[5])+4字节计数器(初始0)共9字节->md5后作为RC4的密钥对文档进行加密.每加密512字节计数器+1后重复(3),即第6字节顺序变化
(4)另取随机数a2->md5得b,a2和b用RC4的第一次密钥加密后的32字节AB存放文档特定位置:i=(*((int *)(data+0x240))+0x200);i-=i%512
从i处开始每512字节找01 00 01 00,其后的48字节就是a1和AB
说明:
(1)0x200处标志码 \xEC\xA5\xC1\x00
(2)0x20B字节低位为1表示加密

由此提出破解方法1:穷尽5字节s,(4)中的AB可用于验证,只要知道这5字节即可解密文档。(直接穷尽约需10天! )
改进方法2:建立数据库直接查表

由方法2提出2个问题:
1.必须找到一段固定的5字节或全0处,由这5字节得到RC4的乱数才能查表。
2.数据库如何建立。

希望有兴趣的共同研究!(QQ:64646157 Email:64646157@qq.com)