浅析Award BIOS密码的破解

Award BIOS版本有很多,有些有通用密码,但加密算法几乎没变,C语言算法描述 为:

int code(char str[8])
{
short i=0,ren;
int bin;
bin=str[i++];
while(str[i])
{
bin=bin<<2;
ren=str[i++];
bin+=ren;
}
return bin;
}

是将输入的字符左移两位加下一个字符,直到最后扩充到一个字,Superior 
Password存放在BIOS的0x1c或0x3a处,User Password存放到0x63处,不同的版本可
能会不同。从加密算法看是有损加密,无法从密文反推得出密码,我用了一种方法。
还有很多其他的方法,比如穷举法,也很容易,可以分别在数字、小写字母、大写字
母范围中穷举。

我的方法是(不要看我,我可想不出来):密码长不超过8位,通过近位循环左移两
位,可表示为4a-164k+k,其中a为密码,k=0-3,用数学式表示为:(...((4a7-
65535k7+a6)4-65535k6+a5)...)4-65535k1+a0=w其中ai 为密码,ki=0-3,w为密
字,考虑到前5位密码的循环左移等于算术左移,即k7..k4=0,所以又可简化为:
47a7+46a6+...+a0=w+65535(42k3+4k2+k1)
式中42k3+4k2+k1,记为k,则k只有0-41共42个可能取值,要破密码,无非是求ai在
32-126之间的整数解,下面给出我的程序:

unsigned char *crack(char f)
{
char i=0,j=0,k=1;
unsigned int p,s=0,a=1,t;
unsigned char *b;
p=getpass1(f); 取出密字
do
{
s+=a;
t=floor(p/s);
i++;
a*=4;
}
while(t<32||t>126);
b=malloc((unsigned char*)i);
b[0]=t;
for(i=i-1;i>0;i--)
{
p-=b[j++]*pow(4,i);
s-=pow(4,i);
b[k++]=floor(p/s);
}
b[k]=0;
return(b);b即为密码
}

整个过程就是这样,如果有错请告诉我。详细的程序可到晓光之家下载。
还有程序只有在进入操作系统后才能运行,如果密码设的是System方式,则进不到系
统,只好放电了:(..

我有一个想法,就是制作一个模拟键盘的装置(可控制键盘也行),可以向键盘接口
(串口、PS/2)发送ASCII码,只要编一个小程序,让它不断的发送数字和回车,用穷
举法击破它,可破解System的密码。据我所知,用硬件破密码的还不多,现在我正在
学习单片机,鄙人才疏学浅,不知能否做到,哪位有高招不妨交流一下。

2000.11.20 于太原

源程序:

#include

  1<math.h>   
  2#include <conio.h>   
  3#define ON 0   
  4#define OFF 1   
  5void change(unsigned char x,unsigned char y)   
  6{   
  7outportb(0x70,x);   
  8outportb(0x71,y);   
  9}   
 10unsigned int sum()   
 11{   
 12int i;   
 13unsigned int s=0;   
 14for(i=0x10;i&lt;=0x2d;i++)   
 15{   
 16outportb(0x70,i);   
 17s+=inportb(0x71);   
 18}   
 19return(s);   
 20}   
 21void chsum()   
 22{   
 23unsigned int s;   
 24s=sum();   
 25change(0x2e,s&gt;&gt;8);   
 26change(0x2f,s&lt;&lt;8&gt;&gt;8);   
 27}   
 28void clear()   
 29{   
 30unsigned char a;   
 31outportb(0x70,0x11);   
 32a=inportb(0x71)-0xc0;   
 33change(0x11,0xc0);   
 34chsum();   
 35outportb(0x70,0x62);   
 36if(inportb(0x71)==0xff)   
 37{   
 38outportb(0x71,0xff-a);   
 39outportb(0x70,0x7b);   
 40a=inportb(0x71)-a;   
 41change(0x7b,a);   
 42}   
 43}   
 44void display()   
 45{   
 46int i,j=0;   
 47printf("Your Bios Mem at 0x10--0x7f:\n");   
 48for(i=0x10;i&lt;=0x7f;i++)   
 49{   
 50outportb(0x70,i);   
 51printf("%4x",inportb(0x71));   
 52j++;   
 53if(j%16==0) printf("\n");   
 54}   
 55}   
 56int code(char str[8])   
 57{short i=0,ren;   
 58int bin;   
 59bin=str[i++];   
 60while(str[i])   
 61{   
 62bin=bin&lt;&lt;2;   
 63ren=str[i++];   
 64bin+=ren;   
 65}   
 66return bin;   
 67}   
 68void chpass(char str[8])   
 69{   
 70change(0x1c,code(str)%0x100);   
 71change(0x1d,code(str)/0x100);   
 72chsum();   
 73}   
 74unsigned int getpass1(char i)   
 75{   
 76unsigned int a,b,p;   
 77unsigned char x;   
 78if(i==0) x=0x1c;   
 79if(i==1) x=0x63;   
 80outportb(0x70,x);   
 81a=inportb(0x71);   
 82outportb(0x70,x+1);   
 83b=inportb(0x71);   
 84p=(b&lt;&lt;8)+a;   
 85return(p);   
 86} 
 87
 88unsigned char *crack(char f)   
 89{   
 90char i=0,j=0,k=1;   
 91unsigned int p,s=0,a=1,t;   
 92unsigned char *b;   
 93p=getpass1(f);   
 94do   
 95{   
 96s+=a;   
 97t=floor(p/s);   
 98i++;   
 99a*=4;   
100}   
101while(t&lt;32||t&gt;126);   
102b[0]=t;   
103for(i=i-1;i&gt;0;i--)   
104{   
105p-=b[j++]*pow(4,i);   
106s-=pow(4,i);   
107b[k++]=floor(p/s);   
108}   
109b[k]=0;   
110return(b);   
111}   
112main()   
113{   
114unsigned char *p;   
115clrscr();   
116textmode(3);   
117printf("Award Bios Password Crack v2.0\nWritten By Yuky (Add:97091B2,NCIT)\n");   
118display();   
119p=crack(0);   
120printf("Your BIOS Superviosr Password:");   
121textcolor(RED+BLINK);   
122cprintf("%s\n",p);   
123printf("\n");   
124printf("Your BIOS User Password:");   
125textcolor(GREEN+BLINK);   
126cprintf("%s",crack(1));   
127}</conio.h></math.h>
Published At
Categories with 站长专区
Tagged with
comments powered by Disqus