Mac上的DMG文件从根本上来说,是一个disk image的container。它可以对数据进行了分块、压缩、加密等。
而刻录光盘用的".iso"或".img"文件,则和数据流直接对应。
DMG文件的末尾0x200个字节是一个简称为kylo的数据结构。这个结构中标明了一个plist文件内容的存储位置。通过这个plist文件的内容,可以知道具体数据块(data block)的位置。
set schema {
{a4 signature : "kylo"}
{I version}
{I hsize : "header length. 512 bytes"}
{I flags}
{W runningDataForkOffset}
{W dataForkOffset}
{W dataForkLength}
{W rsrcForkOffset}
{W rsrcForkLength}
{I iSegment}
{I nSegment}
{a16 idSegment - "128-bit number like GUID, but seems not a OSF GUID"}
{a136 dataForkChecksum -}
{W xmlForkOffset : "plist File offset"}
{W xmlForkLength}
{a120 - - "reserved! Good for store data"}
{a136 masterChecksum -}
{I imgVariant}
{I nSector}
{I - - "reserved"}
{I - - "reserved"}
{I - - "reserved"}
}
set file "mac.dmg"
hexdump::open $file
set values [hexdump::struct $schema -0x200 end]
hexdump::print_struct $schema $values
hexdump::close