Delphi Can

Orjinalini görmek için tıklayınız: ssdeep hash ile çalışan var mı
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhaba,

ssdeep(https://github.com/ssdeep-project/ssdeep) hash kütüphanesini deneyimleyen var mı?
fuzzy.dll ile işlem yapmaya çalışıyorum fakat c den çevirme konusunda baya zorlandım.

Delphi ile ilgili kaynağı sıfır durumda sanırım google üzerinden hiç bir ip ucu bulamadım. bu hariç
(28-03-2020, Saat: 00:20)berk06 Adlı Kullanıcıdan Alıntı: [ -> ]fuzzy.dll ile işlem yapmaya çalışıyorum fakat c den çevirme konusunda baya zorlandım.

Aşağıdaki kaynakları inceleyebilirsiniz.
  1. Pitfalls of converting
  2. Pitfalls of converting
  3. http://jedi.grizzlydev.com/www/files/manuals/Tutorial4.zip
Merhaba,

function GetDosOutput(CommandLine: string; Work: string = 'C:\'): AnsiString;
var
 SA: TSecurityAttributes;
 SI: TStartupInfo;
 PI: TProcessInformation;
 StdOutPipeRead, StdOutPipeWrite: THandle;
 WasOK: Boolean;
 Buffer: array[0..255] of ansiChar;
 BytesRead: Cardinal;
 WorkDir: String;
 Handle: Boolean;
begin
 Result := '';
 with SA do begin
   nLength := SizeOf(SA);
   bInheritHandle := True;
   lpSecurityDescriptor := nil;
 end;
 CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
 try
   with SI do
   begin
     FillChar(SI, SizeOf(SI), 0);
     cb := SizeOf(SI);
     dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
     wShowWindow := SW_HIDE;
     hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
     hStdOutput := StdOutPipeWrite;
     hStdError := StdOutPipeWrite;
   end;
   WorkDir := Work;
   Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                           nil, nil, True, 0, nil,
                           PChar(WorkDir), SI, PI);
   CloseHandle(StdOutPipeWrite);
   if Handle then
     try
       repeat
         WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
         if BytesRead > 0 then
         begin
           Buffer[BytesRead] := #0;
           Result := Result + Buffer;
         end;
       until not WasOK or (BytesRead = 0);
       WaitForSingleObject(PI.hProcess, INFINITE);
     finally
       CloseHandle(PI.hThread);
       CloseHandle(PI.hProcess);
     end;
 finally
   CloseHandle(StdOutPipeRead);
 end;
end;

function SSDEEP(Fname : string): string;
var
s1 : AnsiString;
i1, i2 : Integer;
begin
  Result := GetDosOutput('C:\Win32\Debug\ssdeep.exe '+Fname);
  i1 := Pos(#10,Result);
  i2 := Pos(',',Result,43);
  Result := MidStr(Result,i1+1,i2-i1-1);
end;

ssdeep.exe için : https://yadi.sk/d/DlccwfDqjk8bXA
(29-03-2020, Saat: 17:41)ismailkocacan Adlı Kullanıcıdan Alıntı: [ -> ]
(28-03-2020, Saat: 00:20)berk06 Adlı Kullanıcıdan Alıntı: [ -> ]fuzzy.dll ile işlem yapmaya çalışıyorum fakat c den çevirme konusunda baya zorlandım.

Aşağıdaki kaynakları inceleyebilirsiniz.
  1. Pitfalls of converting
  2. Pitfalls of converting
  3. http://jedi.grizzlydev.com/www/files/manuals/Tutorial4.zip
Değerli kaynaklar için teşekkür ederim, ayrıca araştırırken https://github.com/WouterVanNifterick/C-To-Delphi böyle bir programa rastladım. En azından karmaşık gelen yerlerde biraz rahatlattı beni. Fakat işin içinden çıkamayacağımı anladım. dll i python ile kullanabilmişler, delphi içerisinde py çalıştıran bir kütüphane görmüştüm belki onun üzerinden çeviriye gidebilirim. Bu karantina günlerinde python öğrenmek için güzel bir fırsat olabilir Smile
(30-03-2020, Saat: 00:01)engerex Adlı Kullanıcıdan Alıntı: [ -> ]Merhaba,

function GetDosOutput(CommandLine: string; Work: string = 'C:\'): AnsiString;
var
 SA: TSecurityAttributes;
 SI: TStartupInfo;
 PI: TProcessInformation;
 StdOutPipeRead, StdOutPipeWrite: THandle;
 WasOK: Boolean;
 Buffer: array[0..255] of ansiChar;
 BytesRead: Cardinal;
 WorkDir: String;
 Handle: Boolean;
begin
 Result := '';
 with SA do begin
   nLength := SizeOf(SA);
   bInheritHandle := True;
   lpSecurityDescriptor := nil;
 end;
 CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
 try
   with SI do
   begin
     FillChar(SI, SizeOf(SI), 0);
     cb := SizeOf(SI);
     dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
     wShowWindow := SW_HIDE;
     hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
     hStdOutput := StdOutPipeWrite;
     hStdError := StdOutPipeWrite;
   end;
   WorkDir := Work;
   Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                           nil, nil, True, 0, nil,
                           PChar(WorkDir), SI, PI);
   CloseHandle(StdOutPipeWrite);
   if Handle then
     try
       repeat
         WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
         if BytesRead > 0 then
         begin
           Buffer[BytesRead] := #0;
           Result := Result + Buffer;
         end;
       until not WasOK or (BytesRead = 0);
       WaitForSingleObject(PI.hProcess, INFINITE);
     finally
       CloseHandle(PI.hThread);
       CloseHandle(PI.hProcess);
     end;
 finally
   CloseHandle(StdOutPipeRead);
 end;
end;

function SSDEEP(Fname : string): string;
var
s1 : AnsiString;
i1, i2 : Integer;
begin
  Result := GetDosOutput('C:\Win32\Debug\ssdeep.exe '+Fname);
  i1 := Pos(#10,Result);
  i2 := Pos(',',Result,43);
  Result := MidStr(Result,i1+1,i2-i1-1);
end;

ssdeep.exe için : https://yadi.sk/d/DlccwfDqjk8bXA

Çok teşekkür ederim, dll dışında ki tek yolu direkt göstermiş oldunuz.
İki ssdeep çıktısını kıyaslamak için;

const
  B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

function LevenshteinDistance(const s, t: string): integer;inline;
var
 d   : array of array of integer;
 n, m, i, j : integer;
begin
 n := length(s);
 m := length(t);
 if n = 0 then Exit(m);
 if m = 0 then Exit(n);

 SetLength(d, n + 1, m + 1);
 for i := 0 to n do d[i, 0] := i;
 for j := 0 to m do d[0, j] := j;

 for i := 1 to n do
   for j := 1 to m do
     d[i, j] := Min(Min(d[i-1, j]+1, d[i,j-1]+1), d[i-1,j-1]+Integer(s[i] <> t[j]));

 Result := d[n, m];
end;


function matchScore(s1,s2:String):Extended;
var
 e,r :Extended;
begin
 e := LevenshteinDistance(s1,s2);
 r := 1 - e / Max(s1.Length,s2.Length);
 Result := r * 100;
end;

function similarity(d1,d2:String):Extended;
var
 b1,b2 :integer;
begin
 b1 := b64.IndexOf(d1.Chars[0]);
 b2 := b64.IndexOf(d2.Chars[0]);

 if (b1 > b2) then
 Result := similarity(d2,d1);

 if ((Abs(b1-b2)) > 1) then
   Result := 0
 else if (b1 = b2) then
   Result := matchScore(d1.Split([':'])[1],d2.Split([':'])[1])
 else
   Result := matchScore(d1.Split([':'])[2],d2.Split([':'])[1]);
end;

Buradan kodları çevirdim > https://github.com/cloudtracer/ssdeep.js.../ssdeep.js
LevenshteinDistance kaynağı> https://stackoverflow.com/questions/1058...7#10593797
unit dSSDEEP;

interface

uses
 SysUtils, Windows;

const
 FUZZY_FLAG_ELIMSEQ = $1;
 FUZZY_FLAG_NOTRUNC = $2;
 SPAMSUM_LENGTH = 64;
 FUZZY_MAX_RESULT = 2 * SPAMSUM_LENGTH + 20;

type
 PFuzzyState = ^TFuzzyState;
 TFuzzyState = record
   // Define the internal state fields here
 end;

function FuzzyNew: PFuzzyState; stdcall; external 'fuzzy.dll' name 'fuzzy_new';
function FuzzyClone(const state: PFuzzyState): PFuzzyState; stdcall; external 'fuzzy.dll' name 'fuzzy_clone';
function FuzzySetTotalInputLength(state: PFuzzyState; totalFixedLength: UInt64): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_set_total_input_length';
function FuzzyUpdate(state: PFuzzyState; const buffer: PByte; bufferSize: NativeUInt): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_update';
function FuzzyDigest(const state: PFuzzyState; result: PAnsiChar; flags: UInt32): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_digest';
procedure FuzzyFree(state: PFuzzyState); stdcall; external 'fuzzy.dll' name 'fuzzy_free';
function FuzzyHashBuf(const buf: PByte; bufLen: UInt32; result: PAnsiChar): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_hash_buf';
function FuzzyHashFile(handle: THandle; result: PAnsiChar): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_hash_file';
function FuzzyHashStream(handle: THandle; result: PAnsiChar): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_hash_stream';
function FuzzyHashFilename(const filename: PAnsiChar; result: PAnsiChar): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_hash_filename';
function FuzzyCompare(const sig1, sig2: PAnsiChar): Integer; stdcall; external 'fuzzy.dll' name 'fuzzy_compare';

implementation

end.