首页
会员中心
到顶部
到尾部
计算机

穷举破解EXCEL、WORD文档密码

时间:2020/10/27 9:26:06  作者:  来源:  查看:0  评论:0
内容摘要:摘要:本文讨论了如何使用VB编程,通过穷举法解除EXCEL文档和WORD文档的密码。并在破解过程中加入了中断,以方便用户随时中断破解过程。关键字:穷举法、解密、EXCEL文档、WORD文档、密码Excel和Word提供了多种方法限制访问用户文档,以免未经授权者的查看和更改。但在信...

摘要:本文讨论了如何使用VB编程,通过穷举法解除EXCEL文档和WORD文档的密码。并在破解过程中加入了中断,以方便用户随时中断破解过程。

关键字:穷举法、解密、EXCEL文档、WORD文档、密码

Excel和Word提供了多种方法限制访问用户文档,以免未经授权者的查看和更改。但在信息化的今天,用户需要记忆的密码太多,一旦密码丢失,用户将无法打开或访问该文档,给用户造成很大的损失。能否借助计算机的高速运行,解开密码呢?通过尝试,笔者认为:在无法弄清Excel和Word加密算法的情况下,利用穷举法尝试解密文档,是解密唯一的选择。

1.实现原理
本程序选用VB6.0编写,并充分利用了Office组件中的对象库,穷举尝试各种口令,达到解密文档的目的。
⑴巧用整数的取整及取余,产生密码字符串
Excel和Word文档密码可以是字母、数字、空格以及符号的任意组合,最长可达15个字符,且区分大小写。
本程序的破解过程利用一个两层循环,产生选定字符的排列组合(尝试密码),其中外层循环控制密码的位数,内层循环生成N位密码的所有排列组合。产生尝试密码的方法是:将一个N位字符串密码(password)作为一个“数值”,该“数值”每个位上的“数字”属于选定字符范围,且该“数值”与一个整数(X)一一对应,并满足以下条件:0≤X≤ArrayLenN-1(ArrayLen是选定密码字符范围的总字符数,如:仅选定数字时,ArrayLen=10;仅选定数字和小写字母时,ArrayLen=10 26=36);对X整除、取余N-1次,对每次的余数Y做以下操作:password=password CharArray(Y)(注:CharArray是存放选定字符的一维数组),最后做以下操作:password=CharArray(XMODArrayLen) password,产生的password就是整数X对应的N位字符串。
⑵利用VB的错误处理功能,尝试口令破解
当运行程序尝试一个密码时(用该密码打开文档),若密码错误,则会产生运行错误。为此,必须在尝试口令前,使用OnError语句打开一个错误处理程序;由于本程序是尝试各种口令,当一个口令错误时,直接尝试下一个口令即可,因此,应使用“OnErrorResumeNext”语句。
那么,如何得知找到口令了呢?VB有一个内部错误对象Err,它的Number属性中的值是用来确定发生错误的原因。在尝试一个口令后,检查Err.Number中的值,以确定该口令是否正确。
⑶破解过程中的中断
利用穷举法解密对系统资源的占用是十分惊人的,在解密的过程中CPU的利用率几乎是100,若不加入解密过程中的中断,计算机系统会处于一种假死机状态。为此,在破解过程的内循环中加入了DoEvents函数。DoEvents函数提供了一种取消任务的简便方法,它将控制切换到操作环境内核。只要此环境中的所有应用程序都有机会响应待处理事件,应用程序就又恢复控制。使用该函数的优点是:不会使应用程序放弃焦点,且后台事件能够得到有效处理。
2.具体实现过程
编程实现时,需要机器安装有VB应用程序及MicrosoftOffice组件。
⑴新建VB工程,并对其初始化
新建一个VB工程,取名Get_Password,将启动窗体命名为FrmMain。首先选择“工程”菜单中的“引用”,在“引用”对话框中选择“MicrosoftExcel10.0ObjectLibrary”和“MicrosoftWord10.0ObjectLibrary”(注意:如果安装的是Office2000或Office97,应该选择Excel对象库和Word对象库的9.0版或8.0版)。其次在“工程”菜单中“部件”对话框中,选择添加“MicrosoftWindowscommoncontrols-2.5(sp2)”和“MicrosoftCommonDialogcontrol6.0”,以便在窗体设计中使用微调控件和对话框控件。
⑵在FrmMain窗体上添加控件
在FrmMain窗体上,按照下图的位置添加表1中的控件,然后根据表1修改每个对象的属性。

