解包 NSISbi 压缩数据

逆向工程 开箱
2021-07-02 19:10:08

我试图弄清楚如何解压缩NSISbi为 NSIS制作的有效载荷数据,以增加对安装程序大小 > 2GB 的支持。这是一个安装程序示例:https : //download.unity3d.com/download_unity/068178b99f32/Windows64EditorInstaller/UnitySetup64-2020.2.2f1.exe

以下是 vanilla NSIS 和 NSISbi 之间有效载荷的小例子:https ://www.dropbox.com/sh/jn4iyppbj1v8fmf/AAAsqlymn8AHgYhSPAG9iU7Ka ? dl =1

7zip 曾经在 NSIS 和 fork 上工作,但它无法打开这个。到目前为止,我已经想通了,有在签名匹配的一些变化: 30000000EFBEADDE4E756C6C736F6674496E73740 ï¾­ÞNullsoftInst)和有效载荷大小签字后到来(跳过4个字节)现在不再INT32但Int64的(因为它是一个原生的int具有更大的地址支持): 在此处输入图片说明

30 00 00 00仅对有效负载进行这些更改(从签名和额外字节中删除额外的有效负载大小),7zip 就能够部分打开 zlip/blip/lzma 压缩数据,但许多条目丢失,一些名称损坏。

1个回答

感谢您使用 nsisbi,这是我的 nsis 分支。两者的源代码都可用,但您要查找的大部分内容都在“Source\exehead\fileform.h”中,我将对其进行总结。

第一个标头有一个标志 int32,我添加了额外的标志来指定在编译时配置的内容,以便更容易反编译。在您的示例中看到“NullsoftInst”这个词了吗?这些是第一个标头的 int32 3、4 和 5。标志是第一个 int32,第二个 int 是签名 (0xDEADBEEF),由于您的十六进制转储中的字节顺序,它是向后的。int32 6 是主头的长度,int32 7 是包括第一个头、数据块和最后的crc在内的所有后续数据的长度。

第一个标头长 8 个字节,因为它存储外部文件数据块的总长度。我只是将它附加到现有的 7 个 int32 的末尾(低 4 个字节在前,高 4 个字节在后)。

对于指令字段,大小已增加到 8 个 int32,而不是 6 个。对于文件偏移量,我只是在现有的 int32(现在是低部分)之后插入了高 int32 部分,这意味着字段向下移动了一个int32(这是 nsisbi 中的一个固定标志,它始终处于开启状态)。此外,大多数存储数据的指令也使用 crc32 值的插槽,在大多数情况下,我将其附加到末尾(writeuninstaller 指令有 2 个 crc)。

在 7208 中,我添加了对大于 2GB 的文件的支持,这意味着数据块中的“第一个 int”在由 C\C++ 编译器编译时大小不同(int32 或 int64)。我在标题中为此添加了一个标志。这在 7208 及更高版本中默认开启(在以前的版本中它总是 int32)。

希望这会有所帮助,JasonFriday13。