窮舉破解ECEL、WORD文檔密碼

時(shí)間:2022-10-08 04:03:00

導(dǎo)語(yǔ):窮舉破解ECEL、WORD文檔密碼一文來(lái)源于網(wǎng)友上傳,不代表本站觀(guān)點(diǎn),若需要原創(chuàng)文章可咨詢(xún)客服老師,歡迎參考。

窮舉破解ECEL、WORD文檔密碼

摘要:本文討論了如何使用VB編程,通過(guò)窮舉法解除EXCEL文檔和word文檔密碼。并在破解過(guò)程中加入了中斷,以方便用戶(hù)隨時(shí)中斷破解過(guò)程。

關(guān)鍵字:窮舉法、解密、EXCEL文檔、WORD文檔、密碼

Excel和Word提供了多種方法限制訪(fǎng)問(wèn)用戶(hù)文檔,以免未經(jīng)授權(quán)者的查看和更改。但在信息化的今天,用戶(hù)需要記憶的密碼太多,一旦密碼丟失,用戶(hù)將無(wú)法打開(kāi)或訪(fǎng)問(wèn)該文檔,給用戶(hù)造成很大的損失。能否借助計(jì)算機(jī)的高速運(yùn)行,解開(kāi)密碼呢?通過(guò)嘗試,筆者認(rèn)為:在無(wú)法弄清Excel和Word加密算法的情況下,利用窮舉法嘗試解密文檔,是解密唯一的選擇。

1.實(shí)現(xiàn)原理

本程序選用VB6.0編寫(xiě),并充分利用了Office組件中的對(duì)象庫(kù),窮舉嘗試各種口令,達(dá)到解密文檔的目的。

⑴巧用整數(shù)的取整及取余,產(chǎn)生密碼字符串

Excel和Word文檔密碼可以是字母、數(shù)字、空格以及符號(hào)的任意組合,最長(zhǎng)可達(dá)15個(gè)字符,且區(qū)分大小寫(xiě)。

本程序的破解過(guò)程利用一個(gè)兩層循環(huán),產(chǎn)生選定字符的排列組合(嘗試密碼),其中外層循環(huán)控制密碼的位數(shù),內(nèi)層循環(huán)生成N位密碼的所有排列組合。產(chǎn)生嘗試密碼的方法是:將一個(gè)N位字符串密碼(password)作為一個(gè)“數(shù)值”,該“數(shù)值”每個(gè)位上的“數(shù)字”屬于選定字符范圍,且該“數(shù)值”與一個(gè)整數(shù)(X)一一對(duì)應(yīng),并滿(mǎn)足以下條件:0≤X≤ArrayLenN-1(ArrayLen是選定密碼字符范圍的總字符數(shù),如:僅選定數(shù)字時(shí),ArrayLen=10;僅選定數(shù)字和小寫(xiě)字母時(shí),ArrayLen=10+26=36);對(duì)X整除、取余N-1次,對(duì)每次的余數(shù)Y做以下操作:password=password+CharArray(Y)(注:CharArray是存放選定字符的一維數(shù)組),最后做以下操作:password=CharArray(XMODArrayLen)+password,產(chǎn)生的password就是整數(shù)X對(duì)應(yīng)的N位字符串。

⑵利用VB的錯(cuò)誤處理功能,嘗試口令破解

當(dāng)運(yùn)行程序嘗試一個(gè)密碼時(shí)(用該密碼打開(kāi)文檔),若密碼錯(cuò)誤,則會(huì)產(chǎn)生運(yùn)行錯(cuò)誤。為此,必須在嘗試口令前,使用OnError語(yǔ)句打開(kāi)一個(gè)錯(cuò)誤處理程序;由于本程序是嘗試各種口令,當(dāng)一個(gè)口令錯(cuò)誤時(shí),直接嘗試下一個(gè)口令即可,因此,應(yīng)使用“OnErrorResumeNext”語(yǔ)句。

那么,如何得知找到口令了呢?VB有一個(gè)內(nèi)部錯(cuò)誤對(duì)象Err,它的Number屬性中的值是用來(lái)確定發(fā)生錯(cuò)誤的原因。在嘗試一個(gè)口令后,檢查Err.Number中的值,以確定該口令是否正確。

⑶破解過(guò)程中的中斷

