openKylin论坛

 找回密码

[原创] 彻底破解doc加密--MPI并行算法(含全部源码) [复制链接]

本帖最后由 TsianLorng 于 2013-12-2 10:43 编辑

UK论坛首发的原创技术贴,转载请说明出处,谢谢! —— Tsian Lorng

前一段时间在网上看到了破解doc加密的技术贴,自己也试了一下,很幸运,居然成功了
于是乎将代码通过MPI进行并行扩展,使得通过几台联网的电脑就可以在可接受的时间内算出结果
从此破解doc加密不再是问题!!!!!


由于之前的代码有ubuntu中的也有windows中的,这两天把windows那部分稍微改了下移到UbuntuKylin中。
现将所有代码跟大家分享,抛个砖,希望各位大虾手头有好货的可以露一手,呵呵……

=========================================================================
1. 功能说明
利用MS Word加密算法的弱点(请参考百度文库文章),破解Word2003及其以下版本的doc文件
在旧版doc文件中,最多的密码组合只有2^40个,因而可以通过暴力破解
用2011年时较高配置的电脑(Intel® Core™ i5-2410M CPU @ 2.30GHz × 4)
单个进程运行,最坏情况下大约需要跑720个小时,约合30天
因而通过多台电脑联网并行运算,可在较短时间破解(如4台8核的电脑,不超过一天肯定能破解)


=========================================================================
2. 设计说明
采用MPI将多台电脑联网并行运算(基于MPICH2,有linux版,也有windows版)
采用wvWare(linux下的开源软件)来解析读取doc格式的文件

解密的流程为:
step1: 通过wvWare提取doc中加密相关的数据块(解密时只需要该数据块,不需要完整的doc文件)
step2: 通过MPI并行运算程序暴力破解,快速找到解密密钥,
       解出的是一个40位的中间密钥,并不是用户设置的原始字符密码,
       通过该中间密钥可以将doc文件解密,但不能还原用户设置的密码
step3: 通过wvWare用破解得到的中间密钥对doc文件进行解密

因而,代码总体上有两部分:
cw_code_part1: 通过修改wvWare来实现doc文件的加密信息块提取以及基于中间密钥解密doc文件这两个功能
cw_code_part2: MPI并行编程代码实现对容量为2^40的密钥空间进行分块运算,以找到doc的解密密钥(40位的中间密钥)


=========================================================================
3. 代码说明cw_code_part1
基于wv-1.2.9.tar.gz,修改其中的decrypt97.c, wv.h, wvWare.c (其中主要修改的地方有Tsian Lorng标记字样)

3.1 解压wv-1.2.9.tar.gz,然后将cw_src文件夹中的decrypt97.c, wv.h, wvWare.c复制到wv-1.2.9中,替换掉原有文件

3.2 编译wv并安装
编译wv需要libgsf的开发库(libgsf-1-dev)
安装libgsf开发库之后,进入wv_cw-1.2.9执行
./configure
make
sudo make install
注意:安装命令不能少,否则可能运行结果不对
      安装之后仍然需要在wv-1.2.9目录下运行./wvWare,否则也会出现运行结果不对的情况

3.3 测试运行
编译成功之后,在wv-1.2.9中执行 ./wvWare
可以看到wvWare的使用说明,其中有两个命令行选项 -S 和 -D 是修改代码之后新加的功能
分别用于提取doc的加密信息块和基于中间密钥解密doc

在cw_test文件夹中有一个word文件(test-WordPoJie0okl;p.doc),其加密密码为 WordPoJie0okl;p
可以在office中输入上述密码打开这个doc查看其中的内容,也可以用wvWare带密码的参数打开,即
cd wv-1.2.9
./wvWare -p "WordPoJie0okl;p" ../cw_test/test-WordPoJie0okl;p.doc
运行之后可以看到屏幕输出一些html页面代码,这说明wvWare成功解密了doc并转换为html格式输出
用以下命令,可以将输出的html页面代码保存到test.html,然后在浏览器中打开
./wvWare -p "WordPoJie0okl;p" ../cw_test/test-WordPoJie0okl;p.doc > ../cw_test/test.hmtl
若上述 -p 选项 运行得到的test.html与test-WordPoJie0okl;p.doc的内容一致,则说明wvWare安装成功

3.4 基于40位中间密钥解密(-D选项)
cw_test文件夹中的test-pj.dat为破解得到的中间解密密钥,通过以下命令可以将doc文件解密
./wvWare -D ../cw_test/test-pj.dat ../cw_test/test-WordPoJie0okl;p.doc > ../cw_test/test.hmtl
说明:因为修改的代码不是很完善,当 -D 选项成功解密运行一次后,可能wvWare的某些运行状态未能恢复正常,
      所以再执行 -D 选项有些时候不再会有输出,目前情况下重启linux后可再运行(具体原因不明)
若上述 -D 选项 运行得到的test.html与test-WordPoJie0okl;p.doc的内容一致,则说明这部分代码可以正常运行

3.5 提取doc的加密信息块
上述test-pj.dat中包含了破解得到的中间解密密钥,破解要用到的加密信息数据块以包含在其中
通过以下命令可以提取一个doc文件的加密信息块并保存在指定的dat文件中
./wvWare -S ../cw_test/test-before-pj.dat ../cw_test/test-WordPoJie0okl;p.doc
运行之后在cw_test目录中生成文件test-before-pj.dat,其中只包含doc的加密信息
该dat文件经另一部分程序(cw_code_part2,MPI并行运算解密程序)破解后,
将得到的40位中间解密密钥填入该dat文件中,即得到test-pj.dat


