请问access97的密码如何破解?(200分)

  • 主题发起人 主题发起人 slcgd
  • 开始时间 开始时间
《 找回忘了的密码 》

  在Access数据库中,为了安全起见,可以为所建的数据库设置密码。但是,密码忘了怎么办?别急,这里介绍一种找回密码的方法。
  用Access所建的数据库,在库文件的地址00000042处开始的13个字节是Access库的密码位。如果一个未加密的库,这13个字节原始数据依次为:86 FB 37 5D 44 9C FA C6 28 E6 13。事实上,当你设置了密码后,Access就将你的密码(请注意你所输入的密码是本文字符)的ACSII码与以上的13个字节数据进行异或操作,因此,从库文件的地址00000042开始的13个字节就变成了密钥了。例如,如果你设置的密码为abc,经过异或操作后,则从00000042处开始的13个字节的数据变成了E7 99 8F 37 5D 44 9C FA C6 28 E6 13。一个数据经过一次异或操作后,再一次经过同样的异或操作就可还原了。因此,对已经设置了密码的Access库,只要将13个密钥数据与原始的13个数据进行一次异或操作就可得到密码了。
  以下是一个C语言的破解程序:
  /*假设加密后的Access库为myacc.mdb,并存放在C盘的根目录下*/
  #include ″stdio.h″
  main()
  {FILE * fp
  char mm0[13]={0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13};
  /*这是13个原始数据*/
  char mml[13],mm2[13];
  /*mm1用来存放加密后的13个密钥;mm2用来存放密码*/
  int i,k;
  fp=fopen(″c://myacc.mdb″,″rb″);
  if(fp=NULL){
  printf(″/n不能打开该库!″);
  exit(0);}
  rewind(fp);fseek(fp,0x42L,0);
  fread(mm1,13,1,fp);/*读取密钥*/
  for(i=0;i<13;i++){
  mm2=mm0^mm;*/原始数据与密钥异或*/
  else
  break;}
  k=1;fclose(fp);
  if(k=0)
  printf(″未设密码!″);
  else{printf(″/n密码是:/n″);
  for(i=0;i   printf(″%c,mm2″);}}
  顺便提一句,Access库设置密码时,虽然允许输入最多14个密码字符,但只有前13个有效。



 
这种工具很多啦,到华军去看看
 
用XMDB吧,非常好用,而且不用注册,地址:http://www.newhua.com.cn/down/xmdb.zip
 
留下地址,我给你发一份!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=529552
http://www.delphibbs.com/delphibbs/dispq.asp?lid=560524
 
我按照你们提供的方法.可是不行呀,有劳各位帮我看看



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl;

type
TForm1 = class(TForm)
FileListBox1: TFileListBox;
DirectoryListBox1: TDirectoryListBox;
DriveComboBox1: TDriveComboBox;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(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 );

var
passBuf:array[0..14]of byte;
pass:array[0..14]of char;
B:Byte;
F:TFileStream;
I:integer;
begin


F:=TFileStream.Create(FileListBox1.FileName,fmOpenRead);
try
BEGIN
F.Seek($42,soFromBeginning);
F.Read(passBuf,14);
for I:=0 to 13 do
begin
B := passBuf xor xorString;
pass:=char(B);

end;
pass[sizeof(pass) - 1] := #0;
Edit1.Text:=StrPas(Pass);
END;
finally
F.Free;
end
end;



end.
 
to xiaoyu_online:
chengguodong111@263.net
请指教
 
for I:=0 to 13 do
begin
B := passBuf xor xorString;
pass:=char(B);

end;
上面这一句不对吧,应该是0到12,到13就超过边界了
你是什么问题呀
 
to brave
改了12也不行
edit1中就是显示不了密码?


 
帮帮忙呀.
各位老大,小弟谢谢你们了!
 
我用如下程序破解access2000密码
结果密码的偶数位可以真确得到,而奇数位不对.
我用ultraedit打开未加密的acceess2000数据库,发现xorString2的奇数位置的
元素是随机出现的,而偶数位的元素一定.
各位有兴趣不妨一试.期待和你们交流.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl;

type
TForm1 = class(TForm)
FileListBox1: TFileListBox;
DirectoryListBox1: TDirectoryListBox;
DriveComboBox1: TDriveComboBox;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
const
xorString2:array[0..20]of byte=
( $B8, $EC, $63, $9C,
$F8, $28, $2D, $8A,
$6A, $7B, $CB, $DF,
$49, $13, $F1, $B1,
$0A, $79, $AC, $7C,$6A);





var
passBuf2:array[0..40]of byte;
pass2:array[0..20]of char;
B:Byte;
F:TFileStream;
I,j:integer;
begin



F:=TFileStream.Create(FileListBox1.FileName,fmOpenRead);
try
F.Seek($42,soFromBeginning);
F.Read(passBuf2,40);
I:=0;j:=0;
while I<40 do
begin
B := passBuf2 xor xorString2[j];
pass2[j]:=char(B);
inc(i,2);inc(j);
showmessage('ok');
Edit1.Text:=StrPas(Pass2);
end;
pass2[sizeof(pass2) - 1] := #0;
Edit1.Text:=StrPas(Pass2);
finally
f.Free;
end;
end;
end.
 
如果是用Access2000做的数据库,密码可以设置20位,分别存放在
42字节后的40的字节内,是隔一个字节放一个密码字符。
你先做一个无密码的数据库,然后再加上密码就可以看到42字节后的不同了。
可以用异或的方法,找到密码
 
procedure GetAccessPassword;
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
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 xor xorString;
pass:=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 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;
 
多人接受答案了。
 
老兄到华军网站去去找有现实的
 
后退
顶部