如何在DELPHI中用SQL语句修改ACCESS密码,请教

解决方案 »

  1.   

    http://www.delphiun.com/article_view.asp?id=1020
      

  2.   

    procedure TFileNameEdit.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 exit;
       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;
    原理:
    在Access数据库中,为了安全起见,可以为所建的数据库设置密码。
    用Access所建的数据库,在库文件的地址00000042处开始的13个字节
    是Access库的密码位。
    如果一个未加密的库,这13个字节原始数据依次为:access97(
    86 FB 37 5D 44 9C FA C6 28 E6 13。),access2000则为上面的(xorString2)事实上,
    当你设置了密码后,Access就将你的密码(
    请注意你所输入的密码是本文字符)的ACSII码与
    以上的13个字节数据进行异或操作,
    因此,从库文件的地址00000042开始的13个字节就变成了密钥了
    。例如,如果你设置的密码为abc,经过异或操作后,
    则从00000042处开始的13个字节的数据变成了E7 99 8F 37 5D 44 9C FA C6 28 E6 13。
    一个数据经过一次异或操作后,再一次经过同样的异或操作就可还原了。
    因此,对已经设置了密码的Access库,
    只要将13个密钥数据与原始的13个数据进行一次异或操作就可得到密码了。