表1:
序号控件名称控件属性及其属性值
1FrameName=Frame1,Caption=选择加密文件(*.DOC、*.XLS)
2FrameName=Frame2,Caption=选定密码字符范围:
3FrameName=Frame3,Caption=选择密码的长度:
4ComboBowName=Combo1
5CommandButtonName=CmdBrowse,Caption=浏览
6CommandButtonName=CmdStartCrack,Caption=开始破解
7CommandButtonName=CmdQuit,Caption=退出系统
8CheckBoxName=ChkDigital,Caption=数字(10)
9CheckBoxName=ChkLowercase,Caption=小写字母(26)
10CheckBoxName=ChkUppercase,Caption=大写字母(26)
11CheckBoxName=ChkSpace,Caption=空格(1)
12CheckBoxName=ChkBracket,Caption=括号(6)
13CheckBoxName=ChkOthers,Caption=其他OEM字符(26)
14TextBoxName=txtPasswordStartLong,Text=2
15TextBoxName=txtPasswordEndLong,Text=2
16TextBoxName=Text1
17UpDownName=UpDown1,BuddyProperty=Text,Wrap=TRUE,Increment=1
BuddyControl=txtPasswordStartLong,Max=15,Min=
18UpDownName=UpDown2,BuddyProperty=Text,Wrap=TRUE,Increment=1
BuddyControl=txtPasswordEndLong,Max=15,Min=1
19CommonDialogName=Dialog,DialogTitle=请选择加密的Excel或Word文档
Filter=Excel(*.xls),Word(*.doc)|*.xls;*.doc
20LabelName=Label1,Caption=破解进度:
21LabelName=Label3,Caption=从:
22LabelName=Label5,Caption=到:

⑶为以上对象编写下列代码
为了便于理解,程序中增加了适当的注释。
OptionExplicit
PrivateSubCmdBrowse_Click()
Dialog.ShowOpen'showthedialog
Combo1.Text=Dialog.FileName'settheFilenametextboxtotheselectedfile
Combo1.Refresh
EndSub

PrivateSubCmdQuit_Click()
End
EndSub

