标题：CMOS破解完全手册
CMOS的一些结构
先向大家说明一下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 
未知
Award的密码规则
在38H-3BH这四个字节中，由于39H和3BH这两个字节一直为00H，所以就略过，那么CMOS密码的关键就集中到了38H和3AH这两个字节上。
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这么多个可以起相同作用的密码。但是事实上并不是大家都是八位的密码，或许没有大得这么吓人，不过也挺多的，就如我那个密码，光与他相同功能的五位密码就有二十五万多个，而六位，七位，八位的更多，数量不详，因为从来没有把他算完过，时间太长了，耗不起。
关于通用密码
Award4.51版以前的才有通用密码， 
wantgirl 
Syxz(pay attension to the capital letter) 
dirrid 
wnatgirl
破解程序
在这里再向大家介绍一下复旦网友们的破解程序：（道德感不佳者和功力不够深者略过）
（零）这个是斑竹偶（cartoonboy)连破十几台机器攻无不克的方法,要珍惜哦 
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[an error occurred while processing this directive]
cartoonboy
用DEBUG 破解1. 用dos盘启动
2. 在命令提示符后面输入 debug -o 70 10
3.重启电脑cmos密码清空了。