我想检测exe
使用 zip 工具创建的文件?像7z
or WinRAR
or ...,我的意思是 SFX(自解压可执行文件)文件
所以我必须找到一种方法来区分exe
C#中的普通文件和SFX文件?
有没有办法在 C# 中检测它们?
我不知道其他实用程序,但 Nico Mak Computing 的“经典”自解压器创建包含一个_winzip_
部分的可执行文件。这些可以通过读取可执行文件的节表来检测,该节表是IMAGE_SECTION_HEADER结构的数组。
要在不使用专门库的情况下访问它,您需要:
SizeOfOptionalHeader
(倒数第二个 WORD)然后只需阅读节表(IMAGE_FILE_HEADER 结构有一个成员NumberOfSections
),并查看其中是否有任何一个名为_winzip_
.
如果您想检测自提取器,则采取的方法取决于您是想以 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 应用程序,因为它们也使用“存根加上串联的东西”结构。 )
最可靠的解决方案是结合两种方法:
使用选项 A 并检查所有现代或历史上常见的基于 EXE 的自解压器格式(7z、RAR、ACE、Zip、ARJ、ARC、Lha/LZH、Zoo、InnoSetup安装程序、NSIS安装程序、单-file以前的InstallShield安装程序.msi
,或包含 a.cab
或.msi
bundle 的 EXE。)
如果您没有找到匹配项,请使用选项 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 至少可以生成他们应该的二进制文件被放在前面。)
作为后备,解析MZ和LE、NE或PE标头以正确计算嵌入资源(例如图标)作为 EXE 部分的一部分,然后,如果文件超过某个百分比的“额外数据”,则很可能做一个自我提取者。
您可以将.exe
格式设置为.rar
格式并双击打开(不提取)它以查看内容,如果您WinRAR
或7z
设法为您打开它,它很可能是一个自解压文件。但是,如果您在尝试查看.rar
文件中的内容时遇到错误,那么很可能它是一个普通.exe
文件。
我相信还有其他方法,但这是我常用的方法,因为它非常简单。
话虽如此,您需要让 C# 做的是:
.rar
try-catch
block ,如果打开失败则给出错误消息,否则如果打开成功则给出肯定消息。如果您在更改文件格式方面需要帮助,可以查看以下内容:使用 C# 更改文件扩展名
如果您在打开文件方面需要帮助:如何在 C# 中启动文件