]、。·ˉˇ¨〃々—~‖…’”〕〉》」』〗】∶!"'),.:;?]` 回复人:aiirii(2000-06-22 19:30:00 ) 得0分
读bois的程序:
procedure TForm1.Button1Click(Sender: TObject);
var data:Smallint;temp:byte;
decode,passwd:array [0..9] of char;count,I:integer;
begin
count:=0;
asm
mov al,29
out $70,al
mov ah,al
mov al,28
out $70,al
in al,$71
mov data,ax
end;
while data>0 do
begin
if (data<$80) then
begin
passwd[count]:=char(data);
break;
end
else
begin
temp:=data and $3f;
if (temp <= $20) then
temp:=temp or $30;
passwd[count]:=char(temp);
count:=count+1;
data:=data-temp;
data:=data shr 2;
end;
end;
i:=0;
while (count>=0) do
begin
decode[i]:=passwd[count];
count:=count-1;
i:=i+1;
end;
showmessage('the CMOS passwd= '+decode);
end;
回复人:zxghl(2000-06-22 23:44:00 ) 得50分
aiirii的方法通过读取端口获得的结果是 CMOS 参数,这还是不足以作为加密依据。
因为口令等数据是会变化的。同硬盘序列号一样。
我会随后发一个控件给你,这个控件包含了在win98下读取BIOS、网卡信息的多个功能。
********************************************
另外关于读取BIOS信息,你还不妨试一下以下语句:
procedure TForm1.Button1Click(Sender: TObject);
var
bn, bc, bd, bs: string;
begin
try
bn := String(Pchar(Ptr($FE061)));
bc := String(Pchar(Ptr($FE091)));
bd := String(Pchar(Ptr($FFFF5)));
bs := String(Pchar(Ptr($FEC71)));
except
bn := 'Unsupported';
bc := 'Unsupported';
bd := 'Unsupported';
bs := 'Unsupported';
end;
showmessage(
'[BiosName] ' + bn + #13 +
'[BiosCopyright] ' + bc + #13 +
'[BiosDate] ' + bd + #13 +
'[BiosSerial] ' + bs);
end;
这段程序在我的三台机器上都通过。另外在一台DOS622机器上,用C语言编写程序读取
以上的四个地址都正确,还有直接用DEBUG也可以看到。