首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法确定exe文件是否已用UPX压缩。

方法确定exe文件是否已用UPX压缩。
EN

Stack Overflow用户
提问于 2011-02-25 16:42:29
回答 5查看 4.8K关注 0票数 6

是否有方法确定exe文件是否已用UPX压缩?

除了我发现代码有问题外,用于确定exe文件是否已被压缩的函数是极好的。如果调用函数IsUPXCompressed,则尝试运行upx,upx无法保存它修改的文件。在这个函数中有一些东西没有正确地分享权利。我已经测试了好几个小时了。如果我不调用该方法,那么UPX就可以毫无问题地编写文件。您调用它,然后尝试运行UPX,它将不会保存文件。UPX在试图写入文件时报告一个拒绝IOException权限的错误。

有人能发现代码中有什么错误会导致这个问题吗?

谢谢你

除了我发现代码有问题外,用于确定exe文件是否已被压缩的函数是极好的。如果调用函数IsUPXCompressed,则尝试运行upx,upx无法保存它修改的文件。在这个函数中有一些东西没有正确地分享权利。我已经测试了好几个小时了。如果我不调用该方法,那么UPX就可以毫无问题地编写文件。您调用它,然后尝试运行UPX,它将不会保存文件。UPX在试图写入文件时报告一个拒绝IOException权限的错误。

有人能发现代码中有什么错误会导致这个问题吗?

谢谢你

EN

回答 5

Stack Overflow用户

发布于 2011-02-25 17:30:35

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

检查此函数

代码语言:javascript
复制
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;
票数 11
EN

Stack Overflow用户

发布于 2011-02-25 17:09:27

UPX本身就是这样做的:

代码语言:javascript
复制
if (memcmp(isection[0].name,"UPX",3) == 0)
    throwAlreadyPackedByUPX();

这是32位PEs的实现;64位PEs需要不同的偏移量,其他可执行格式必须单独处理。

代码语言:javascript
复制
#include <stdio.h>

typedef unsigned int uint;

uint peek_d( FILE* f, uint offs ) {
  fseek( f, offs, SEEK_SET );
  uint a = 0;
  fread( &a, 1,sizeof(a), f );
  return a;
}

int main( int argc, char** argv ) {

  FILE* f = fopen( argv[1], "rb" ); if( f==0 ) return 1;

  uint p,n,x,y;

  p = peek_d( f, 0x3C ); // PE header offset
  n = peek_d( f, p+0x74 ); // pointer table size
  x = p + 0x78 + n*8;
  y = peek_d( f, x+0*0x28+0 ); // 1st section name

  if( (y&0xFFFFFF) == ('U'+('P'<<8)+('X'<<16)) ) {
    printf( "UPX detected!\n" );
  } else {
    printf( "No UPX!\n" );
  }

  return 0;
}
票数 4
EN

Stack Overflow用户

发布于 2011-02-25 16:49:43

试着用upx解压缩吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5119948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档