学院首页>安全防御>病毒防治>破解ACCESS的数据库密码

破解ACCESS的数据库密码

作者: 来源: 添加时间:2006-5-23 8:30:13
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 就是“高位取反”
 EncodeArray[i * 2 + 1] := InhereCode[i];
 end;
  end;
  if (WTime >= Date1) and (WTime < Date2) then begin
 for i := 0 to 9 do begin
 EncodeArray[i * 2] := (Trunc(WTime) - Trunc(Date1)) xor UserCode[i];
 EncodeArray[i * 2 + 1] := InhereCode[i];
 end;
  end;
  if WTime >= Date2 then begin
 for i := 0 to 9 do begin
 EncodeArray[i * 2] := (Trunc(WTime) - Trunc(Date1)) xor UserCode[i];
 EncodeArray[i * 2 + 1] := InhereCode[i] xor 1;
 // Xor 1 就是“末位取反”
 end;
  end;
  PassCode := '';
  for i := 0 to 19 do begin
 N := EncodeArray[i] xor ReaderArray[i];
//if N <> 0 then PassCode := PassCode + Chr(N);
 if N <> 0 then PassCode := PassCode + WideChar(N);
  end;
  Result.FileType := 'ACCESS-2000';
  Result.FileTime := WTime;
  Result.PassCode := PassCode;
end;

procedure TPassForm.GetAllPass(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.BeginUpdate;
  if Trim(Edit1.Text) = '' then Exit;
  ExecDirectory(Edit1.Text);
  Memo1.Lines.EndUpdate;
end;

procedure TPassForm.SetCurTime(Sender: TObject);
begin
  Self.SetTime(Pick1.Date);
end;

end.
第 3 页,共 3 页 [1] [2] [3]
站内搜索