📄 passwordviewerunit.pas
字号:
unit PasswordViewerUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons, StdCtrls, Menus, DB, ADODB;
type
TPasswordViewerForm = class(TForm)
Edit1: TEdit;
Label1: TLabel;
DBFileSpeedBtn: TSpeedButton;
Label2: TLabel;
Edit2: TEdit;
ViewerPasswordSpeedBtn: TSpeedButton;
OpenDialogDBFile: TOpenDialog;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
IntorSpeedBtn: TSpeedButton;
ExitSpeedBtn: TSpeedButton;
ADOConnectionDB: TADOConnection;
PasswordDBPanel: TPanel;
procedure DBFileSpeedBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ViewerPasswordSpeedBtnClick(Sender: TObject);
procedure ExitSpeedBtnClick(Sender: TObject);
procedure IntorSpeedBtnClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
Access_Version: Integer;//ACCESS 版本
trynumber: Int64;
function Access2000(my: Integer) :String;
function Access97(str: String) :String;
function Get2000Pass(sender: TObject) :String;
{ Private declarations }
public
{ Public declarations }
end;
var
PasswordViewerForm: TPasswordViewerForm;
implementation
{$R *.dfm}
procedure TPasswordViewerForm.DBFileSpeedBtnClick(Sender: TObject);
var
FileStr: TFileStream;
Temp : Byte;
begin
OpendialogDBFile.Title := '请选择要查看密码的Access数据库文件';
OpendialogDBFile.Filter := '[Access数据库文件]|*.mdb|[所有文件]|*.*';
if OpendialogDBFile.Execute then
begin
Edit1.Text:=OpenDialogDBFile.FileName;
if (uppercase(ExtractFileExt(Edit1.Text))<>'.MDB') then
begin
MessageBox(Handle,PChar('此程序只处理ACCESS数据库文件'+#13
+'请确认你打开的文件!'),'打开文件错误',MB_OK+MB_ICONERROR);
Edit1.Text:='欢迎使用此程序';
Edit2.Text:='##############';
Label3.Caption:='';
Edit3.Text:='';
ViewerPasswordSpeedBtn.Enabled := False;
Exit;
end;
Edit2.Text:='##############';
Edit3.Text:='';
trynumber:=-1;
FileStr:=Tfilestream.Create(edit1.text,fmopenread);
FileStr.Position:=$14;
FileStr.ReadBuffer(temp,1);
if temp=1 then
begin
Access_Version:=2000;
Label3.Caption:='ACCESS2000';
end;
if temp=0 then
begin
Access_Version:=97;
Label3.Caption:='ACCESS97';
end;
ViewerPasswordSpeedBtn.Enabled := True;
FileStr.Free;
end;
end;
procedure TPasswordViewerForm.FormCreate(Sender: TObject);
begin
Edit1.Text :='Password Viewer';
edit2.Text :='###############';
Access_Version := 0;
ViewerPasswordSpeedBtn.Enabled := False;
end;
procedure TPasswordViewerForm.ViewerPasswordSpeedBtnClick(Sender: TObject);
begin
if access_version=97 then
edit2.Text:=access97(edit1.Text);
if access_version=2000 then
begin
trynumber:=-1;
edit2.Text:=get2000pass(sender);
end;
end;
function TPasswordViewerForm.get2000pass(sender:TObject):string;
var
mystr:string;
begin
if trynumber<=$FF then
try
trynumber:=trynumber+1;
mystr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+edit1.text+';Persist Security Info=False;Jet OLEDB:Database Password='+access2000(trynumber);
ADOConnectionDB.ConnectionString:=mystr;
ADOConnectionDB.Connected:=TRUE;
except
get2000pass(sender);
end;
ADOConnectionDB.Connected:=false;
get2000pass:=access2000(trynumber);
if access2000(trynumber)='无密码' then
edit3.Text:='0'
else
edit3.Text:=inttostr(length(access2000(trynumber)));
end;
function TPasswordViewerForm.access2000(my:integer):string;
var
Filestr : TFileStream;
My2000 : array [0..19] of int64;
i : Integer;
temp,myflag : Byte;
pass : string;
begin
My2000[0]:=$4F;
My2000[1]:=$EC;
My2000[2]:=$94;
My2000[3]:=$9C;
My2000[4]:=$0F;
My2000[5]:=$28;
My2000[6]:=$DA;
My2000[7]:=$8A;
My2000[8]:=$9D;
My2000[9]:=$7B;
My2000[10]:=$3C;
My2000[11]:=$DF;
My2000[12]:=$BE;
My2000[13]:=$13;
My2000[14]:=$06;
My2000[15]:=$B1;
My2000[16]:=$FD;
My2000[17]:=$79;
My2000[18]:=$5B;
My2000[19]:=$7C;
pass:='';
Filestr:=TFileStream.Create(edit1.Text,fmopenread);
if trynumber=0 then
begin
Filestr.Position:=$66; //取数据库文件第18位密钥
Filestr.ReadBuffer(temp,1);
myflag:=temp xor my2000[18];
Filestr.Position:=$42;
for i:=0 to 19 do
begin
Filestr.Read(temp,1);
if i mod 2=0 then
begin
if ((temp xor my2000[i]) xor myflag)=0 then
begin
if i=0 then
begin
access2000 := '无密码';
Filestr.Free;
exit;
end
else
begin
Access2000 := pass;
Filestr.Free;
Exit;
end;
end;
pass := pass+char((temp xor my2000[i]) xor myflag);
end
else
begin
if temp xor my2000[i]=0 then
begin
Access2000:=pass;
Filestr.Free;
Exit;
end;
pass:=pass+char(temp xor my2000[i]);
end;
Filestr.Position:=Filestr.Position+1;
end;
Filestr.Free; //the length of pass >18
end//first run
else
begin
myflag:=my xor My2000[18];
Filestr.Position:=$42;
for i:=0 to 19 do
begin
Filestr.Read(temp,1);
if i mod 2=0 then
pass:=pass+char((temp xor My2000[i]) xor myflag)
else
pass:=pass+char(temp xor My2000[i]);
Filestr.Position:=Filestr.Position+1;
end;
Access2000:=pass;
Filestr.Free;
end;
end;
function TPasswordViewerForm.access97(str:string):string;
var
Filestr: TFileStream;
My97 : array [0..12] of Int64;
i : Integer;
Temp : Byte;
Pass :string;
begin
My97[0]:=$86;
My97[1]:=$FB;
My97[2]:=$EC;
My97[3]:=$37;
My97[4]:=$5D;
My97[5]:=$44;
My97[6]:=$9C;
My97[7]:=$FA;
My97[8]:=$C6;
My97[9]:=$5E;
My97[10]:=$28;
My97[11]:=$E6;
My97[12]:=$13;
Pass:='';
Filestr:=TFileStream.Create(str,fmopenread);
Filestr.Position:=$42;
for i:=0 to 12 do
begin
Filestr.ReadBuffer(temp,1);
if (temp xor my97[i])=0 then
begin
if i=0 then
begin
Access97 := '无密码';
Edit3.Text := IntToStr(Length(Pass));
Filestr.Free;
Exit;
end
else
begin
Access97 := pass;
Edit3.Text := IntToStr(Length(Pass));
Filestr.Free;
Exit;
end;
end;
Pass := Pass+Char(Byte(Temp) xor My97[i]);
end;
end;
procedure TPasswordViewerForm.ExitSpeedBtnClick(Sender: TObject);
begin
if MessageBox(Handle,PChar('确认要退出Access Password Viewer 吗?'),'信息提示',
MB_OKCANCEL+MB_ICONINFORMATION)=IDOK then
Close
else
Exit;
end;
procedure TPasswordViewerForm.IntorSpeedBtnClick(Sender: TObject);
var
MessageStr: String;
begin
MessageStr := '说明:'+#13+#13
+'当你忘掉自己设置的密码时,可用此程序查看'+#13
+'ACCESS95/97,ACCESS2000数据库文件密码,'+#13
+'可以查看20位的ACCESS2000密码!'+#13
+'E-Mail:delphiesite@vip.sina.com'+#13
+'[Delphi编程驿站]:http://yckxzjj.vip.sina.com';
MessageBox(Handle,PChar(MessageStr),'友情提醒',MB_OK+MB_ICONINFORMATION);
end;
procedure TPasswordViewerForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -