delphi - 判断exe文件是否经过UPX压缩的方法

标签 delphi compression exe upx

有没有办法确定exe文件是否已经用UPX压缩?

确定 exe 文件是否已压缩的功能非常出色,只是我发现代码有问题。如果调用函数 IsUPXcompressed 然后尝试运行 upx,upx 无法保存它修改的文件。该功能中存在无法正确共享权限的问题。我已经对此进行了几个小时的测试。如果我不调用该方法,那么 UPX 可以毫无问题地写入文件。你调用它然后尝试运行 UPX 它不会保存文件。尝试写入文件时,UPX 报告 IOException Permission returned 错误。

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

谢谢

<小时/>

确定 exe 文件是否已压缩的功能非常出色,只是我发现代码有问题。如果调用函数 IsUPXcompressed 然后尝试运行 upx,upx 无法保存它修改的文件。该功能中存在无法正确共享权限的问题。我已经对此进行了几个小时的测试。如果我不调用该方法,那么 UPX 可以毫无问题地写入文件。你调用它然后尝试运行 UPX 它不会保存文件。尝试写入文件时,UPX 报告 IOException Permission returned 错误。

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

谢谢

最佳答案

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

enter image description here

检查此功能

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/

相关文章:

algorithm - RAR解压算法

archive - 只解压特定的 bzip2 block

perl - 编译的 perl 可执行文件无法在 Windows 7(64 位)上运行

mysql - 通过 ClientDataSet 失败的 Delphi 2010 MySQL 更新

function - Delphi - 如果没有创建类,为什么这个函数可以工作?

Delphi XE2 VCL 样式未正确绘制 TabSheets

delphi - 如何优雅地退出在 Delphi 中执行代码的 MDI 表单

soap - 如何请求 gzipped/compressed SOAP 响应?

java - Excelsior错误: classpath does not contain main classes

c++ - C++ 可执行文件是否包含 .obj、.lib 和 .dll?