CMOS密码动态改变的方法 邵青 2001年 21期 有关破解CMOS密码的方法技巧,有关文章已经介绍过很多了。现在,电脑的CMOS中设置的密码都是单一且固定的,破解的概率相对较大,那么CMOS的密码能否动态改变﹖这样较为保险,经过思考,想出了一种方法,思路如下:   电脑中的CMOS信息是可以更改的,因此我们可以编制类似的程序,将CMOS中的信息读出保存,需要时从磁盘文件上恢复.一般来说,CMOS主体信息长度为64字节,其中包括各种计算机参数和CMOS密码,其索引端口号为70H,数据端口号为71H,有些资料上介绍开机状态下清除CMOS密码用的下面的两条DEBUG指令:   -O 70,23   -O 70,34   其中23和34为随机数,这种方法清除CMOS的原理是改写CMOS的第23H字节的内容为34H,只要原CMOS第23H字节的内容不是34H,就会导致计算机在启动时CMOS数据校验通不过而使CMOS数据失效,所以在一般情况下,我们不能直接修改CMOS中的数据,但是我们如果修改后使其通过校验的话,则也可以使其内容满足我们的需要,但一般人对其数据校验原理并不知情,我们可否用其它的方法来间接实现呢﹖可以,本人实现的方法就是保存数次CMOS的设置,然后根据需要将其从磁盘上恢复到CMOS上去。下面是在TC 2.0中实现的将CMOS读出保存为磁盘文件CDDATA.DAT的程序   #include   #include   #include   main()   {   FILE *fp;   int indexport=0x70,dataport=0x71,i;   char data[256];/*读出256字节*/   fp=fopen("c:\\cdata.dat"."wb");   for(i=0;i<256;i++)   {outportb(indexport,i);/*定位数据端口*/   data[i]=inportb(dataport);/*从端口读字节*/   }   fwrite(data,1,256,fp);/*写字节到文件*/   fclose(fp);   }   上述的程序将当前的CMOS数据读出并保存。根据此原理,我们可以在CMOS中分别设置三次密码,每次保存为一个文件,三个文件分别取名,如:cdata01.dat,cdata02.dat,cdata03.dat,如保存的CMOS密码分别为"111","222","333",然后随机从磁盘文件读出写入CMOS中,开机时就不定是哪一个密码了,最多试三次就可解密,但旁人无法知其奥妙,就不好将密码试出来了。从文件将密码读出的程序如下   #include   #include   #include   #include   char *filename[]={"c:\\cdata01.dat","c:\\cdata02.dat","c:\\cdata03.dat"};   main()   {   FILE*fp;   int indexport=0x70,dataport=0x71,i;   char data[256],num;   num=random(3);   fp=fopen(filename[num]."rb");/*随机取三个文件名*/   fread(data,1,256,fp);   for (i=0;i<256;i++)   {outportb(indexport,i);/*定位数据端口*/   outportb(dataport,data[i]);   }   fclose(fp);   }   将此文件编译后加在自动批处理文件中,每次启动后,自动恢复三个密码中的一个,实现了CMOS动态密码。在以上的思路中,可以编程控制密码根据某种情况具体变化,就看你怎么想了。   编后语:让程序动态地设定密码的确是一个好方法,但这种方法并不安全,频繁地写入(指每启动一次机器就写入一次密码)有可能引起数据的丢失或误传,从而造成不能进入CMOS或使系统处于不稳定的运行状态,所以请大家在测试前做好准备工作。