⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 passwordviewerunit.pas

📁 PasswordViewer[Access]数据库密码破解
💻 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 + -