【 在 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]