瑞斯特 窮舉破解EXCEL、WORD文檔密碼

 

摘要:本文討論了如何使用VB編程,通過窮舉法解除EXCEL文檔和WORD文檔的密碼。并在破解過程中加入了中斷,以方便用戶隨時中斷破解過程。

關鍵字:窮舉法、解密、EXCEL文檔、WORD文檔、密碼

ExcelWord提供了多種方法限制訪問用戶文檔,以免未經授權者的查看和更改。但在信息化的今天,用戶需要記憶的密碼太多,一旦密碼丟失,用戶將無法打開或訪問該文檔,給用戶造成很大的損失。能否借助計算機的高速運行,解開密碼呢?通過嘗試,筆者認為:在無法弄清ExcelWord加密算法的情況下,利用窮舉法嘗試解密文檔,是解密唯一的選擇。

1. 實現原理
本程序選用VB6.0編寫,并充分利用了Office組件中的對象庫,窮舉嘗試各種口令,達到解密文檔的目的。
⑴ 巧用整數的取整及取余,產生密碼字符串
ExcelWord文檔密碼可以是字母、數字、空格以及符號的任意組合,最長可達 15 個字符,且區分大小寫。
本程序的破解過程利用一個兩層循環,產生選定字符的排列組合(嘗試密碼),其中外層循環控制密碼的位數,內層循環生成N位密碼的所有排列組合。產生嘗試密碼的方法是:將一個N位字符串密碼(password)作為一個數值,該數值每個位上的數字屬于選定字符范圍,且該數值與一個整數(X)一一對應,并滿足以下條件: 0 ≤X ≤ArrayLenN-1ArrayLen是選定密碼字符范圍的總字符數,如:僅選定數字時,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的錯誤處理功能,嘗試口令破解
當運行程序嘗試一個密碼時(用該密碼打開文檔),若密碼錯誤,則會產生運行錯誤。為此,必須在嘗試口令前,使用On Error 語句打開一個錯誤處理程序;由于本程序是嘗試各種口令,當一個口令錯誤時,直接嘗試下一個口令即可,因此,應使用 “On Error Resume Next”語句。
那么,如何得知找到口令了呢? VB有一個內部錯誤對象Err,它的 Number 屬性中的值是用來確定發生錯誤的原因。在嘗試一個口令后,檢查Err.Number中的值,以確定該口令是否正確。
⑶ 破解過程中的中斷
利用窮舉法解密對系統資源的占用是十分驚人的,在解密的過程中CPU的利用率幾乎是100%,若不加入解密過程中的中斷,計算機系統會處于一種假死機狀態。為此,在破解過程的內循環中加入了DoEvents函數。DoEvents函數提供了一種取消任務的簡便方法,它將控制切換到操作環境內核。只要此環境中的所有應用程序都有機會響應待處理事件,應用程序就又恢復控制。使用該函數的優點是:不會使應用程序放棄焦點,且后臺事件能夠得到有效處理。
2. 具體實現過程 
編程實現時,需要機器安裝有VB應用程序及Microsoft Office組件。
⑴ 新建VB工程,并對其初始化
新建一個VB工程,取名Get_Password,將啟動窗體命名為FrmMain。首先選擇工程菜單中的引用,在引用對話框中選擇“Microsoft Excel10.0 Object Library”“Microsoft Word10.0 Object Library”(注意:如果安裝的是Office2000Office97,應該選擇Excel對象庫和Word對象庫的9.0版或8.0版)。其次在工程菜單中部件對話框中,選擇添加“Microsoft Windows common controls -2.5(sp2)”“Microsoft Common Dialog control 6.0”,以便在窗體設計中使用微調控件和對話框控件。 
⑵ 在FrmMain窗體上添加控件
FrmMain窗體上,按照下圖的位置添加表1中的控件,然后根據表1修改每個對象的屬性。
 
1
序號      控件名稱      控件屬性及其屬性值
1      Frame      Name=Frame1Caption=選擇加密文件*.DOC*.XLS
2      Frame      Name=Frame2Caption=選定密碼字符范圍:
3      Frame      Name=Frame3Caption=選擇密碼的長度:
4      ComboBow      Name=Combo1
5      CommandButton      Name=CmdBrowseCaption=瀏覽
6      CommandButton      Name=CmdStartCrackCaption=開始破解
7      CommandButton      Name=CmdQuitCaption=退出系統
8      CheckBox      Name=ChkDigitalCaption=數字(10)
9      CheckBox      Name=ChkLowercaseCaption=小寫字母(26)
10      CheckBox      Name=ChkUppercaseCaption=大寫字母(26)
11      CheckBox      Name=ChkSpaceCaption=空格(1)
12      CheckBox      Name=ChkBracketCaption=括號(6)
13      CheckBox      Name=ChkOthersCaption=其他OEM字符(26)
14      TextBox      Name=txtPasswordStartLong, Text=2
15      TextBox      Name=txtPasswordEndLongText=2
16      TextBox      Name=Text1
17      UpDown      Name=UpDown1BuddyProperty=TextWrap=TRUEIncrement=1
           BuddyControl=txtPasswordStartLongMax=15Min=
