1）对于CMOS而言，相信大家已经不再陌生。对于破解CMOS密码的文章也有不少。在这里偶(cartoonboy)根据自己的经验并参考精华区的相关文章来说明如何解开CMOS密码： <br>先向大家说明一下CMOS的一些结构： <br><br>00000000H 30 00│ FF 00 │ 39 00 │ FF 00 │ 12 00 │ FF 00 │01 00 │ 18 00 <br>秒 │ 秒报警 │ 分 │分报警 │ 小时 │时报警 │星期 │ 日 <br>00000010H 11 00│ 98 00 │ 26 00 │ 02 00│ 70 00 │ 80 00 │00 00 │ 00 00 <br>月 │ 年 │寄存器A│寄存器B│寄存器C│寄存器D │诊断 │ 下电 <br>00000020H 40 00│ 7E 00 │ F0 00│ 03 00│ 0F 00│ 80 00 │02 00 │ 00 00 <br>软驱│ 密码域 │ 硬盘 │ 未知 │ 设备 │基本内存│ 扩充 <br>00000030H 7C 00│ 2E 00 │ 00 00│ 7F 00│ 15 00│ 86 00 │00 00 │ 00 00 <br>内存│硬盘类型│ 未知 │ 密码数据位 │ 未知 <br>00000040H 00 00│ 00 00 │ 00 00│ 00 00│ 00 00│ 00 00 │E2 00 │ 22 00 <br>未知 <br>00000050H 0F 00│ FF 00 │ FF 00│ E1 00│ 22 00│ 3F 00 │08 00 │ 59 00 <br>未知 <br>00000060H 00 00│ 7C 00 │ 19 00│ 80 00│ FF 00│ FF 00 │FF 00 │ FF 00 <br>未知 │ 世纪值 │ 未知 <br>00000070H 7D 00│ 81 00 │ AA 00│ 0F 00│ 39 00│ 9B 00 │E8 00 │19 00 <br>未知 <br>上述的内容参考了其他资料，所以不一定完全正确.在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中。如果密码不足八位，以此类推。 <br><br>下面举一实例：我的密码为：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这么多个可以起相同作用的密码。但是事实上并不是大家都是八位的密码，或许没有大得这么吓人，不过也挺多的，就如我那个密码，光与他相同功能的五位密码就有二十五万多个，而六位，七位，八位的更多，数量不详，因为从来没有把他算完过，时间太长了，耗不起。 <br><br>2）关于通用密码： <br>Award4.51版以前的才有通用密码， <br>wantgirl <br>Syxz(pay attension to the capital letter) <br>dirrid <br>wnatgirl <br><br>3）在这里再向大家介绍一下复旦网友们的破解程序：（道德感不佳者和功力不够深者略过） <br><br>（零） <br>这个是斑竹偶（cartoonboy)连破十几台机器攻无不克的方法,要珍惜哦:) <br>you try (under dos) <br>debug <br>o 70 2e <br>o 71 00 <br>o 70 2f <br>o 71 00 <br>note:在windowsNT下，很多破解程序都无法使用，原因在于WindowsNT的DOS是模拟的禁止对CMOS写入，请大家注意。 <br><br>（一） <br>//AMIPWD.CPP --- Show AMI Password String <br>//Compile with SMALL model Tel:027-7800172 7404402(H) <br>//Email:mecad@server20.hust.edu.cn <br>#include <br>#include <br>#define BYTE unsigned char <br>char AMI_unEncrypt( BYTE key,BYTE c2){ <br>asm xor di,di <br>asm mov bl,key <br>asm mov cl,c2 <br>lab1: <br>asm test bl,0xc3 <br>asm jpe lab2 <br>asm stc <br>lab2: <br>asm rcr bl,1 <br>asm inc di <br>asm cmp bl,cl <br>asm jne lab1: <br>return _DI; <br>} <br>BYTE rbyte(int port){ <br>outp(0x70,port); <br>outp(0xed, port); <br>return inp(0x71); <br>} <br>// 0x38-3d password code 0x37 initial value <br>void main(){ <br>int i, length; <br>static BYTE secret［7］; <br>char str［22］=&xqypic&xqypic; <br>for(length=0; length&lt;7; length++) <br>secret［length］ = rbyte(0x37+length); <br>secret［0］ &amp;= 0xf0; <br>for(i=0; i&lt;7 ,secret［i+1］&gt;0; i++) <br>str［i］ = AMI_unEncrypt(secret［i］, secret［i+1］); <br>str［i+1］=0; <br>if (secret［1］==0) <br>printf(&xqypicNo password\\n&xqypic); <br>else <br>printf(&xqypicPassword=%s\\n&xqypic,str); <br>return; <br><br>（二） <br>前述针对AMI主板的BIOS口令破译算法在BIOS日期为91.5.5, 91.7.7, 91.12.12,92.6.6和92.11.11的微机上测试通过. 为便于理解,将解密算法的C代码列出: <br>char AMI_unEncrypt( BYTE key,BYTE c2){ <br>BYTE num［］={ 0,1,1,2 }; <br>int di=0,c; <br>do{ <br>c=num［key&gt;&gt;6］+num［key&amp;3］; <br>if (c&amp;1) key=0x80+(key&gt;&gt;1); <br>else key&gt;&gt;=1; <br>di++; <br>}whi[an error occurred while processing this directive]<br>