我想要检测用压缩工具创建的exe
文件?像7z
或WinRAR
或...,我指的是SFX (自解压可执行文件)文件
所以我必须找到一种方法来区分C#中的普通exe
文件和SFX文件?
有什么方法可以在C#中检测到它们吗?
发布于 2019-10-23 23:56:05
我不知道其他实用程序,但是Nico Mak Computing的“经典”自解压程序创建了包含_winzip_
部分的可执行文件。可以通过读取可执行文件的节表来检测它们,可执行文件是一个IMAGE_SECTION_HEADER结构数组。
要在不使用专用库的情况下访问它,您需要:
SizeOfOptionalHeader
(倒数第二个单词)(倒数第二个单词)<>H218
该流现在指向节表
然后,只需读取区段表( IMAGE_FILE_HEADER结构有一个成员NumberOfSections
),并查看其中是否有名为_winzip_
的成员。
发布于 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应用程序,这也可能会捕获它们,因为它们也使用“存根和连接在一起的东西”结构。)
最可靠的解决方案是将这两种方法结合起来:
.cab
要为DPMI可执行文件创建测试文件,只需编译"Hello,World!“使用djgpp (Linux)和Open Watcom C/C++ (1.9、2.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.
发布于 2017-01-17 14:45:01
您可以将.exe
格式转换为.rar
格式,然后双击以打开(而不是提取)它来查看内容,如果您的WinRAR
或7z
设法为您打开它,那么它很可能是一个自解压文件。但是,如果您在尝试查看.rar
文件中的内容时出错,那么它很可能是一个普通的.exe
文件。
我相信还有其他方法,但这是我常用的方法,因为它很简单。
话虽如此,您需要让C#做的是:
使用.rar
try-catch
block up文件,如果无法打开,则给出错误消息;否则,如果打开成功,则给出肯定消息。如果您需要有关更改文件格式的帮助,您可以查看以下内容:Change File Extension Using C#
如果您需要打开该文件的帮助:How do I launch files in C#
https://stackoverflow.com/questions/41689165
复制相似问题