18      UpDown      Name=UpDown2BuddyProperty=TextWrap=TRUEIncrement=1
           BuddyControl=txtPasswordEndLongMax=15Min=1
19      CommonDialog      Name=DialogDialogTitle=請選擇加密的ExcelWord文檔
           Filter=Excel(*.xls)Word(*.doc)|*.xls;*.doc
20      Label      Name=Label1, Caption=破解進度:
21      Label      Name=Label3Caption=從:
22      Label      Name=Label5Caption=到:

⑶ 為以上對象編寫下列代碼
為了便于理解,程序中增加了適當的注釋。
Option Explicit
Private Sub CmdBrowse_Click()
    Dialog.ShowOpen 'show the dialog
    Combo1.Text = Dialog.FileName   'set the Filename text box to the selected file
    Combo1.Refresh
End Sub

Private Sub CmdQuit_Click()
    End
End Sub

Private Sub CmdStartCrack_Click()
    Static blnProcessing As Boolean
    Dim wd As New Word.Application, xls As New Excel.Application
    Dim OpenReturn
    Dim strpath, pass, StrTemp, all_char(100) As String
    Dim J, K, Password_Start_Long, Password_End_Long, ArrayLen As Integer
    Dim I, Temp As Long
    ArrayLen = 0    '數組初始化
    If ChkDigital.Value = 1 Then
        For J = ArrayLen To ArrayLen + 9
            all_char(J) = Chr(Asc("0") + J - ArrayLen)
        Next J
        ArrayLen = ArrayLen + 10
    End If
    If ChkLowercase.Value = 1 Then
        For J = ArrayLen To ArrayLen + 25
            all_char(J) = Chr(Asc("a") + J - ArrayLen)
        Next J
        ArrayLen = ArrayLen + 26
    End If
    If ChkUppercase.Value = 1 Then
        For J = ArrayLen To ArrayLen + 25
            all_char(J) = Chr(Asc("A") + J - ArrayLen)
        Next J
        ArrayLen = ArrayLen + 26
    End If
    If ChkSpace.Value = 1 Then
        all_char(ArrayLen) = " "
        ArrayLen = ArrayLen + 1
    End If
    If ChkBracket.Value = 1 Then
        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
    End If
    If ChkOthers.Value = 1 Then
        For J = ArrayLen To ArrayLen + 6    '33 to 39
            all_char(J) = Chr(33 + J - ArrayLen)
        Next 
      ArrayLen = ArrayLen + 7
        For J = ArrayLen To ArrayLen + 5    '42 to 47
            all_char(J) = Chr(42 + J - ArrayLen)
        Next J
        ArrayLen = ArrayLen + 6
        For J = ArrayLen To ArrayLen + 6    '58 to 64
            all_char(J) = Chr(58 + J - ArrayLen)
        Next J
        ArrayLen = ArrayLen + 7
        all_char(ArrayLen) = Chr(92)
        ArrayLen = ArrayLen + 1
        For J = ArrayLen To ArrayLen + 2    '94 to 96
            all_char(J) = Chr(94 + J - ArrayLen)
        Next J
        ArrayLen = ArrayLen + 3
        all_char(ArrayLen) = Chr(124)
        all_char(ArrayLen+1) = Chr(126)
        ArrayLen = ArrayLen + 2
    End If
    If ArrayLen = 0 Then
        MsgBox "錯誤:沒有選擇'密碼使用的字符'", , "請選擇密碼使用的字符范圍..."
        Exit Sub
    End If
    If blnProcessing Then
        If MsgBox("真的要中斷解密過程嗎?", vbYesNo, "用戶中斷任務") = vbYes Then blnProcessing = False
    Else
        CmdStartCrack.Caption = "中斷破解"
        blnProcessing = True
        strpath = Combo1.Text
        If strpath = "" Then
            MsgBox "錯誤:沒有選擇'需要解密的文件'", , "請選擇需要解密的文件..."
            Exit Sub
        End If
        strpath = Trim(strpath)
        Password_Start_Long = Val(txtPasswordStartLong.Text)
        Password_End_Long = Val(txtPasswordEndLong.Text)
        If Password_Start_Long > Password_End_Long Then
            Password_Start_Long = Val(txtPasswordEndLong.Text)
            Password_End_Long = Val(txtPasswordStartLong.Text)
        End If
        Label1.Caption = "破解進度:"
        Label1.Refresh
        On Error Resume Next
        If UCase(Right(strpath, 3)) = "XLS" Then
            For K = Password_Start_Long To Password_End_Long    '破解excel開始
                For I = 0 To ArrayLen ^ K - 1
                    pass = ""
                    Temp = I
                    For J = 1 To K - 1
                        Temp = Temp \ ArrayLe
                        pass = all_char(Temp Mod ArrayLen) + pass
                    Next J
                    pass = pass + all_char(I Mod ArrayLen)
                    Set OpenReturn = xls.Workbooks.Open(FileName:=strpath, Password:=pass)
                    Text1.Text = pass    '顯示破解進度
                    Text1.Refresh
                    If Err.Number <> 0 Then  '如果解密成功,打開文檔,顯示密碼,退出過程
                        Err.Clear
                    Else
                        Label1.Caption = "文檔密碼:"
                        Text1.Text = pass
                        Me.Refresh
                        xls.Visible = True
                        CmdStartCrack.MousePointer = 0
                        CmdStartCrack.Caption = "開始破解"
                        blnProcessing = False
                        Set xls = Nothing
                        Exit Sub
                    End If
                    DoEvents
                    If Not blnProcessing Then Exit For
                Next I
                If Not blnProcessing Then Exit For
            Next K
            xls.Quit
            Set xls = Nothing
        Else
            For K = Password_Start_Long To Password_End_Long  '破解word開始
                For I = 0 To ArrayLen ^ K - 1
                    pass = ""
                    Temp = I
                    For J = 1 To K - 
                      Temp = Temp \ ArrayLen
                        pass = all_char(Temp Mod ArrayLen) + pass
                    Next J
                    pass = pass + all_char(I Mod ArrayLen)
                    OpenReturn = wd.Documents.Open(FileName:=strpath, passworddocument:=pass)
                    Text1.Text = pass  '顯示破解進度
                    Text1.Refresh
                    If Err.Number <> 0 Then    '如果解密成功,打開文檔,顯示密碼,退出過程
                        Err.Clear
                    Else
                        'MsgBox "word password"
                        Label1.Caption = "文檔密碼:"
                        Text1.Text = pass
                        Me.Refresh
                        wd.Visible = True
                        CmdStartCrack.MousePointer = 0
                        CmdStartCrack.Caption = "開始破解"
                        blnProcessing = False
                        Set wd = Nothing
                        Exit Sub
                    End If
                    DoEvents
                    If Not blnProcessing Then Exit For
                Next I
                If Not blnProcessing Then Exit For
            Next K
            wd.Quit
            Set wd = Nothing
        End If
        CmdStartCrack.Caption = "開始破解"
        If blnProcessing Then MsgBox "沒有找到密碼,可能是密碼位數不對!", , "提示信息..."
        blnProcessing = False