利用窮舉法解密對(duì)系統(tǒng)資源的占用是十分驚人的,在解密的過(guò)程中CPU的利用率幾乎是100%,若不加入解密過(guò)程中的中斷,計(jì)算機(jī)系統(tǒng)會(huì)處于一種假死機(jī)狀態(tài)。為此,在破解過(guò)程的內(nèi)循環(huán)中加入了DoEvents函數(shù)。DoEvents函數(shù)提供了一種取消任務(wù)的簡(jiǎn)便方法,它將控制切換到操作環(huán)境內(nèi)核。只要此環(huán)境中的所有應(yīng)用程序都有機(jī)會(huì)響應(yīng)待處理事件,應(yīng)用程序就又恢復(fù)控制。使用該函數(shù)的優(yōu)點(diǎn)是:不會(huì)使應(yīng)用程序放棄焦點(diǎn),且后臺(tái)事件能夠得到有效處理。

2.具體實(shí)現(xiàn)過(guò)程

編程實(shí)現(xiàn)時(shí),需要機(jī)器安裝有VB應(yīng)用程序及MicrosoftOffice組件。

⑴新建VB工程,并對(duì)其初始化

新建一個(gè)VB工程,取名Get_Password,將啟動(dòng)窗體命名為FrmMain。首先選擇“工程”菜單中的“引用”,在“引用”對(duì)話(huà)框中選擇“MicrosoftExcel10.0ObjectLibrary”和“MicrosoftWord10.0ObjectLibrary”(注意:如果安裝的是Office2000或Office97,應(yīng)該選擇Excel對(duì)象庫(kù)和Word對(duì)象庫(kù)的9.0版或8.0版)。其次在“工程”菜單中“部件”對(duì)話(huà)框中,選擇添加“MicrosoftWindowscommoncontrols-2.5(sp2)”和“MicrosoftCommonDialogcontrol6.0”,以便在窗體設(shè)計(jì)中使用微調(diào)控件和對(duì)話(huà)框控件。

⑵在FrmMain窗體上添加控件

在FrmMain窗體上,按照下圖的位置添加表1中的控件,然后根據(jù)表1修改每個(gè)對(duì)象的屬性。

表1:

序號(hào)控件名稱(chēng)控件屬性及其屬性值

1FrameName=Frame1,Caption=選擇加密文件(*.DOC、*.XLS)

2FrameName=Frame2,Caption=選定密碼字符范圍:

3FrameName=Frame3,Caption=選擇密碼的長(zhǎng)度:

4ComboBowName=Combo1

5CommandButtonName=CmdBrowse,Caption=瀏覽

6CommandButtonName=CmdStartCrack,Caption=開(kāi)始破解

7CommandButtonName=CmdQuit,Caption=退出系統(tǒng)

8CheckBoxName=ChkDigital,Caption=數(shù)字(10)

9CheckBoxName=ChkLowercase,Caption=小寫(xiě)字母(26)

10CheckBoxName=ChkUppercase,Caption=大寫(xiě)字母(26)

11CheckBoxName=ChkSpace,Caption=空格(1)

12CheckBoxName=ChkBracket,Caption=括號(hào)(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=118UpDownName=UpDown2,BuddyProperty=Text,Wrap=TRUE,Increment=1

BuddyControl=txtPasswordEndLong,Max=15,Min=1

19CommonDialogName=Dialog,DialogTitle=請(qǐng)選擇加密的Excel或Word文檔

Filter=Excel(*.xls),Word(*.doc)|*.xls;*.doc

20LabelName=Label1,Caption=破解進(jìn)度:

21LabelName=Label3,Caption=從:

22LabelName=Label5,Caption=到:

⑶為以上對(duì)象編寫(xiě)下列代碼

為了便于理解,程序中增加了適當(dāng)?shù)淖⑨尅?/p>

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''''數(shù)組初始化

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)

NextJ

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"錯(cuò)誤:沒(méi)有選擇''''密碼使用的字符''''",,"請(qǐng)選擇密碼使用的字符范圍..."

ExitSub

EndIf

IfblnProcessingThen

IfMsgBox("真的要中斷解密過(guò)程嗎?",vbYesNo,"用戶(hù)中斷任務(wù)")=vbYesThenblnProcessing=False

Else

CmdStartCrack.Caption="中斷破解"

blnProcessing=True

strpath=Combo1.Text

Ifstrpath=""Then

MsgBox"錯(cuò)誤:沒(méi)有選擇''''需要解密的文件''''",,"請(qǐng)選擇需要解密的文件..."

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="破解進(jìn)度:"

Label1.Refresh

OnErrorResumeNext

IfUCase(Right(strpath,3))="XLS"Then

ForK=Password_Start_LongToPassword_End_Long''''破解excel開(kāi)始

