TheBinary:哈希自指通用二进制程序

这个标题很长,其实是两个有意思的东西拼接起来:

  1. 通用二进制程序:通过设计二进制内的header、code段结构,让不同系统、不同架构、不同解析器能够运行同一个二进制程序。
  2. 哈希自指(Hashquine):一种能够输出自身Hash值的程序。

本项目就是想要把二者结合起来,做出一个能够在复数个平台上运行的单一程序,输出自身的Hash。但仅仅这样,其实还不够有趣,因此再引入其他约束:

  • 预知,二进制内预先以某种方式保存自身Hash。
  • 精简,维持二进制体积在一个较小的尺寸上。
  • 复用,不允许程序内出现多个Hash值副本,有且仅有一个数据源。

哈希自指通用二进制程序-1790649939221.webp图 1 运行效果展示


通用二进制构建

这实际上是一个筛选与决策的过程,在头脑风暴找到的运行环境上分析比较其对于可执行文件格式的假设,寻找出一个能够同时满足尽可能多环境要求的二进制格式,在其上构建stdio输出。

当前构件的空间布局

下面按文件内的实际偏移展示这份 1 MiB 构件。有色部分是已保留区域,底色是可用空档;各格式可以复用同一字节,因此下面的区域条不能相加。

1 MiB 文件空间地图

已保留 800.1 KiB(78.13%) · 可用空档 224.0 KiB(21.87%)

实际空间占用底色为可用空档
0256 KiB512 KiB768 KiB1024 KiB
主要区域 · 每行使用同一横轴
引导 / 目录 / 小入口0–177 KiB,分散
UEFI · 6 个文件簇x64、ARM64、IA32、ARM32、RISC-V64、LoongArch64
Mach-O · 2 个片段98–120 KiB
ONNX 自读取图180–275 KiB · 95.5 KiB
UDF 描述符与目录320–598 KiB,分散
Core ML424–508 KiB · 84 KiB 槽
ONNX 完整前缀图602–942 KiB · 含权重 bank
↳ 共享权重 bank604–860 KiB · 256 KiB
ZIP / 备份 GPT964–1024 KiB · 文件尾部

所有条共用同一横轴。最大连续可用空档为 62 KiB;ONNX 图与权重 bank 等区域存在有意重叠。