access2000密码问题 ,有兴趣的朋友进来看看?很有点奇怪呀.(200分)

  • 主题发起人 主题发起人 shirong
  • 开始时间 开始时间
S

shirong

Unregistered / Unconfirmed
GUEST, unregistred user!
access2000密码问题 ,有兴趣的朋友进来看看

考察对象
access2000的mdb库文件
姜卫东的access2000密码察看器
accentsoft的access password recovery
以下的代码:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
passedit: TEdit;
Button1: TButton;
OpenDialog1: TOpenDialog;
Chk2000: TCheckBox;
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 );
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 opendialog1.execute then begin
if not FileExists(opendialog1.filename) then
begin
Showmessage('文件不存在,或一般错误.');
Application.Terminate;
exit;
end;
F:=TFileStream.Create(opendialog1.filename,fmShareDenyNone);
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;
end;



end.

问题的开始,是我遇到了某一个加密的mdb库,于是在网上下载了
姜卫东的access2000pwd来解开这个库,
解完之后,因为好玩,决定用delphi也写一个,在大富翁上找到了
一段代码,经过我的局部修改后,变成上面的样子.
但是发现上面这段在解access97时正常,解access2000时,每隔一
个就错了,用ue仔细参看$42开始的40个字节后
将xorstring2修改如下:
xorString2:array[0..20]of byte=
( $e0, $EC, $3b, $9C,
$a0, $28, $75, $8A,
$32, $7B, $93, $DF,
$11, $13, $a9, $B1,
$52, $79, $f4, $7C,$dc);
经过修改之后,我手头的库都已经可以正确解出密码.于是我将这个
东西放到了news.newsfan.net的delphi新闻组里,
但是问题又来了,一位朋友寄来一个mdb库,说不能解出密码,
他告诉我库的正确密码是meisme,而我的程序解出来是&e"s&eK,
我用姜卫东先生的access2000pwd来解,得到了同样的错误结果,
此时我想到了accentsoft的access password recovery,这个东西
下回来后一直未用,安装后用它来解,很快得出了正确密码.
此问题令我百思不得其解,难道我的算法有问题?还是access2000
根据小版本的不同密码算法也不同?
各位大虾有兴趣,不妨研究一下!


 
我也发现了同样的问题.

目前 , 我用的是 OFFICE KEY

是一个大的 工具 包中的 一组 工具.
 
确信是2000版本吗??不是XP版的吧!!
 
目前考虑,可能与创建时间有关联
 
应该是算法的问题,不关版本的事,不知大家没有有人用过陈飞宇的破解,
哪管你是什么版本,就算是XP一样能解。而且是立即算出密码,过程不用
一秒,呵呵
 
来自:retun, 时间:2002-8-17 16:05:00, ID:1270998
应该是算法的问题,不关版本的事,不知大家没有有人用过陈飞宇的破解,
哪管你是什么版本,就算是XP一样能解。而且是立即算出密码,过程不用
一秒,呵呵

----return兄能把那个软件发给我一个吗?
我找不到地址.
我的电邮:xcejian@163.com
 
我已经找到软件了,
不过没法反汇编,
我估计也是密钥和日期有关联
 
希望你想到其中的方法吧,因为我联系过作者,但作者是不回信的,唉~~~
如果找到方法也望能公布
 


目前所得出的阶段性结论:
access数据库都是采取用密码(password)对文件头特定部位(密钥)进行异或得出,只要用
密钥对加密后的数据库特定部位进行异或即可求出密钥.
access97的密码为17位,存放在文件头42h开始的17个字节里,只要用
( $86, $FB, $EC, $37,
$5D, $44, $9C, $FA,
$C6, $5E, $28, $E6,$13 );
与之相异或即可得出密码.
access2000的密码与之不同,共有40位,实际只用到奇数位20个数字,经过研究,我发现这20个
数字不能用固定的密钥来解,密钥与mdb数据库创建时间有关,也就是说对于没有加密的数据库
来说,从42h开始的40个字节是根据时间来变化的.
比如今年8月份创建库密钥为
( $e0, $EC, $3b, $9C,
$a0, $28, $75, $8A,
$32, $7B, $93, $DF,
$11, $13, $a9, $B1,
$52, $79, $f4, $7C,$dc);}
而时间的标志则是在72h开始的7个字节中,比如
2002年9月7日, 19:33:36创建的数据库为cf fa ce 80 36 6e 82
2002年9月7日, 19:32:40创建的数据库为36 54 03 9b 36 6e 82

在时间推移过一段时间后密钥就会发生变化,可能是2个月时间左右.
我推测可能是用这7个字节对42h开始的40个字节进行处理得出新的密钥

我打印了几张数据库的头部16进制的表,打算分析出相应的规律,但是有一个月时间,发现自己
确实没办法.以前没有干过类似的活.实在是没有经验,有狗咬刺猬,无从下口的感觉
而且我白天还要上班,没时间分析,发帖子到几个网站上去问,只有看热闹的.我的英文又不好
没办法去老外的新闻组上灌水.
我也下了几个可以解出密码的软件分析,但是实在是看不出什么,因为这几个都是用vb编的
代码跳来跳去,唯一一个用delphi编的,又加了密,没法跟踪.
 
文件的时间中的秒是两秒为单位的。因为文件时间一共用了32位。
00 second
01 second
02 second
03 second
04 second

05 minute
06 minute
07 minute
08 minute
09 minute
0A minute

0B hour
0C hour
0D hour
0E hour
0F hour

10 day
11 day
12 day
13 day
14 day

15 month
16 month
17 month
18 month

19 year
1A year
1B year
1C year
1D year
1E year
1F year
其中秒的字段只有五位,最大只能保存到31。
 
高手跑哪儿去了?
 
有意思!顺便问一个我一直感到疑惑的问题:Access 2002文件加密后,在Delphi中用ADO
带密码是连接不上的,老是报错,如果去掉密码,就可以用ADO直接连接上,使我想对mdb
文件加密都没有办法。
 
Access 最长支持20位,直接加密码,5分钟之内就可得到密码。
这还较什么密码[:(!]
 
Access 最长支持20位,直接加密码,5分钟之内就可得到密码。
这还较什么密码[:(!]

---不是那么简单吧?
请仔细看看我的帖子。
 
后退
顶部