首页  编辑  

CMOS密码全攻略

Tags: /计算机文档/网络与安全/   Date Created:

]、。·ˉˇ¨〃々—~‖…’”〕〉》」』〗】∶!"'),.:;?]` Acer/IBM [S7 SS]

AMI BIOS [ UQ ]

AMI WinBIOS (12/15/93) [ 3 ]

AMI WinBIOS 2.5 [ 3 ]

Award 4.5x Supervisor/U1/U2 [2311000][000033][33313020]

Compaq (1992) [ 6 .]

Compaq (Try...) [6? ? ]

Dell version A08, 1993 [][ ]

IBM (PS/2, Activa ...) [ ][ 6 ]

IBM Thinkpad boot pwd [ 6 ]

IBM 300 GL [ ]

Zenith AMI Supervisor/User [???????] [???????]

中括号里的内容就是密码, 但是不一定都管用,因为现在的一些主板

把通用密码去掉了。

*****************

COMS加密

COMS 1ch或3ah处的一个字通过进位的循环左移两位,然后与输入的密码相加,最后得到的字就是密字,密码的长度不超过8位。算法中“通过进位的循环左移两位”,可以把它描述为4a-65536k+k(其中a为密码,k=0-3)。所以BIOS的加密算法可用数学公式表示为:

(……((4a7-65535k7+a6)*4-65535k6+a5)……)4-65535k1+a0=w

   式中a1为密码,k1=0-3,w为密字

先向大家说明一下CMOS的一些结构:  

00000000H 30 00| FF 00 | 39 00 | FF 00 | 12 00 | FF 00 |01 00 | 18 00  

秒 | 秒报警 | 分 |分报警 | 小时 |时报警 |星期 | 日  

00000010H 11 00| 98 00 | 26 00 | 02 00| 70 00 | 80 00 |00 00 | 00 00  

月 | 年 |寄存器A|寄存器B|寄存器C|寄存器D |诊断 | 下电  

00000020H 40 00| 7E 00 | F0 00| 03 00| 0F 00| 80 00 |02 00 | 00 00  

软驱| 密码域 | 硬盘 | 未知 | 设备 |基本内存| 扩充  

00000030H 7C 00| 2E 00 | 00 00| 7F 00| 15 00| 86 00 |00 00 | 00 00  

内存|硬盘类型| 未知 | 密码数据位 | 未知  

00000040H 00 00| 00 00 | 00 00| 00 00| 00 00| 00 00 |E2 00 | 22 00  

未知  

00000050H 0F 00| FF 00 | FF 00| E1 00| 22 00| 3F 00 |08 00 | 59 00  

未知  

00000060H 00 00| 7C 00 | 19 00| 80 00| FF 00| FF 00 |FF 00 | FF 00  

未知 | 世纪值 | 未知  

00000070H 7D 00| 81 00 | AA 00| 0F 00| 39 00| 9B 00 |E8 00 |19 00  

未知  

上述的内容参考了其他资料,所以不一定完全正确.在38H-3BH这四个字节中,由于39H和3BH这两

个字节一直为00H,所以就略过,那么CMOS密码的关键就集中到了38H和3AH这两个字节上。先

介绍一点Award的密码规则,Award允许一位至八位密码,每一个字符的范围由20H-7FH,也就是由空格到ASCII码的127号。想必大家已经发现了,八个字符要放到两个字节中去,好象不压缩一下是不行的。的确,Award是将其压缩了,但是不是普通的压缩方法,我想Award另有将其加密的想法,因为在CMOS中空位还很多,要想放八个字节看来是没有什么问题的,不过这么裸露的密码就更加没有什么用处了。通常的压缩方式有无损压缩,如zip,arj等,或者是有损压缩,象mpeg,jpeg等。但是对这么几个字节,这些方法就没有什么用武之地了,而且压缩过的东西,应该是可以还原的,否则压来压去就没有什么意义了。不过Award的方法就不同了,他不仅仅进行了超级的有损压缩用的是HASH算法,而且这种压缩是不可还原的,下面就给出他的加密压缩方法(以下数值,运算均基于16进制):假如有一密码,八位,记为:ABCDEFGH(每一位的取值范围为20H-7FH),将其按下列公式运算:H+4*G+10*F+40*E+100*D+400*C+1000*B+4000*A ,将结果按由低到高保存到:H1,H2,H3,字节中,然后将H2保存到地址:3AH中,将H1和H3的和保存到38H中。如果密码不足八位,以此类推。  

