首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何区分C#中的正常可执行文件和自解压文件?

如何区分C#中的正常可执行文件和自解压文件?
EN

Stack Overflow用户
提问于 2017-01-17 12:36:36
回答 4查看 1.8K关注 0票数 2

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

所以我必须找到一种方法来区分C#中的普通exe文件和SFX文件?

有什么方法可以在C#中检测到它们吗?

EN

回答 4

Stack Overflow用户

发布于 2019-10-23 23:56:05

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

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

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

(倒数第二个单词)<>H218

  • 跳过那么多字节

该流现在指向节表

然后,只需读取区段表( IMAGE_FILE_HEADER结构有一个成员NumberOfSections),并查看其中是否有名为_winzip_的成员。

票数 2
EN

Stack Overflow用户

发布于 2020-02-24 21:18:52

如果您想要检测自解压程序,所采用的方法会有所不同,这取决于您是希望以100%的可靠性检测一组已知格式中的自解压程序,还是希望以较低的可靠性检测不熟悉的自解压缩程序。

(这两种方法各有用处。例如,后者可以很好地向人征求第二意见。)

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

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

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

选项B将按照Medinoc的描述解析MZ报头,然后计算NE或PE二进制文件的总长度(Win16自解压程序确实存在,如WinZIP 6.3 SR-1及更低版本工具创建的),而不是查找PE报头中的特定部分,然后跳过所有内容。

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

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

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

  1. 使用选项A并检查所有现代或历史上常见的基于EXE的自解压程序格式(7zRARACEZipARJARCLha/LZH、C12、C13、安装程序、C14安装程序、单文件C15安装程序或包含未匹配的.cab
  2. If的EXE )的标识头/尾部,使用选项A排除D16之前的DPMI EXE文件、常见DPMI扩展器、和其他常见的批量内容,这些内容可能已经作为穷人的资源束连接到EXE上。(例如,图像、音频、视频等)

要为DPMI可执行文件创建测试文件,只需编译"Hello,World!“使用djgpp (Linux)和Open Watcom C/C++ (1.92.0)连接到DPMI目标。OpenWatcom C/C++包括DOS/4GW、PMODE/W、DOS/32A和CauseWay DPMI扩展器、Win386 windows扩展器,并且与other free/freed extenders兼容。(据我所知,PharLap的扩展器是Microsoft C/C++中唯一值得注意的扩展器,但我相信Open Watcom至少可以生成它们应该预先包含的二进制文件。)

您可能还需要排除可执行打包程序,因为它们使用基于存根的系统。UPX几乎是当今唯一在使用的工具,但在历史上,有一个后备的lot of them.

  • As,解析MZLENEPE标头来正确计算嵌入的资源(例如。图标)作为EXE部分的一部分,然后,如果文件超过某个百分比的“额外数据”,则它很可能是一个self-extractor.
票数 2
EN

Stack Overflow用户

发布于 2017-01-17 14:45:01

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

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

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

使用.rar

  • Open

  • 将文件格式更改为使用WinRAR或7z

  • 使用try-catch block up文件,如果无法打开,则给出错误消息;否则,如果打开成功,则给出肯定消息。

如果您需要有关更改文件格式的帮助,您可以查看以下内容:Change File Extension Using C#

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

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

https://stackoverflow.com/questions/41689165

复制
相关文章

相似问题

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