1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.
    Скрыть объявление

Функция подсчета энтропии

Тема в разделе "Pascal/Delphi", создана пользователем KaeraK, 28 дек 2011.

  1. KaeraK

    KaeraK Guest

    Код:
    [COLOR="SeaGreen"]{
      Calculate Entropy
      By [email protected]
      Original C++ code from IDA Entropy Plugin v0.1
    }[/COLOR]
    
    function CalcEntropyForBuffer(Buffer:Pointer; BufferSize:DWORD):Double;
    const
      DbLog:   Double = 1.4426950408889634073599246810023;
    var
      Entropy:  Double;
      Entries:  array[0..255] of DWORD;
      i:        DWORD;
      Temp:     Double;
    begin
      Entropy := 0.00;
      ZeroMemory(@Entries, SizeOf(Entries));
      for i := 0 to (BufferSize - 1) do
        Inc(Entries[PByte(DWORD(Buffer) + i)^]);
      for i := 0 to 255 do
      begin
        Temp := Entries[i] / BufferSize;
        if (Temp > 0) then
          Entropy := Entropy + Temp * (Ln(Temp) * DbLog);
      end;
      Result := Entropy;
    end;
    
    function CalcEntropyForFile(FilePath:string):Double;
    var
      hFile:        DWORD;
      dwFileSize:   DWORD;
      dwBytesRead:  DWORD;
      pBuffer:      Pointer;
    begin
      Result := 0.00;
      hFile := CreateFileA(PChar(FilePath), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
      if not ( hFile = INVALID_HANDLE_VALUE ) then
      begin
        dwFileSize := GetFileSize(hFile, nil);
        if not ( dwFileSize = 0 ) then
        begin
          pBuffer := VirtualAlloc(nil, dwFileSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
          if ( Assigned(pBuffer) ) then
          begin
            ReadFile(hFile, pBuffer^, dwFileSize, dwBytesRead, nil);
            if ( dwBytesRead = dwFileSize ) then
              Result := CalcEntropyForBuffer(pBuffer, dwFileSize);
            VirtualFree(pBuffer, 0, MEM_RELEASE);
          end;
        end;
        CloseHandle(hFile);
      end;
    end;
    Используем ее так:
    Код:
    var
      FileEntropy:  Double;
    begin
      FileEntropy := CalcEntropyForFile('Hello.exe');
      if not ( FileEntropy = 0.00 ) then
        MessageBoxA(0, PChar(Format('%n', [Abs(FileEntropy)])), nil, 0);
    end.
    На екран выводится меседж с числовым значением.

    P.S. Для общего усведомления этого термина, можно сказать так: по значению, мы можем определить, на сколько "сильно" сжат файл.

     

Поделиться этой страницей