如何使用二进制签名来识别WinRAR自解压缩文件?

3
我正在寻找一个类似于这个问题中的答案,但是针对WinRAR而不是7zip。本质上,我想要一种权威签名,至少可以说“所有使用版本420中的默认SFX文件创建的WinRAR生成的自解压可执行文件,在位置0x00027400处将具有字节0x15、0xa1、0x45、0xcc、0x21、0x98,其他非SFX文件不太可能具有此签名”。更好的是,如果相同的签名可以在所有版本的WinRAR SFX文件中找到,即使它们位于不同的位置也可以。

由于SFX的工作性质,它们将非常相似,除了文件的存档部分,但有些字符串会成为较差的标识符(例如,“此程序无法在DOS模式下运行”存在于每个SFX中,但它也存在于大多数其他Windows可执行文件中)

目前,我确定签名的方法是查看各种版本的WinRAR SFX,并查找所有文件都具有共同点的4或6个字节序列。不幸的是,这样的序列很多,很难选择一个。


2
  1. 7-zip是开源的;
  2. 它可以“解压”东西;
  3. 剩下的你也能猜到 :) 你还可以查看UnRAR.dll源代码
- Aleksei Zabrodskii
好的建议,我会查看一下。但是在这种情况下,我不是要解压缩任何文件,而是试图确定整个文件是否为自解压可执行文件,而不是RAR文件。我想类似的逻辑应该存在于7z源代码中的某个地方,尽管有时并不容易找到。 - Rollie
我相信UnRAR.dll会检查文件是否真的是RAR存档(即使是SFX),而不是仅仅尝试解压缩随机的2 GiB文件。不管怎样,我在这里只能猜测,希望其他人能给出更具体的信息。祝好运 :) - Aleksei Zabrodskii
看起来它只是通过前0x100000个字节并尝试找到RAR文件的签名。我希望避免这样做,但这可能是一个更强大的解决方案。我不指望在这个问题上得到更好的答案 - 随意提供一个类似的答案,我会接受的。 - Rollie
我发现的是,在使用Windows XP中的4.20(x86)创建的两个SFX存档中,RAR.SFX从字节83131开始。不确定普通RAR文件是否也是如此。 - Aleksei Zabrodskii
似乎所有普通的RAR存档都以“Rar!”开头。我相信,在SFX存档中,SFX模块之后的第一件事是“RAR.SFX”。(当然,所有内容都是ASCII格式的。) - Aleksei Zabrodskii
2个回答

2

从WinRAR安装文件夹中的中:

  1. 要处理SFX归档文件,您需要跳过在归档文件中搜索标记块的SFX模块。在SFX模块本身中没有标记块序列(0x52 0x61 0x72 0x21 0x1a 0x07 0x00)。

正如您自己指出的那样:unrar源代码在中有读取文件的代码。 SFX部分的最大大小永远不会超过中定义的数字:

#define  MAXSFXSIZE        0x100000

0

如果我理解正确,您想查找一个文件并查看它是否是使用WinRAR构建的有效SFX文件,对吗?

在这种情况下,您应该查找以下PE签名(尚未尝试过,但它们在底部链接的PE sig DB中列出):

WinRAR-SFX=80E9A1C1C11368E4167546C1C1055EEB019D6864863746EB028CE05FF7D0 WinRAR-SFX=EB0102EB02CD20B880

只需获取入口点并查看这些字节是否按正确顺序跟随即可。PE签名的详细列表可在http://tot-ltd.org/packer.db上找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接