破解ACCESS的数据库密码
时间:2007-12-23 来源:不详 作者:迈克DB
SubItems.Add(FormatDateTime(model, P.FileTime));
end;
ListView1.Items.EndUpdate;
end;
end;
procedure TPassForm.GetMDBDir(Sender: TObject);
var
S: string;
begin
if not SelectDirectory('选择目录', '', S) then Exit;
Edit1.Text := S;
ExecDirectory(S);
end;
procedure TPassForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key <> #13 then Exit;
if Trim(Edit1.Text) = '' then Exit;
ExecDirectory(Edit1.Text);
end;
procedure TPassForm.CloseForm(Sender: TObject);
begin
Close;
end;
function TPassForm.ExecFile(FName: string): PassType;
function CovTime(FD: _FileTime): TDateTime;
var
TCT: _SystemTime;
Tmp: _FileTime;
begin
FileTimeToLocalFileTime(FD, Tmp);
FileTimeToSystemTime(Tmp, TCT);
Result := SystemTimeToDateTime(TCT);
end;
var
Stream: TFileStream;
i, n: integer;
TP: TSearchRec;
WTime: TDateTime;
WSec: DWord; 织梦好,好织梦
M, S: string;
Buf: array[0..200] of byte;
Date0: TDateTime;
Date1: TDateTime;
Date2: TDateTime;
const
XorStr = $823E6C94;
begin
FindFirst(FName, faAnyFile, TP);
//FT := CovTime(TP.FindData.ftCreationTime);
Stream := TFileStream.Create(FName, fmOpenReadWrite);
Stream.Seek($00, 00); Stream.Read(Buf[0], 200);
if Buf[$14] = 0 then begin
PassCode := '';
Stream.Seek($42, 00); Stream.Read(Buf[0], 20);
for i := 0 to 19 do
PassCode := PassCode chr(Buf[i] xor InCode97[i]);
Result.PassCode := PassCode;
Result.FileType := 'ACCESS-97';
Result.FileTime := Now;
Exit; // 按Access97版本处理
end;
Date0 := EncodeDate(1978, 7, 01);
Date1 := EncodeDate(1989, 9, 17);
Date2 := EncodeDate(2079, 6, 05);
Stream.Seek($42, 00); Stream.Read(ReaderArray[0], 40);
Stream.Seek($75, 00); Stream.Read(DateStr, 4);
Stream.Free;
for i := $42 to $42 55 do begin 织梦好,好织梦
if i = $72 then M := '-' else M := '';
S := S #32 M IntToHex(Buf[i], 2);
end;
Delete(S, 1, 1);
Memo1.Lines.Add(Format(
'文件名:%s,%s'
'10进制时间串:%d,%s'
'16进制时间串:%x,%s'
'密码串:%s',
[FName, #13#10, DateStr, #13#10, DateStr, #13#10, #13#10 S #13#10]));
if (DateStr >= $90000000) and (DateStr < $B0000000) then begin
WSec := DateStr xor $903E6C94;
WTime := Date2 WSec / 8192 * 2;
end else begin
WSec := DateStr xor $803E6C94;
WTime := Date1 WSec / 8192;
if WSec and $30000000 <> 0 then begin
WSec := $40000000 - WSec;
WTime := Date1 - WSec / 8192 / 2;
end;
end;
Memo1.Lines.Add('创建时间:' DateTimeToStr(WTime));
if WTime < Date1 then begin
for i := 0 to 9 do begin
EncodeArray[i * 2] := (Trunc(WTime) - Trunc(Date0)) xor UserCode[i] xor $F000;
// Xor $F000 就是“高位取反”
文章评论
共有位Admini5网友发表了评论 查看完整内容