我有一个旧的“Win32 Cabinet Self-Extractor”文件(*.exe 扩展名),我想对其进行一些小的修改。
我不知道原始文件来自哪里或是谁制作的,但可以在 7-Zip 中打开该文件并至少查看其内容。
此自解压安装程序的目的是在 PCIe 设备上安装一段固件。
档案库中的一个文件需要稍微修改一下,在最开始处插入一小段二进制序列(一个序列号,8 个字节长),将文件长度增加 8 个字节。然后我想保存更改并退出档案库,这样新文件就可以代替旧文件了。我不会更改档案库中的任何文件名。
我正在使用 Windows 7,而 7-Zip 拒绝让我就地更改文件(也许并不奇怪),说它是“只读的”(根据资源管理器,该 exe 不是只读的)。
有没有什么办法可以实现这个目标?
不幸的是,我无法上传该文件,因为它包含专有公司信息。
答案1
您需要先将 CAB 中的所有文件提取到某个文件夹中。这可以通过 7-Zip 或其他实用程序完成,也可以通过 Windows 实用程序完成expand
:
Expand mycab.cab -F:* C:\myfolder
然后,您可以修改文件夹内的文件C:\myfolder
,然后使用 Windows 实用程序重新压缩它
出租车:
makecab /f filename.ddf
指令文件(.ddf)如下所示:
.Set CabinetNameTemplate=mycab.cab
.Set SourceDir=C:\myfolder
.Set Cabinet=on
.Set Compress=on
"file1name.txt"
"file2name.txt"
有关 DDF 文件的更多信息,请参阅文章 MAKECAB 指令文件语法。
完整的 Microsoft 用户指南可在 Microsoft MakeCAB 用户指南。
答案2
您不能这样做。里面的文件是压缩的,无法修改。如果您这样做,存档将被损坏。解压缩文件的能力是整个存档内容所独有的。您需要提取文件,进行任何修改,然后重新创建存档。
我已经很多年没有使用过任何 CAB 创建工具了。它们可能会让你这样做。然而,它们只是执行上述步骤。
答案3
有一种类似于 harrymc 的优秀答案的方法,我认为是一种更快、更简单的方法,如果你至少有初级的Visual Studio 和 C# 技能。另外,harrymc 的回答没有涵盖最后需要将 EXE 头文件放在 CAB 前面以使其自解压的部分。我已将其包含在此处。
第 1 部分:创建 CAB 文件,用修改后的二进制文件替换原始文件。请参阅我对这个问题的回答: https://stackoverflow.com/questions/1939639/c-net-creating-a-cab-and-adding-files-to-it-without-an-external-library 大致步骤如下:* 使用 7Zip 或 Expand 命令将当前 CAB 文件解压到文件夹,例如 C:\MyOriginal\CabfileExtractDir\。* 用具有正确序列号的修改后的二进制文件替换此文件夹中的原始二进制文件。* 按照我的回答中的详细说明运行 CabMaker 程序(免费,在 GitHub 上),以获取包含更改文件的 CAB 文件。CabMaker 在内部使用“MakeCab”程序。请注意,CabMaker 会为您处理 DDF 文件创建任务。* 在 CabMaker 中,您需要提供 C:\MyOriginal\CabfileExtractDir 作为源文件夹,提供 C:\MyEditedCabFile 作为目标文件夹,并提供“MyModifiedFirmwareInstaller.cab”之类的内容作为目标文件名,然后单击“制作 CAB”。
第 2 部分:使您的 CAB 文件成为自解压可执行文件。 * 在此处查看文档。 https://docs.microsoft.com/en-us/previous-versions/bb417343(v=msdn.10)?redirectedfrom=MSDN#microsoftmakecabusersguide 适合您情况的相关部分是……
C:\> copy /b "%windir%\system32\extrac32.exe"+"C:\MyEditedCabFile\MyModifiedFirmwareInstaller.cab" "C:\MyEditedCabFile\MyModifiedFirmwareInstaller.exe"
C:\> del /q /f "MyModifiedFirmwareInstaller.cab"
附录 - 迈向更完全自动化的过程 在查看过程并获取 DDF 文件后,您可能可以自动化整个过程,无需使用 CabMaker,而是使用底层 MakeCab 命令行和 DDF,并将其全部改编为批处理文件脚本,在其中参数化序列号和编辑二进制文件。这超出了本文的范围,但很有可能。