首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

创建自启动 ZIP 存档

2026-11-15 1 阅读 约9分钟阅读 gdgghhhhh
分享:
字号:
创建自启动 ZIP 存档 回到博客索引 简介 因此,在前几天的调试会议之后,我对早期的用户空间和 initrd 有一些想法。 Linux initramfs 支持解包 CPIO,这是一种愚蠢的、简单的、标准化的格式。在是否支持TAR的讨论中,人们非常强调CPIO的标准化和碎片化程度。幸运的是,Linux(内核)包含自己的工具来生成它碰巧实现的标准的特定变体。标准 CPIO 工具可能是 SUN 下最受诅咒的归档程序。在旧的 DOS/WinDOS 世界中,ZIP 可能是传播最广泛、最知名的存档格式,在某种程度上被 2000 年代 RAR 的兴起所取代。由于格式的设计,ZIP 适合各种多语言欺骗。回想起来,自解压 ZIP 存档是一个可以运行并解压自身的 EXE/ZIP 多语言程序,如果您没有安装存档程序,这会很有用。我认为我不需要解释我要做什么,这里是我构建的 ZIP 存档: 下载 boot.zip 这是一个完全正常的 ZIP 存档,包含从头开始构建自身所需的源代码: $ unzip -t boot.zip 存档:boot.zip 测试:boot/ZIPHEAD.COM OK 测试:boot/MESSAGE.TXT OK 测试:common/asm.h OK 测试:common/multiboot.h OK 测试:common/zip.h OK 测试: multiboot/console.c 好的测试:multiboot/console.h 好的测试:multiboot/multiboot.c 好的测试:multiboot/string.S 好的测试:setup/a20.S 好的测试:setup/a20.S 好的测试:setup/disk.S 好的测试:setup/entry16.S 好的测试:setup/entry32.S 好的测试:setup/mbload.S 好的测试:setup/mem.S 好的测试:setup/setup.ld 好的测试:util/fixhdr.c 好的测试:util/zipglue.c OK 测试:util/zippack.c OK 测试:mk.sh OK 测试:README.txt OK 测试:MESSAGE.txt OK 测试:LICENSE.txt OK 在 boot.zip 的压缩数据中未检测到错误。这里一个特别有趣的文件是 boot/ZIPHEAD.COM ,它包含启动存档时运行的可执行代码。解压后需要修复 mk.sh 的执行权限,并且需要为工具安装 Zlib 的副本。从其目录运行 mk.sh 应该会为您留下可启动 ZIP 存档的新副本。运行它的最简单方法是将其传递给 Qemu 直接内核启动: $ qemu-system-i386 -kernel boot.zip “这很简单”,您可能会说,“Qemu 支持 Multiboot,ZIPHEAD.COM 是未压缩的,位于存档的开头,并且其中有一个 Multiboot 标头!”是的,这都是真的!但这个 ZIP 存档还带有它自己的引导加载程序。您可以尝试将其放在软盘上并将其扔到 Qemu 前面: $ dd if=/dev/zero of=floppy.img count=2880 $ dd if=boot.zip of=floppy.img conv=notrunc $ qemu-system-i386 -fda floppy.img 存档的前 512 字节包含一个有效的引导扇区,该引导扇区从第二个扇区加载更多代码,然后将自身引导到highmem 启用 A20 并设置 32 位保护模式。您也可以将其放在硬盘驱动器上,它会检测从哪个 INT 13h 驱动器加载并尽职地查询磁盘几何结构。如果您愿意尝试,您也可以将其转储到真正的软盘上并将其放入 PC:顺便说一下,这是 Pentium MMX,但为了确定起见,我还尝试了 i486 DX2 和 Am386DX-40。我的 486 让我屏住了呼吸,它的软盘驱动器速度非常慢。屏幕上的文本来自文件 boot/MESSAGE.TXT “但这也没什么特别的”,您可能会回答,“ZIP 是从后面读取的,您可以将任何您想要的东西放在前面,所以您在那里放置了一个引导扇区!”遗憾的是,这不再完全正确,我会谈到这一点。但现在,让我们一起看一下该存档的前几个字节,我们将看到真正的聚会技巧: $ xxd -g 1 -l 128 boot.zip 00000000: 50 4b 03 04 0a 00 02 80 00 00 eb 44 e4 2e 41 0f PK.. .......D..A. 00000010: 01 8f 0a 09 00 00 0a 09 00 00 10 00 00 00 62 6f ....... 博 00000020: 6f 74 2f 5a 49 50 48 45 41 44 2e 43 4f 4d 00 90 ot/ZIPHEAD.COM .. 00000030: 02 b0 ad 1b 03 00 01 00 fb 4f 51 e4 30 00 10 00 .... .....OQ.0... 00000040: 00 00 10 00 bd 72 10 00 bd 72 10 00 31 03 10 00 .....r...r..1... 00000050: fa fc 31 c0 89 c4 8e d8 8e c0 8e d0 ea 61 7c 00 ..1.........a|. 00000060: 00 bf 00 06 b9 00 02 f3 aa 88 16 98 06 为 0f 7d ........................} 00000070: e8 8c 00 b8 00 f0 89 c1 50 9d 9c 58 a8 02 74 4a ........P..X..tJ ASCII P 代表 Phil (不是 Picard ),如 Phil Katz 中所示,后面跟着 03h 和 04h 。您看到的是 boot/ZIPHEAD.COM 的完全有效的 ZIP 本地文件头哦,还有 ZIP 头后面的其他字节: 02 b0 ad 1b ,如果您将它们翻转为人类字节序,它会读取 1BADB002 。这就是 Multiboot 的魔力 :-) 16 位实模式代码在 Multiboot 标头之后、偏移量 00000050 处开始。如果您感到有点困惑,文件实用程序也是如此: $ file boot.zip boot.zip
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