End Sub
3. 時間復雜度分析
一個算法的時間復雜度,是指該算法的時間耗費,是該算法所求解問題規模n的函數。根據前面講的實現原理,我們知道,破解算法的時間耗費主要集中在嘗試打開OFFICE文檔上,因此,當我們假設破解一個N位字符串密碼,且選定密碼字符范圍的總字符數為ArrayLen時,該算法的時間復雜度是O(ArrayLen^N)。即,當N確定后,該算法的時間復雜度是N次方階;當ArrayLen確定后,該算法的時間復雜度是指數階。都是高數量級的時間復雜度。
4. 說明 
窮舉法解密對系統資源的占用是十分驚人的,在解密的過程中最好不要運行其他應用程序。如果安裝有瑞星等殺毒軟件,應將殺毒軟件的“office安全助手去掉,以便加快程序的運行速度。
該程序在WinXP+OfficeXP+VB6.0環境下測試通過,筆者隨便測試了一個5位數字密碼,在P4機器上,8分鐘左右即可解開口令。

發表評論

 




 

哈努曼与假面五骑士
红姐开奖手机网站 重庆时时是真吗 白小姐传密118开奖结果 一分时时彩骗局 河北时时官网平台 精准规律公式 赌单双的规律 黑龙江时时大盘走是 安徽时时平台下载 赛马会高手论坛5马中特 老重庆时时官方走势图 中彩网甘肃快3走势图 吉林时时网站制作 三中三的算法 快乐12遗漏号码 赌赛车有什么稳赢方法