function TempPath(): string; var SPath, SFile: array[0..254] of char; begin GetTempPath(254, SPath); GetTempFileName(SPath, '~SM', 0, SFile); result := SFile; DeleteFile(result); end;
function TPassForm.Make01(F: string; P: string = ''): boolean; var Linker: string; Access: OleVariant; begin if FileExists(F) then DeleteFile(F); Linker := 'Provider=Microsoft.Jet.OLEDB.4.0;Data ' + 'Source=%s;Jet OLEDB:Database PassWord=%s;'; Access := CreateOleObject('ADOX.Catalog'); Access.Create(format(Linker, [F, P])); end;
function TPassForm.Make02(F: string): boolean; var Access: OleVariant; begin if FileExists(F) then DeleteFile(F); Access := CreateOleObject('Access.Application'); Access.NewCurrentDatabase(F); Access.Quit; Access := null; end;
procedure TPassForm.FormDestroy(Sender: TObject); begin FileBox1.Free; end;
procedure TPassForm.ExecDirectory(S: string); var i: integer; P: PassType; begin FileBox1.Directory := S; ListVIEw1.Items.BeginUpdate; ListVIEw1.Items.Clear; for i := FileBox1.Count - 1 downto
0 do begin S := FileBox1.Items[i]; P := ExecFile(S); if P.PassCode = '' then Continue; with ListVIEw1.Items.Add do begin Caption := S; ImageIndex := 0; SubItems.Add(P.FileType); SubItems.Add(P.PassCode); 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;
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;