繁体   English   中英

C#中如何区分普通exe文件和自解压文件?

[英]How to distinguish between normal exe file and self-extracting file in C#?

我想检测使用 zip 工具创建的exe文件? 7zWinRAR或 ...,我的意思是 SFX(自解压可执行文件)文件

所以我必须找到一种方法来区分C#中的普通exe文件和SFX文件?
有什么方法可以在 C# 中检测它们吗?

我不知道其他实用程序,但来自 Nico Mak Computing 的“经典”自_winzip_器创建了包含_winzip_部分的可执行文件。 这些可以通过读取可执行文件的节表来检测,它是一个IMAGE_SECTION_HEADER结构数组。

要在不使用专门库的情况下访问它,您需要:

  • 在文件上打开一个流
  • 读取 64 字节的IMAGE_DOS_HEADER结构
  • 取其最后一个成员(四个字节)作为下一个头部的偏移量
  • 寻求这个偏移
  • 读取 4 字节 PE 魔术
  • 读取 20 字节的 IMAGE_FILE_HEADER 结构
  • 取其成员SizeOfOptionalHeader (倒数第二个字)
  • 跳过那么多字节
  • 流现在指向节表

然后只需读取部分表(IMAGE_FILE_HEADER 结构有一个成员NumberOfSections ),并查看其中是否有任何一个名为_winzip_

如果您想检测自解压器,所采用的方法会有所不同,具体取决于您是要检测一组已知格式中的自解压器并具有 100% 的可靠性,还是要检测不熟悉的可靠性较低的自解压器。

(这两种方法都有其用途。例如,后者非常适合请人征求第二意见。)

选项 A 将使用与存档工具相同的方法。

自解压存档只是一个常规存档,连接到一个 EXE 文件中,并固定了偏移量。 (对于 Zip 文件,您可以使用Info-ZIP 中的zip -A手动执行此操作),因此打开文件并扫描,寻找有效的 RAR/Zip/等。 标头/拖车。 (要有效地做到这一点,请使用像Aho-Corasick这样的算法在一次通过中搜索所有候选字符串。)

为了获得额外的可靠性,解析 MZ 和 NE 或 PE 标头以确定跳过多少字节以跳过 EXE 本身内的任何潜在匹配字符串。

选项 B 将按照 Medinoc 的描述解析 MZ 标头,但随后不是在 PE 标头中查找特定部分,而是计算 NE 或 PE 二进制文件的总长度(Win16 自解压器确实存在,由工具创建)像 WinZIP 6.3 SR-1 及以下)并跳过它。

然后,进行一些启发式检查,例如将跳过的 EXE 部分的大小与整个文件的大小进行比较,并确定 EXE 部分的小和连接到它的内容的大是否看起来是自解压器的特征。

(请记住,如果您不对非 NE/非 PE 文件进行额外检查以排除它们,这也可能会捕获基于 DPMI 的 DOS 应用程序,因为它们也使用“存根和连接的内容”结构。 )

最可靠的解决方案是结合两种方法:

  1. 使用选项 A 并检查所有现代或历史上常见的基于 EXE 的自解压器格式( 7zRARACEZipARJARCLha/LZHZooInnoSetup安装程序、 NSIS安装程序、单-file InstallShield安装程序来自.msi时代,或包含.cab.msi包的 EXE。)

  2. 如果您没有找到匹配项,请使用选项 A 排除 .NET EXE 文件、常见 DPMI 扩展程序和其他可能作为穷人资源包连接到 EXE 的常见批量内容。 (例如图像、音频、视频等)

    要为 DPMI EXE 创建测试文件,只需编译一个“Hello, World!” 使用djgpp ( Linux ) 和 Open Watcom C/C++ ( 1.9 , 2.0 ) 到 DPMI 目标。 djgpp 将为您提供 CWSDPMI,而 OpenWatcom C/C++ 包括 DOS/4GW、PMODE/W、DOS/32A 和 CauseWay DPMI 扩展器、 Win386 windows 扩展器,并且与其他免费/释放的扩展器兼容。 (PharLap 的扩展程序,Microsoft 授权包含在 Microsoft C/C++ 中,是我所知道的唯一没有被释放的值得注意的扩展程序,但我相信 Open Watcom 至少可以生成他们应该生成的二进制文件放在前面。)

    您可能还需要排除可执行加壳程序,因为它们使用基于存根的系统。 UPX几乎是今天唯一使用的,但从历史上看,有 很多

  3. 作为后备,解析MZLENEPE标头以正确计算嵌入资源(例如图标)作为 EXE 部分的一部分,然后,如果文件超过一定百分比的“额外数据”,则很可能做一个自解压者。

您可以将.exe格式转换为.rar格式并双击打开(而不是解压)它以查看内容,如果您的WinRAR7z设法打开它,它很可能是一个自解压文件你。 但是,如果您在尝试查看.rar文件中的内容时遇到错误,那么它很可能是一个普通的.exe文件。

我相信还有其他方法,但这是我常用的方法,因为它非常简单。

话虽如此,您需要让 C# 做的是:

  1. 将文件格式更改为.rar
  2. 使用 WinRAR 或 7z 打开文件
  3. 使用try-catch块,如果打开失败给出错误信息,否则如果打开成功给出肯定信息。

如果您在更改文件格式方面需要帮助,可以查看此内容: 使用 C# 更改文件扩展名

如果您在打开文件时需要帮助: 如何在 C# 中启动文件

如果它是来自任何压缩的 SFX,它肯定会是一个标准的可执行文件。

所以你可以采取方法来验证可执行文件与否

如何判断文件是否为exe?

检查 Chris Schmich 的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM