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<=0x2d;i++)
15{
16outportb(0x70,i);
17s+=inportb(0x71);
18}
19return(s);
20}
21void chsum()
22{
23unsigned int s;
24s=sum();
25change(0x2e,s>>8);
26change(0x2f,s<<8>>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<=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<<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<<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<32||t>126);
102b[0]=t;
103for(i=i-1;i>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>