=========================================================================
4. 代码说明cw_code_part2(MPI并行运算破解程序,Linux版)
对应在cw_MPI_lin文件夹中,其中

cw为MPI程序的源代码所在目录
要编译cw,需要现在linux上安装MPICH2及其开发库(libmpich2-dev)

安装mpich2之后,要编译cw,只需进入cw目录,然后执行
make
正常情况下会生成cw可执行程序

然后执行
./run_cw.sh
即可启动破解过程

注意:run_cw.sh正常运行需要另外两个文件:
      TaskProcess.dat(直接复制TaskProcess - initial.dat然后改名得到)
      test-before-pj.dat(cw_code_part1中提取的doc加密信息块)

linux版的mpi程序只测试了单机环境的多进程并行运算,多机联网的MPI运行需对MPI环境进行配置(有待补充……)
之前主要在Windows环境下做的工作,下面详细说明在Windows上MPI如何在多机配置运行


=========================================================================
5. 代码说明cw_code_part2(MPI并行运算破解程序,Windows版)
对应在cw_MPI_win文件夹中,其中

cw为vs2008的工程
其中的MPI头文件和库文件配置目录为C:\Program Files (x86)\MPICH2\include或lib
若MPICH2安装时的目录以上述目录不一样,请在工程配置中更正后在进行编译

mpich2-1.4.1p1-win-ia32.msi为MPICH2在windows下的安装文件
安装时,按向导默认安装即可

下面以win7为例说明如何在多台联网的电脑安装配置和运行MPI程序
假设两台电脑的ip为Host1:192.168.0.2,Host2:192.168.0.3
在两台电脑上都要启用Administrator帐户,而且设相同的密码(这点一定要注意,否则MPI不能同时找不到这两台电脑)
MPICH2的安装,和运行都要在Administrator帐户下进行,配置和运行时最好将防火墙关掉

安装完成后,配置的第一步就是在MPI中注册windows用户,两台都要做注册用户的配置
注册过程如下:
    启动wmpiregister.exe
    然后输入Administrator及其密码(再次强调,两台电脑上要配置相同的密码,这个密码也就是Administrator的登录密码)
    点Register按钮,然后点OK按钮,即可完成配置
然后选其中一台作为主控机(如选Host1),接下来的配置只需要在主控机上进行
    启动wmpiconfig.exe
    然后在Domain框中输入电脑所在的windows工作组(如WORKGROUP)
    然后点“Get Hosts”按钮,正常情况下,会在下面的主机列表中显示两个主机名
    然后点“Scan for Version”按钮,正常情况下,会在下面的主机列表中显示各个主机上安装的MPICH2版本
    然后点“Scan Hosts”按钮,正常情况下,下面的主机列表中显示的各个主机都用绿色背景高亮显示
        都绿了,说明配置正确了,然后才能进入下一步
        若有没变绿的,则需要检查以下配置,看看网络通吗?防火墙关了吗(两边都要关掉)?
            用户名和密码设成一样了吗?都是在Administrator帐户下运行吗?……

在多台电脑上运行MPI,需要通过命令行指定运行参数
前提一:上述配置已经成功
前提二:要运行的程序放在所有电脑的同一个路径下
        如我们都在Host1和Host2的D盘中设一个目录MPIexe,
        然后将要运行程序cw.exe(如cw中的release目录下的cw.exe)
        和要解密的dat文件(如cw_code_part1中提取的test-before-pj.dat)
        都放在D:\MPIexe目录下
要运行MPI程序只需要在主控机(如Host1)的命令行执行下面命令
mpiexec.exe -hosts 2 192.168.0.2 8 192.168.0.3 8 D:\MPIexe\cw.exe D:\MPIexe\test-before-pj.dat
注意:在主控机上,执行上述命令前还需要将TaskProcess.dat (直接复制TaskProcess - initial.dat然后改名得到)
      放在D:\MPIexe目录下(只需要放在主控机,其他电脑上不用放,因为非主控机用不到这个文件)
上述命令的含义是:总共有两台主机要参与运算,第一台是192.168.0.2,第二台是192.168.0.3
    而且第一台上同时启动8个运算进程,第二台上也同时启动8个运算进程

关于cw.exe的一些补充说明
cw.exe将2^40个可能的中间密钥划分为多个任务块进行运算,
其中每个任务块要运算2^24个可能的中间密钥,因而总共有65536个任务块
TaskProcess.dat记录的是破解运算的进度,其中有65536个字符,分别对应与各个任务块的运算情况
Y表示已经运算过了,N表示没有运算过,R表示正在运算(初始的进度文件为65536个N)
cw.exe中的0号进程为管理进程,负责任务的分配和结果的收集
管理进程主要就是将任务块分配到各个运算进程中,并记录破解的进度
(当前cw.exe记录进度时,代码中写死了D:\MPIexe\TaskProcess.dat,请注意根据需要更改)
当破解成功后,管理进程将找到的40位中间密钥写入dat文件中,然后结束运算

注意:破解的结果只保存在主控机的dat文件中,解密doc文件时用主控机上的dat文件即可


==============================================================================
说明:由于附件大小受限,因而其中cw_code_part2.zip用到的mpich2-1.4.1p1-win-ia32.msi
      请到http://www.mpich.org/static/tarballs/1.4.1p1/下载
==============================================================================

cw_code_part1.zip

660.55 KB, 下载次数: 13, 下载积分: 麒麟币 -1

cw_code_part2.zip

448.76 KB, 下载次数: 12, 下载积分: 麒麟币 -1

楼主
发表于 2013-11-28 19:02:50
回复

使用道具 举报

openKylin

GMT+8, 2024-5-12 10:57 , Processed in 0.031079 second(s), 20 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表