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

时间:2017-01-17 04:36:36

标签: c# winrar sfx

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

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

4 个答案:

答案 0 :(得分:1)

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

所以你可以采取措施验证可执行文件

How to find if a file is an exe?

检查Chris Schmich的答案

答案 1 :(得分:1)

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

要访问它而不使用专门的库,您需要:

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

然后,只需阅读节表(IMAGE_FILE_HEADER结构具有成员NumberOfSections),然后查看其中是否有一个名为_winzip_的问题。

答案 2 :(得分:0)

您可以将.exe格式设置为.rar格式,然后双击打开(不提取)格式以查看内容,如果您的话,很可能是自解压文件WinRAR7z设法为您打开它。但是,如果您在尝试查看.rar文件中的内容时遇到错误,则很可能是正常的.exe文件。

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

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

  1. 将文件格式更改为.rar
  2. 使用WinRAR或7z
  3. 打开文件
  4. 使用try-catch阻止,如果无法打开则给出错误消息,否则,如果打开成功则给出肯定的消息。
  5. 如果您需要有关更改文件格式的帮助,可以查看以下内容:Change File Extension Using C#

    如果您在打开文件时需要帮助:How do I launch files in C#

答案 3 :(得分:0)

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

(两种方法都有其用途。例如,后一种方法适合于征求人们的第二意见。)

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

自解压存档只是一个常规存档,连接到EXE文件中,并固定了偏移量。 (对于Zip文件,您可以使用Info-ZIP中的zip -A手动进行操作),因此请打开文件并进行扫描,以查找有效的RAR / Zip / etc。标头/拖车。 (要高效地执行此操作,请使用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的自解压缩格式(7zRARACE,{ {3}},ZipARJARCLha/LZHZoo安装程序,InnoSetup安装程序,单文件{{3} } .msi之前的安装程序,或包含NSISInstallShield捆绑软件的EXE。)

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

    要为DPMI EXE创建测试文件,只需编译一个“ Hello,World!”。使用.cab.msi)和Open Watcom C / C ++(djgppLinux)到DPMI目标。 djgpp将为您提供CWSDPMI,而OpenWatcom C / C ++包括DOS / 4GW,PMODE / W,DOS / 32A和CauseWay DPMI扩展器,1.9 Windows扩展器,并且与2.0兼容。 (PharLap的扩展程序是Microsoft许可与Microsoft C / C ++包括在一起的扩展程序,是我所知的唯一未释放的扩展程序,但我相信Open Watcom至少可以生成它们应该被释放的二进制文件。之前。)

    您可能还需要排除可执行加壳程序,因为它们使用基于存根的系统。 Win386几乎是当今唯一使用的一个,但是从历史上看,有一个other free/freed extenders

  3. 作为备用,请解析UPXlot of themMZLE标头,以将嵌入式资源(例如图标)正确地计入EXE部分,然后,如果文件超过某个百分比的“额外数据”,则很可能是自解压程序。