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



我想检测使用zip工具创建的exe文件吗?如CCD_ 2或CCD_。。。,我指的是SFX(自解压可执行文件)文件

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

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

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

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

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

如果您想检测自提取器,所采取的方法会有所不同,这取决于您是想以100%的可靠性检测已知格式集内的自提取器还是想以较低的可靠性检测不熟悉的自提算子。

(这两种方法都有各自的用途。例如,后者有助于征求人们的第二意见。)

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

自解压档案只是一个常规档案,连接到EXE文件上,偏移量是固定的。(对于Zip文件,您可以使用Info-Zip中的zip -A手动执行此操作),因此打开文件并扫描,查找有效的RAR/Zip等。收割台/拖车。(为了有效地进行搜索,可以使用Aho-Corasick这样的算法在一次遍历中搜索所有候选字符串。)

为了获得额外的可靠性,请解析MZ和NE或PE标头,以计算要跳过多少字节才能通过EXE本身中的任何潜在匹配字符串。

选项B是如Medinoc所述解析MZ标头,但然后,计算NE或PE二进制文件的总长度,而不是在PE标头中查找特定部分(WinZIP 6.3 SR-1及以下工具创建的Win16自提取器确实存在),并跳过所有内容。

然后,进行一些启发式检查,例如将跳过的EXE部分的大小与文件的整体大小进行比较,并决定EXE部分的小和连接到它上的内容的大是否具有自提取器的特征。

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

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

  1. 使用选项A并检查所有现代或历史上常见的基于EXE的自提取器格式(7z、RAR、ACE、Zip、ARJ、ARC、Lha/LZH、Zoo、InnoSetup安装程序、NSIS安装程序、.msi之前的单文件InstallShield安装程序,或包含.cab.msi捆绑包的EXE)的识别头/尾。

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

    要为DPMI EXE创建测试文件,只需使用djgpp(Linux)和Open Watcom C/C++(1.9,2.0)将"Hello,World。(据我所知,PharLap的扩展程序是唯一一个没有被释放的值得注意的扩展程序,微软授权它与微软C/C++一起使用,但我相信Open Watcom至少可以生成它们应该准备好的二进制文件。)

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

  3. 作为后备方案,解析MZ和LE、NE或PE标头,以将嵌入的资源(例如图标)正确计数为EXE部分的一部分,然后,如果文件的"额外数据"超过某个百分比,则很可能是自提取器。

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

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

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

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

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

如果你需要打开文件的帮助:我如何在C#中启动文件

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

所以你可以采取方法来验证可执行文件或不

如何查找文件是否为exe?

Chris Schmith 的检查答案

相关内容

  • 没有找到相关文章

最新更新