PrivateSubCmdStartCrack_Click()
StaticblnProcessingAsBoolean
DimwdAsNewWord.Application,xlsAsNewExcel.Application
DimOpenReturn
Dimstrpath,pass,StrTemp,all_char(100)AsString
DimJ,K,Password_Start_Long,Password_End_Long,ArrayLenAsInteger
DimI,TempAsLong
ArrayLen=0'数组初始化
IfChkDigital.Value=1Then
ForJ=ArrayLenToArrayLen 9
all_char(J)=Chr(Asc("0") J-ArrayLen)
NextJ
ArrayLen=ArrayLen 10
EndIf
IfChkLowercase.Value=1Then
ForJ=ArrayLenToArrayLen 25
all_char(J)=Chr(Asc("a") J-ArrayLen)
NextJ
ArrayLen=ArrayLen 26
EndIf
IfChkUppercase.Value=1Then
ForJ=ArrayLenToArrayLen 25
all_char(J)=Chr(Asc("A") J-ArrayLen)
NextJ
ArrayLen=ArrayLen 26
EndIf
IfChkSpace.Value=1Then
all_char(ArrayLen)=""
ArrayLen=ArrayLen 1
EndIf
IfChkBracket.Value=1Then
all_char(ArrayLen)="("
all_char(ArrayLen 1)=")"
all_char(ArrayLen 2)="{"
all_char(ArrayLen 3)="}"
all_char(ArrayLen 4)="["
all_char(ArrayLen 5)="]"
ArrayLen=ArrayLen 6
EndIf
IfChkOthers.Value=1Then
ForJ=ArrayLenToArrayLen 6'33to39
all_char(J)=Chr(33 J-ArrayLen)
Next
ArrayLen=ArrayLen 7
ForJ=ArrayLenToArrayLen 5'42to47
all_char(J)=Chr(42 J-ArrayLen)
NextJ
ArrayLen=ArrayLen 6
ForJ=ArrayLenToArrayLen 6'58to64
all_char(J)=Chr(58 J-ArrayLen)
NextJ
ArrayLen=ArrayLen 7
all_char(ArrayLen)=Chr(92)
ArrayLen=ArrayLen 1
ForJ=ArrayLenToArrayLen 2'94to96
all_char(J)=Chr(94 J-ArrayLen)
NextJ
ArrayLen=ArrayLen 3
all_char(ArrayLen)=Chr(124)
all_char(ArrayLen 1)=Chr(126)
ArrayLen=ArrayLen 2
EndIf
IfArrayLen=0Then
MsgBox"错误:没有选择'密码使用的字符'",,"请选择密码使用的字符范围..."
ExitSub
EndIf
IfblnProcessingThen
IfMsgBox("真的要中断解密过程吗?",vbYesNo,"用户中断任务")=vbYesThenblnProcessing=False
Else
CmdStartCrack.Caption="中断破解"
blnProcessing=True
strpath=Combo1.Text
Ifstrpath=""Then
MsgBox"错误:没有选择'需要解密的文件'",,"请选择需要解密的文件..."
ExitSub
EndIf
strpath=Trim(strpath)
Password_Start_Long=Val(txtPasswordStartLong.Text)
Password_End_Long=Val(txtPasswordEndLong.Text)
IfPassword_Start_Long>Password_End_LongThen
Password_Start_Long=Val(txtPasswordEndLong.Text)
Password_End_Long=Val(txtPasswordStartLong.Text)
EndIf
Label1.Caption="破解进度:"
Label1.Refresh
OnErrorResumeNext
IfUCase(Right(strpath,3))="XLS"Then
ForK=Password_Start_LongToPassword_End_Long'破解excel开始
ForI=0ToArrayLen^K-1
pass=""
Temp=I
ForJ=1ToK-1
Temp=TempArrayLe
pass=all_char(TempModArrayLen) pass
NextJ
pass=pass all_char(IModArrayLen)
SetOpenReturn=xls.Workbooks.Open(FileName:=strpath,Password:=pass)
Text1.Text=pass'显示破解进度
Text1.Refresh
IfErr.Number<>0Then'如果解密成功,打开文档,显示密码,退出过程
Err.Clear
Else
Label1.Caption="文档密码:"
Text1.Text=pass
Me.Refresh
xls.Visible=True
CmdStartCrack.MousePointer=0
CmdStartCrack.Caption="开始破解"
blnProcessing=False
Setxls=Nothing
ExitSub
EndIf
DoEvents
IfNotblnProcessingThenExitFor
NextI
IfNotblnProcessingThenExitFor
NextK
xls.Quit
Setxls=Nothing
Else
ForK=Password_Start_LongToPassword_End_Long'破解word开始
ForI=0ToArrayLen^K-1
pass=""
Temp=I
ForJ=1ToK-
Temp=TempArrayLen
pass=all_char(TempModArrayLen) pass
NextJ
pass=pass all_char(IModArrayLen)
OpenReturn=wd.Documents.Open(FileName:=strpath,passworddocument:=pass)
Text1.Text=pass'显示破解进度
Text1.Refresh
IfErr.Number<>0Then'如果解密成功,打开文档,显示密码,退出过程
Err.Clear
Else
'MsgBox"wordpassword"
Label1.Caption="文档密码:"
Text1.Text=pass
Me.Refresh
wd.Visible=True
CmdStartCrack.MousePointer=0
CmdStartCrack.Caption="开始破解"
blnProcessing=False
Setwd=Nothing
ExitSub
EndIf
DoEvents
IfNotblnProcessingThenExitFor
NextI
IfNotblnProcessingThenExitFor
NextK
wd.Quit
Setwd=Nothing
EndIf
CmdStartCrack.Caption="开始破解"
IfblnProcessingThenMsgBox"没有找到密码,可能是密码位数不对!",,"提示信息..."
blnProcessing=False
EndSub
3.时间复杂度分析
一个算法的时间复杂度,是指该算法的时间耗费,是该算法所求解问题规模n的函数。根据前面讲的实现原理,我们知道,破解算法的时间耗费主要集中在尝试打开OFFICE文档上,因此,当我们假设破解一个N位字符串密码,且选定密码字符范围的总字符数为ArrayLen时,该算法的时间复杂度是O(ArrayLen^N)。即,当N确定后,该算法的时间复杂度是N次方阶;当ArrayLen确定后,该算法的时间复杂度是指数阶。都是高数量级的时间复杂度。
4.说明
穷举法解密对系统资源的占用是十分惊人的,在解密的过程中最好不要运行其他应用程序。如果安装有瑞星等杀毒软件,应将杀毒软件的“office安全助手”去掉,以便加快程序的运行速度。
该程序在WinXP OfficeXP VB6.0环境下测试通过,笔者随便测试了一个5位数字密码,在P4机器上,8分钟左右即可解开口令。

Tags:



相关评论
广告联系QQ:45157718 点击这里给我发消息 电话:13516821613 杭州余杭东港路118号雷恩国际科技创新园  网站技术支持:黄菊华互联网工作室 浙ICP备06056032号