[英]How to distinguish between normal exe file and self-extracting file in C#?
我想检测使用 zip 工具创建的exe
文件? 像7z
或WinRAR
或 ...,我的意思是 SFX(自解压可执行文件)文件
所以我必须找到一种方法来区分C#中的普通exe
文件和SFX文件?
有什么方法可以在 C# 中检测它们吗?
我不知道其他实用程序,但来自 Nico Mak Computing 的“经典”自_winzip_
器创建了包含_winzip_
部分的可执行文件。 这些可以通过读取可执行文件的节表来检测,它是一个IMAGE_SECTION_HEADER结构数组。
要在不使用专门库的情况下访问它,您需要:
SizeOfOptionalHeader
(倒数第二个字)然后只需读取部分表(IMAGE_FILE_HEADER 结构有一个成员NumberOfSections
),并查看其中是否有任何一个名为_winzip_
。
如果您想检测自解压器,所采用的方法会有所不同,具体取决于您是要检测一组已知格式中的自解压器并具有 100% 的可靠性,还是要检测不熟悉的可靠性较低的自解压器。
(这两种方法都有其用途。例如,后者非常适合请人征求第二意见。)
选项 A 将使用与存档工具相同的方法。
自解压存档只是一个常规存档,连接到一个 EXE 文件中,并固定了偏移量。 (对于 Zip 文件,您可以使用Info-ZIP 中的zip -A
手动执行此操作),因此打开文件并扫描,寻找有效的 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
时代,或包含.cab
或.msi
包的 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 授权包含在 Microsoft C/C++ 中,是我所知道的唯一没有被释放的值得注意的扩展程序,但我相信 Open Watcom 至少可以生成他们应该生成的二进制文件放在前面。)
作为后备,解析MZ和LE 、 NE或PE标头以正确计算嵌入资源(例如图标)作为 EXE 部分的一部分,然后,如果文件超过一定百分比的“额外数据”,则很可能做一个自解压者。
您可以将.exe
格式转换为.rar
格式并双击打开(而不是解压)它以查看内容,如果您的WinRAR
或7z
设法打开它,它很可能是一个自解压文件你。 但是,如果您在尝试查看.rar
文件中的内容时遇到错误,那么它很可能是一个普通的.exe
文件。
我相信还有其他方法,但这是我常用的方法,因为它非常简单。
话虽如此,您需要让 C# 做的是:
.rar
try-catch
块,如果打开失败给出错误信息,否则如果打开成功给出肯定信息。如果您在更改文件格式方面需要帮助,可以查看此内容: 使用 C# 更改文件扩展名
如果您在打开文件时需要帮助: 如何在 C# 中启动文件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.