精華區beta NetSecurity 關於我們 聯絡資訊
【 在 NITER.bbs@HYD.pine.ncu.edu.tw ( 孔子) 的大作中提到: 】 : 竟然有人把自己的BIOS密碼忘了(就是我姐),誰會破解,教一下吧! : P.S.:486 DX4-100 AMI 的 BIOS (雖然換主機板比較快) 給你一篇文章看看 ----------------------------------------------------------- Award BIOS的密碼編碼原理 ┌──┐ │前言│ └──┘ 這篇文章旨在探討Award BIOS密碼編碼儲存的方式,並不主張你未經同意使用別人 的電腦。以下的"BIOS"均指Award BIOS。 ┌─────────┐ │BIOS密碼的編碼方式│ └─────────┘ 大家都知道在BIOS的設定中,可以設定開機時的密碼,這個密碼可以選擇在開機時就 詢問或是在進入BIOS設定的時候詢問密碼,但是若您在開機後使用程式來讀出CMOS中的設 定,並不會發現密碼字串的。 如果分別設定兩次不同的密碼,再將CMOS的內容dump出來看,您會發現有數個bytes 的不同,其中有第17個byte,第28,29個bytes,及第46,47個bytes等。其實BIOS是將密 碼以某種形式的方式編碼,儲存在第28,29個bytes中(是一個word或說是一個int的型式 ),若輸入一個密碼字串,其編碼方式如下: 1.配置一個空間存放編碼的結果(ans),並將其初始化(設為0); 2.將ans往左旋轉兩個位元,旋轉時最高位元補到最低位元,在第一次時ans結果 仍為0; 3.依序取出輸入的字元(ascii),若字元不是0(NULL),則把字元加到ans,重複步 驟2;若是0就是到字串結尾,ans即為輸出的結果。 從上面的演算法中可以看出不同的密碼可能有相同的輸出結果,而BIOS在檢查輸入時只檢 查結果(CMOS中也只儲存結果),以下是一個模擬BIOS計算編碼結果的程式: #include <stdio.h> void main(int argc, char **argv) { int passwd=0, // 存放編碼結果 i=0; if (argc == 1) { printf("usage : %S <your password>", argv[0]); return; } // 測試是否到字串結尾或超過8個字 while (argv[1][i] != NULL && i <= 7) { // 編碼迴圈 passwd = (passwd<<2) + ((passwd >> 14)&0x0003); passwd += (int) argv[1][i++]; } printf("the encoding passwd is : %4x\n" ,passwd); return; } 利用這個程式可以發現,其實現在所說的萬用密碼Syxz,AWAWD_SW,589589...等都有 相同的ans值,這也就是為什麼萬用密碼可以有那麼多組的原因了。 ┌──────────┐ │破解BIOS密碼的可能性│ └──────────┘ 以下是利用原來的演算法將其逆轉,所設計出來的密碼dump程式,它所求出來的密碼 和原password不同,但將其編碼後可以得到相同的值,因此可以用來得到BIOS的密碼,以 下為程式原始碼; #include <dos.h> #include <iostream.h> #include <stdlib.h> unsigned int enc_int; char enc_char[2]; char p[8] = {0, 0, 0, 0, 0, 0, 0, 0}; void main() { int i=7; outportb(0x70, 28); // 讀取BIOS中儲存密碼的部分 enc_char[0] = inport(0x71); outportb(0x70, 29); enc_char[1] = inport(0x71); enc_int = (enc_char[1] << 8) + enc_char[0]; while (enc_int !=0 && i>=0) { if ((enc_int&0x007f) >= 0x20) // 要用鍵盤輸入,ASCII值在32 p[i] = enc_int&0x007f; // 到128之間 else p[i] = 0x20; enc_int = enc_int - p[i]; enc_int = (enc_int>>2) + ((enc_int% for (i=0; i <=7; i++) { if (!p[i]) continue; // 尋找密碼的開頭 if (p[i] != ' ') cout << p[i]; else cout << "<space>"; // 空白特別處理 } cout << endl; return; } ┌──┐ │後記│ └──┘ 1.本文之程式碼均在turbo C++ 3.0下編譯。 2.測試之BIOS為Award Plug and Play BIOS Extension V1.0A 3.本文歡迎轉貼,但請撥空寫封信知會筆者 ch.bbs@bbs.im.tku.edu.tw,並且請不要更改 本文內容。 4.若對本文內容有任何批評建議,也歡迎您來信指教。 ------------------------------------------------------------- 希望對你有幫助 -- ====================================== LondonWolf 大西洋中可愛的小野狼 淡江資管BBS站security,network板板主 telnet://bbs.im.tku.edu.tw E-Mail:london@future.com.hk URL:http://www.future.com.hk/~london/ ※ 來源:‧渡船頭之戀 bbs.im.tku.edu.tw‧[FROM: gt1.get.com.tw]