下面举一实例:我的密码为:r*vte,ASCII码为:72H、2AH、76H、74H、65H,按公式运算得:72*100 + 2A*40 + 76*10 + 74*4 + 65=8615,于是H1=00H,H2=86H,H3=15H,所以3AH的值为86H,38H的值为15H。看来密码就这么简单,在你每次输入密码的时候,BIOS将其算算,再与CMOS中的值比较一下,如果一样就放行,否则免谈。过程就是这样,不过还是有些问题要说明,先算算看,两个字节可以表达的密码可以有多少种:164=65536种,而八位密码,每一位有96种选择,则可以表示的密码有:968≈7.2×1015种,所以理论上说,每一个密码,都可以找出大约1011这么多个可以起相同作用的密码。但是事实上并不是大家都是八位的密码,或许没有大得这么吓人,不过也挺多的,就如我那个密码,光与他相同功能的五位密码就有二十五万多个,而六位,七位,八位的更多,数量不详,因为从来没有把他算完过,时间太长了,耗不起。  

2)关于通用密码:  

Award4.51版以前的才有通用密码,  

wantgirl  

Syxz(pay attension to the capital letter)  

dirrid  

wnatgirl  

3)在这里再向大家介绍一下复旦网友们的破解程序:(道德感不佳者和功力不够深者略过)  

you try (under dos)  

debug  

o 70 2e  

o 71 00  

o 70 2f  

o 71 00  

note:在windowsNT下,很多破解程序都无法使用,原因在于WindowsNT的DOS是模拟的禁止对CMOS

写入,请大家注意。  

(一)  

//AMIPWD.CPP --- Show AMI Password String  

//Compile with SMALL model Tel:027-7800172 7404402(H)  

//Email:mecad@server20.hust.edu.cn  

#include  

#include  

#define BYTE unsigned char  

char AMI_unEncrypt( BYTE key,BYTE c2){  

asm xor di,di  

asm mov bl,key  

asm mov cl,c2  

lab1:  

asm test bl,0xc3  

asm jpe lab2  

asm stc  

lab2:  

asm rcr bl,1  

asm inc di  

asm cmp bl,cl  

asm jne lab1:  

return _DI;  

}  

BYTE rbyte(int port){  

outp(0x70,port);  

outp(0xed, port);  

return inp(0x71);  

}  

// 0x38-3d password code 0x37 initial value  

void main(){  

int i, length;  

static BYTE secret[7];  

char str[22]=\"\";  

for(length=0; length<7; length++)  

secret[length] = rbyte(0x37+length);  

secret[0] &= 0xf0;  

for(i=0; i<7 ,secret[i+1]>0; i++)  

str[i] = AMI_unEncrypt(secret[i], secret[i+1]);  

str[i+1]=0;  

if (secret[1]==0)  

printf(\"No password\\n\");  

else  

printf(\"Password=%s\\n\",str);  

return;  

(二)  

前述针对AMI主板的BIOS口令破译算法在BIOS日期为91.5.5, 91.7.7, 91.12.12,92.6.6和92.11.11的微机上测试通过. 为便于理解,将解密算法的C代码列出:  

char AMI_unEncrypt( BYTE key,BYTE c2){  

BYTE num[]={ 0,1,1,2 };  

int di=0,c;  

do{  

c=num[key>>6]+num[key&3];  

if (c&1) key=0x80+(key>>1);  

else key>>=1;  

di++;  

}whi

我有一个解密且不伤数据的方法:(对128BYTE的BIOS测试过,64的不太清楚)

第0X11字节处是一个有无密码的标志如有则是E6无则是E4(有可能反了,太久,记不太清了)

第1C,1D处是密码存放处,清零

第2E,2F处是CHECKSUM,它是BIOS中所有数据字节之和,与一般数据不同的是,它的顺序是高位在前

再详细点,比如2E是EE,2F是FF,1C是CC,1D是DD,就应该用EEFF分别减去DD和CC,别忘了还要减去有0X11处的2,再将结果高位存入2E,低位存入2F,重启,是不是和没设密码一样?

有的解密方法就是破坏BIOS中的一个字节使CHECKSUM失效,则启动时BIOS会自动更新为厂家设置

如果你想解出别人使用的原密码,先打击你一下,几乎没有可能。因为BIOS是单向加密,具体好像是左移一位或几位,记不清了,试一下就知道,很简单。你只有用ASCII码加密后去比对是否一样,其结果将是N(N>1000)个密码出现,虽然用出现的任何一个都能进入系统,但你知道别人是用的哪一个?呵呵

现在使用BIOS都有你说的问题,它并没有把你的口令完整的存下来

而是从其中取了一部分(不同的BIOS用的算法不同)

所以就造成了许多等效口令

现在的BIOS口令是由7个字符组成,经加密后成为一个双字节的数存放在BIOS中,

设7个字符依次为ABCDEFG

加密方法为第N个字符(A为第6,G为第0个)左移N位并转换成字,全部带进位加起来,

所得结果为BIOS中的口令校验码,这可能只适用于AWARD的BIOS。

它的公式好象是这样(AWORD):假设有八位密码

ABCDEFGH

H+G*4+F*10+E*40+D*100+C*400+B*1000+A*4000

h+g*2+f*4+e*8+d*16+c*32+b*64+a*128

结果为0xLMN

0xMN+0xL  until 0xXX