有没有一种方法可以确定exe文件是否已被UPX压缩?
确定我是否已压缩exe文件的功能非常出色,但我发现代码有问题。如果调用函数IsUPXCompressed,则您尝试运行upx,upx无法保存其修改的文件。该功能中有些东西无法正确共享权限。我已经测试了几个小时。如果我不调用该方法,则UPX可以毫无问题地写入文件。您调用它,然后尝试运行UPX,它将不保存文件。尝试写入文件时,UPX报告IOException权限被拒绝错误。
任何人都可以在代码中发现可能导致此问题的错误吗?
谢谢
确定我是否已压缩exe文件的功能非常出色,但我发现代码有问题。如果调用函数IsUPXCompressed,则您尝试运行upx,upx无法保存其修改的文件。该功能中有些东西无法正确共享权限。我已经测试了几个小时。如果我不调用该方法,则UPX可以毫无问题地写入文件。您调用它,然后尝试运行UPX,它将不保存文件。尝试写入文件时,UPX报告IOException权限被拒绝错误。
任何人都可以在代码中发现可能导致此问题的错误吗?
谢谢
最佳答案
另一种方法,当使用UPX工具打包exe时,PE header 的部分包含称为UPX0
,UPX1
等的部分,因此,如果阅读这些部分并将名称与字符串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/