1、穷举破解 EXCEL、WORD 文档密码摘要:本文讨论了如何使用 VB 编程,通过穷举法解除 EXCEL 文档和WORD 文档的密码。并在破解过程中加入了中断,以方便用户随时中断破解过程。关键字:穷举法、解密、EXCEL 文档、WORD 文档、密码Excel 和 Word 提供了多种方法限制访问用户文档,以免未经授权者的查看和更改。但在信息化的今天,用户需要记忆的密码太多,一旦密码丢失,用户将无法打开或访问该文档,给用户造成很大的损失。能否借助计算机的高速运行,解开密码呢?通过尝试,笔者认为:在无法弄清Excel 和 Word 加密算法的情况下,利用穷举法尝试解密文档,是解密唯一的选择。1.
2、实现原理本程序选用 VB6.0 编写,并充分利用了 Office 组件中的对象库,穷举尝试各种口令,达到解密文档的目的。 巧用整数的取整及取余,产生密码字符串Excel 和 Word 文档密码可以是字母、数字、空格以及符号的任意组合,最长可达 15 个字符,且区分大小写。本程序的破解过程利用一个两层循环,产生选定字符的排列组合(尝试密码) ,其中外层循环控制密码的位数,内层循环生成 N 位密码的所有排列组合。产生尝试密码的方法是:将一个 N 位字符串密码(password)作为一个“数值” ,该“数值”每个位上的“数字”属于选定字符范围,且该“数值”与一个整数(X)一一对应,并满足以下条件:
3、0 X ArrayLenN-1(ArrayLen 是选定密码字符范围的总字符数,如:仅选定数字时,ArrayLen=10;仅选定数字和小写字母时,ArrayLen=10+26=36) ;对 X 整除、取余 N-1 次,对每次的余数 Y 做以下操作:password = password + CharArray(Y) (注:CharArray 是存放选定字符的一维数组),最后做以下操作:password = CharArray(X MOD ArrayLen) + password,产生的 password 就是整数 X 对应的 N 位字符串。 利用 VB 的错误处理功能,尝试口令破解当运行程序尝
4、试一个密码时(用该密码打开文档) ,若密码错误,则会产生运行错误。为此,必须在尝试口令前,使用 On Error 语句打开一个错误处理程序;由于本程序是尝试各种口令,当一个口令错误时,直接尝试下一个口令即可,因此,应使用 “On Error Resume Next”语句。那么,如何得知找到口令了呢? VB 有一个内部错误对象 Err,它的 Number 属性中的值是用来确定发生错误的原因。在尝试一个口令后,检查 Err.Number 中的值,以确定该口令是否正确。 破解过程中的中断利用穷举法解密对系统资源的占用是十分惊人的,在解密的过程中 CPU的利用率几乎是 100%,若不加入解密过程中的中
5、断,计算机系统会处于一种假死机状态。为此,在破解过程的内循环中加入了 DoEvents 函数。DoEvents 函数提供了一种取消任务的简便方法,它将控制切换到操作环境内核。只要此环境中的所有应用程序都有机会响应待处理事件,应用程序就又恢复控制。使用该函数的优点是:不会使应用程序放弃焦点,且后台事件能够得到有效处理。2. 具体实现过程 编程实现时,需要机器安装有 VB 应用程序及 Microsoft Office 组件。 新建 VB 工程,并对其初始化新建一个 VB 工程,取名 Get_Password,将启动窗体命名为 FrmMain。首先选择“工程”菜单中的“引用” ,在“引用”对话框中选
6、择“Microsoft Excel10.0 Object Library”和“Microsoft Word10.0 Object Library”(注意:如果安装的是 Office2000 或 Office97,应该选择 Excel 对象库和 Word 对象库的 9.0 版或 8.0 版) 。其次在“工程”菜单中“部件”对话框中,选择添加“Microsoft Windows common controls -2.5(sp2)”和“Microsoft Common Dialog control 6.0”,以便在窗体设计中使用微调控件和对话框控件。 在 FrmMain 窗体上添加控件在 FrmMa
7、in 窗体上,按照下图的位置添加表 1 中的控件,然后根据表 1修改每个对象的属性。表 1:序号 控件名称 控件属性及其属性值1 Frame Name=Frame1,Caption=选择加密文件(*.DOC、*.XLS)2 Frame Name=Frame2,Caption=选定密码字符范围:3 Frame Name=Frame3,Caption=选择密码的长度:4 ComboBow Name=Combo15 CommandButton Name=CmdBrowse,Caption=浏览6 CommandButton Name=CmdStartCrack,Caption=开始破解7 Comma
8、ndButton Name=CmdQuit,Caption=退出系统8 CheckBox Name=ChkDigital,Caption=数字(10)9 CheckBox Name=ChkLowercase,Caption=小写字母(26)10 CheckBox Name=ChkUppercase,Caption=大写字母(26)11 CheckBox Name=ChkSpace,Caption=空格(1)12 CheckBox Name=ChkBracket,Caption=括号(6)13 CheckBox Name=ChkOthers,Caption=其他 OEM 字符(26)14 Tex
9、tBox Name=txtPasswordStartLong, Text=215 TextBox Name=txtPasswordEndLong,Text=216 TextBox Name=Text117 UpDown Name=UpDown1,BuddyProperty=Text,Wrap=TRUE,Increment=1BuddyControl=txtPasswordStartLong,Max=15,Min=18 UpDown Name=UpDown2,BuddyProperty=Text,Wrap=TRUE,Increment=1BuddyControl=txtPasswordEndLo
10、ng,Max=15,Min=119 CommonDialog Name=Dialog,DialogTitle=请选择加密的Excel 或 Word 文档Filter=Excel(*.xls),Word(*.doc)|*.xls;*.doc20 Label Name=Label1, Caption=破解进度:21 Label Name=Label3,Caption=从:22 Label Name=Label5,Caption=到: 为以上对象编写下列代码为了便于理解,程序中增加了适当的注释。Option ExplicitPrivate Sub CmdBrowse_Click()Dialog.Sh
11、owOpen show the dialogCombo1.Text = Dialog.FileName set the Filename text box to the selected fileCombo1.RefreshEnd SubPrivate Sub CmdQuit_Click()EndEnd SubPrivate Sub CmdStartCrack_Click()Static blnProcessing As BooleanDim wd As New Word.Application, xls As New Excel.ApplicationDim OpenReturnDim st
12、rpath, pass, StrTemp, all_char(100) As StringDim J, K, Password_Start_Long, Password_End_Long, ArrayLen As IntegerDim I, Temp As LongArrayLen = 0 数组初始化If ChkDigital.Value = 1 ThenFor J = ArrayLen To ArrayLen + 9all_char(J) = Chr(Asc(“0“) + J - ArrayLen)Next JArrayLen = ArrayLen + 10End IfIf ChkLower
13、case.Value = 1 ThenFor J = ArrayLen To ArrayLen + 25all_char(J) = Chr(Asc(“a“) + J - ArrayLen)Next JArrayLen = ArrayLen + 26End IfIf ChkUppercase.Value = 1 ThenFor J = ArrayLen To ArrayLen + 25all_char(J) = Chr(Asc(“A“) + J - ArrayLen)Next JArrayLen = ArrayLen + 26End IfIf ChkSpace.Value = 1 Thenall
14、_char(ArrayLen) = “ “ArrayLen = ArrayLen + 1End IfIf ChkBracket.Value = 1 Thenall_char(ArrayLen) = “(“all_char(ArrayLen+1) = “)“all_char(ArrayLen+2) = “all_char(ArrayLen+3) = “all_char(ArrayLen+4) = “all_char(ArrayLen+5) = “ArrayLen = ArrayLen + 6End IfIf ChkOthers.Value = 1 ThenFor J = ArrayLen To
15、ArrayLen + 6 33 to 39all_char(J) = Chr(33 + J - ArrayLen)Next ArrayLen = ArrayLen + 7For J = ArrayLen To ArrayLen + 5 42 to 47all_char(J) = Chr(42 + J - ArrayLen)Next JArrayLen = ArrayLen + 6For J = ArrayLen To ArrayLen + 6 58 to 64all_char(J) = Chr(58 + J - ArrayLen)Next JArrayLen = ArrayLen + 7all
16、_char(ArrayLen) = Chr(92)ArrayLen = ArrayLen + 1For J = ArrayLen To ArrayLen + 2 94 to 96all_char(J) = Chr(94 + J - ArrayLen)Next JArrayLen = ArrayLen + 3all_char(ArrayLen) = Chr(124)all_char(ArrayLen+1) = Chr(126)ArrayLen = ArrayLen + 2End IfIf ArrayLen = 0 ThenMsgBox “错误:没有选择密码使用的字符“, , “请选择密码使用的字
17、符范围.“Exit SubEnd IfIf blnProcessing ThenIf MsgBox(“真的要中断解密过程吗?“, vbYesNo, “用户中断任务“) = vbYes Then blnProcessing = FalseElseCmdStartCrack.Caption = “中断破解“blnProcessing = Truestrpath = Combo1.TextIf strpath = “ ThenMsgBox “错误:没有选择需要解密的文件“, , “请选择需要解密的文件.“Exit SubEnd Ifstrpath = Trim(strpath)Password_St
18、art_Long = Val(txtPasswordStartLong.Text)Password_End_Long = Val(txtPasswordEndLong.Text)If Password_Start_Long Password_End_Long ThenPassword_Start_Long = Val(txtPasswordEndLong.Text)Password_End_Long = Val(txtPasswordStartLong.Text)End IfLabel1.Caption = “破解进度:“Label1.RefreshOn Error Resume NextIf
19、 UCase(Right(strpath, 3) = “XLS“ ThenFor K = Password_Start_Long To Password_End_Long 破解 excel 开始For I = 0 To ArrayLen K - 1pass = “Temp = IFor J = 1 To K - 1Temp = Temp ArrayLepass = all_char(Temp Mod ArrayLen) + passNext Jpass = pass + all_char(I Mod ArrayLen)Set OpenReturn = xls.Workbooks.Open(FileName:=strpath, Password:=pass)Text1.Text = pass 显示破解进度Text1.RefreshIf Err.Number 0 Then 如果解密成功,打开文档,显示密码,退出过程Err.ClearElseLabel1.Caption = “文档密码:“Text1.Text = passMe.Refreshxls.Visible = TrueCmdStartCrack.MousePointer = 0CmdStartCrack.Caption = “开始破解“