2

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

所以我必须找到一种方法来区分exeC#中的普通文件和SFX文件?
有没有办法在 C# 中检测它们?

4

4 回答 4

2

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

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

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

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

于 2019-10-23T15:56:05.357 回答
2

如果您想检测自提取器,则采取的方法取决于您是想以 100% 的可靠性检测一组已知格式中的自提取器,还是想以较低的可靠性检测不熟悉的自提取器。

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

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

自解压存档只是一个常规存档,连接到一个 EXE 文件,并固定了偏移量。zip -A(对于 Zip 文件,您可以使用Info-ZIP手动执行此操作),因此打开文件并扫描,寻找有效的 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,或包含 a.cab.msibundle 的 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 C/C++ 中,是我所知道的唯一没有被释放的值得注意的扩展程序,但我相信 Open Watcom 至少可以生成他们应该的二进制文件被放在前面。)

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

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

于 2020-02-24T13:18:51.713 回答
1

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

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

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

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

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

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

于 2017-01-17T06:45:01.100 回答
1

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

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

如何判断一个文件是否为exe?

检查 Chris Schmich 的答案

于 2017-01-17T06:52:09.440 回答