有没有一种方法可以确定exe文件是否已被UPX压缩?

确定我是否已压缩exe文件的功能非常出色,但我发现代码有问题。如果调用函数IsUPXCompressed,则您尝试运行upx,upx无法保存其修改的文件。该功能中有些东西无法正确共享权限。我已经测试了几个小时。如果我不调用该方法,则UPX可以毫无问题地写入文件。您调用它,然后尝试运行UPX,它将不保存文件。尝试写入文件时,UPX报告IOException权限被拒绝错误。

任何人都可以在代码中发现可能导致此问题的错误吗?

谢谢

确定我是否已压缩exe文件的功能非常出色,但我发现代码有问题。如果调用函数IsUPXCompressed,则您尝试运行upx,upx无法保存其修改的文件。该功能中有些东西无法正确共享权限。我已经测试了几个小时。如果我不调用该方法,则UPX可以毫无问题地写入文件。您调用它,然后尝试运行UPX,它将不保存文件。尝试写入文件时,UPX报告IOException权限被拒绝错误。

任何人都可以在代码中发现可能导致此问题的错误吗?

谢谢

最佳答案

另一种方法,当使用UPX工具打包exe时,PE header 的部分包含称为UPX0UPX1等的部分,因此,如果阅读这些部分并将名称与字符串UPX进行比较,则可以确定是否使用压缩了exe UPX打包程序。

检查此功能

uses
Windows;

function IsUPXCompressed(const Filename:TFileName): Boolean;
var
  i             : integer;
  pBaseAddress  : PByte;
  pDosHeader    : PImageDosHeader;
  pNtHeaders    : PImageNtHeaders;
  hFile         : Cardinal;
  hFileMap      : Cardinal;
  pSectionHeader: PImageSectionHeader;
  dwOffset      : Cardinal;
  SectName      : AnsiString;
begin
  Result:=False;

  hFile := CreateFile(PChar(Filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if (hFile = INVALID_HANDLE_VALUE) then Exit;

  hFileMap := CreateFileMapping(hFile, nil, PAGE_READONLY or SEC_IMAGE,  0, 0, nil);
  if (hFileMap = 0) then
  begin
    CloseHandle(hFile);
    Exit;
  end;

  pBaseAddress := MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
  if (pBaseAddress = nil) then
  begin
    CloseHandle(hFileMap);
    CloseHandle(hFile);
    Exit;
  end;

  try
      dwOffset   := Cardinal(pBaseAddress);
      pDosHeader := PImageDosHeader(pBaseAddress);
      pNtHeaders := PImageNtHeaders(dwOffset + Cardinal(pDosHeader._lfanew));
      pSectionHeader := pImageSectionHeader(Cardinal(pNtHeaders) + SizeOf(TImageNtHeaders));
      for i := 0 to pNtHeaders.FileHeader.NumberOfSections-1 do
      begin
        SetString(SectName, PAnsiChar(@pSectionHeader.Name), SizeOf(pSectionHeader.Name));
        Result:=Pos('UPX',SectName)>0;
        If Result then break;
        Inc(pSectionHeader);
      end;

  finally
    UnmapViewOfFile(pBaseAddress);
    CloseHandle(hFileMap);
    CloseHandle(hFile);
  end;

end;

关于delphi - 确定exe文件是否已被UPX压缩的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5119948/

10-12 02:09