转载:unit Unit1;interfaceuses
   sysutils,forms,Dialogs, StdCtrls, Controls, Buttons, Classes;
type
  TForm1 = class(TForm)
    FileNameEdit: TEdit;
    Label1: TLabel;
    Button1: TBitBtn;
    passEdit: TEdit;
    chk2000: TCheckBox;
    SpeedButton1: TSpeedButton;
    dlgOF: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
const
    xorString:array[0..12]of byte=
      ( $86, $FB, $EC, $37,
        $5D, $44, $9C, $FA,
        $C6, $5E, $28, $E6,$13 );
    xorString2:array[0..20]of byte=
      ( $D3, $EC, $08, $9C,
        $93, $28, $46, $8A,
        $01, $7B, $A0, $DF,
        $22, $13, $9A, $B1,
        $61, $79, $C7, $7C,$5B);
var
    passBuf:array[0..14]of byte;
    pass:array[0..14]of char;
    passBuf2:array[0..40]of byte;
    pass2:array[0..20]of char;
    B:Byte;
    F:TFileStream;
    I,j:integer;
begin
   if not FileExists(FileNameEdit.Text) then
    begin
       Showmessage('唉,快被老兄你玩死了,OK,我不玩了!古得掰。');
       Application.Terminate;
       exit;
    end;
   F:=TFileStream.Create(FileNameEdit.Text,fmOpenRead);
   if NOT chk2000.Checked then
   try
     F.Seek($42,soFromBeginning);
     F.Read(passBuf,14);
     for I:=0 to 13 do
     begin
        B := passBuf[i] xor xorString[i];
        pass[i]:=char(B);
     end;
    pass[sizeof(pass) - 1] := #0;
    passEdit.Text:=StrPas(Pass);
   finally
     F.Free;
   end else
   try
     F.Seek($42,soFromBeginning);
     F.Read(passBuf2,40);
     I:=0;j:=0;
     while I<40 do
     begin
        B := passBuf2[i] xor xorString2[j];
        pass2[j]:=char(B);
        inc(i,2);inc(j);
     end;
    pass2[sizeof(pass2) - 1] := #0;
    passEdit.Text:=StrPas(Pass2);
   finally
    f.Free;
   end;end;procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if   dlgOF.Execute then FileNameEdit.Text:=dlgOF.FileName;
end;end.

解决方案 »

  1.   

    有没有人试一下上面代码,能取到Access2000的mdb的密码吗?!
      

  2.   

    : IUPRG(幕后工作者) 也给我一个  [email protected]
      

  3.   

    我的email :[email protected] 
    来信后,一日内给你发过去一个现成的软件包(已经实现)
      

  4.   

    能行,这代码用了许多了,不过F:=TFileStream.Create(FileNameEdit.Text,fmOpenRead);
    会引用多用户冲突,换成:F:=TFileStream.Create(FileNameEdit.Text,
    fmShareDone);//fmShareDone好像是这个,查一下,叫什么共享打开那个参数,就可以了。
      

  5.   

    To zfmich()
    读出来的密码不对.
    你那里试过能用吗?To IUPRG(幕后工作者) 
    我的e-mail : [email protected]
      

  6.   

    读出来的密码一定不对~~~~~~~~Access2000密码好像还有其它秘门,哪一位知道呢???
      

  7.   

    xorString2:array[0..20]of byte=
          ( $D3, $EC, $08, $9C,
            $93, $28, $46, $8A,
            $01, $7B, $A0, $DF,
            $22, $13, $9A, $B1,
            $61, $79, $C7, $7C,$5B);
    上面的XorString2好像不对吧??我试了几台机子,好像是不固定的~~~~~~~
      

  8.   

    IUPRG(幕后工作者) :请给我发一个:[email protected]
      

  9.   

    我写了个C的,你像要就给我你的EMAIL