ForI=0ToArrayLen^K-1

pass=""

Temp=I

ForJ=1ToK-1

Temp=Temp\ArrayLenpass=all_char(TempModArrayLen)+pass

NextJ

pass=pass+all_char(IModArrayLen)

SetOpenReturn=xls.Workbooks.Open(FileName:=strpath,Password:=pass)

Text1.Text=pass''''顯示破解進(jìn)度

Text1.Refresh

IfErr.Number<>0Then''''如果解密成功,打開(kāi)文檔,顯示密碼,退出過(guò)程

Err.Clear

Else

Label1.Caption="文檔密碼:"

Text1.Text=pass

Me.Refresh

xls.Visible=True

CmdStartCrack.MousePointer=0

CmdStartCrack.Caption="開(kāi)始破解"

blnProcessing=False

Setxls=Nothing

ExitSub

EndIf

DoEvents

IfNotblnProcessingThenExitFor

NextI

IfNotblnProcessingThenExitFor

NextK

xls.Quit

Setxls=Nothing

Else

ForK=Password_Start_LongToPassword_End_Long''''破解word開(kāi)始

ForI=0ToArrayLen^K-1

pass=""

Temp=I

ForJ=1ToK-1Temp=Temp\ArrayLen

pass=all_char(TempModArrayLen)+pass

NextJ

pass=pass+all_char(IModArrayLen)

OpenReturn=wd.Documents.Open(FileName:=strpath,passworddocument:=pass)

Text1.Text=pass''''顯示破解進(jìn)度

Text1.Refresh

IfErr.Number<>0Then''''如果解密成功,打開(kāi)文檔,顯示密碼,退出過(guò)程

Err.Clear

Else

''''MsgBox"wordpassword"

Label1.Caption="文檔密碼:"

Text1.Text=pass

Me.Refresh

wd.Visible=True

CmdStartCrack.MousePointer=0

CmdStartCrack.Caption="開(kāi)始破解"

blnProcessing=False

Setwd=Nothing

ExitSub

EndIf

DoEvents

IfNotblnProcessingThenExitFor

NextI

IfNotblnProcessingThenExitFor

NextK

wd.Quit

Setwd=Nothing

EndIf

CmdStartCrack.Caption="開(kāi)始破解"

IfblnProcessingThenMsgBox"沒(méi)有找到密碼,可能是密碼位數(shù)不對(duì)!",,"提示信息..."

blnProcessing=FalseEndSub

3.時(shí)間復(fù)雜度分析

一個(gè)算法的時(shí)間復(fù)雜度,是指該算法的時(shí)間耗費(fèi),是該算法所求解問(wèn)題規(guī)模n的函數(shù)。根據(jù)前面講的實(shí)現(xiàn)原理,我們知道,破解算法的時(shí)間耗費(fèi)主要集中在嘗試打開(kāi)OFFICE文檔上,因此,當(dāng)我們假設(shè)破解一個(gè)N位字符串密碼,且選定密碼字符范圍的總字符數(shù)為ArrayLen時(shí),該算法的時(shí)間復(fù)雜度是O(ArrayLen^N)。即,當(dāng)N確定后,該算法的時(shí)間復(fù)雜度是N次方階;當(dāng)ArrayLen確定后,該算法的時(shí)間復(fù)雜度是指數(shù)階。都是高數(shù)量級(jí)的時(shí)間復(fù)雜度。

4.說(shuō)明

窮舉法解密對(duì)系統(tǒng)資源的占用是十分驚人的,在解密的過(guò)程中最好不要運(yùn)行其他應(yīng)用程序。如果安裝有瑞星等殺毒軟件,應(yīng)將殺毒軟件的“office安全助手”去掉,以便加快程序的運(yùn)行速度。

該程序在WinXP+OfficeXP+VB6.0環(huán)境下測(cè)試通過(guò),筆者隨便測(cè)試了一個(gè)5位數(shù)字密碼,在P4機(jī)器上,8分鐘左右即可解開(kāi)口令。

參考文獻(xiàn):

[1]王建華譯.VisualBasic6開(kāi)發(fā)人員指南.北京:機(jī)械工業(yè)出版社,1999