gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:56:06 25 4
gpt4 key购买 nike

有没有办法确定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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com