📄 unitgetpass.pas
字号:
unit UnitGetPass;
interface
uses SysUtils,Classes,ExtCtrls;
function GetPass(FileName:string;var MdbVer:string):string;
const
PassSource2k:array[0..12] of Byte=($a1,$ec,$7a,$9c,$e1,$28,$34,$8a,$73,$7b,$d2,$df,$50);
//Access97的异或源码
PassSource97:array[0..12] of Byte=($86,$fb,$ec,$37,$5d,$44,$9c,$fa,$c6,$5e,$28,$e6,$13);
implementation
function GetPass(FileName:string;var MdbVer:string):string;
var
F:TFileStream;
PassStrTemp:array[0..26] of Byte;
Ver,EncrypFlag:Byte;
t1:char;
Password:string;
i:integer;
begin
Try
F :=TFileStream.Create(FileName,fmOpenRead);
//取得数据库版本
F.Seek($14,0);
F.Read(Ver,1);
//得到加密标志位
F.Seek($62,0);
F.Read(EncrypFlag,1);
//读取密码到缓冲区
F.Seek($42,0);
F.Read(PassStrTemp,26);
finally
FreeAndNil(F);
end;
if Ver<1 then
begin
MdbVer:='Microsoft Access 97';
if (Integer(PassStrTemp[0] xor PassSource97[0])=0) then begin
Password:='';
exit;
end else begin
Password:='';
for i:=0 to 12 do
begin
Password:=Password+inttostr(PassStrTemp[i] xor PassSource97[i]);
end;
end;
end else begin
Password:='';
MdbVer:='Microsoft Access 2000';
for i:=0 to 12 do
Begin
if (i Mod 2)=0 then Begin
t1:=Char(($13 xor EncrypFlag xor PassStrTemp[i*2] xor PassSource2k[i]));
end else begin //每隔一个字节就与加密标志相异或。这里的加密标志为$13
t1:=Char((PassStrTemp[i*2] xor PassSource2k[i]));
end;
Password:=Password+t1;
end;
end;
if ((Password[1])<'a') or ((Password[1])>'z') then Password:='';
Result:=Password;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -