Memory Slice (.msl) v1.1.0
MemDiver’s native snapshot format. Container for memory regions, module tables, process identity, VAS maps, connection tables, handle tables, key hints, and provenance metadata with BLAKE3 integrity chaining.
Design goals
Streaming-friendly — writers finalize a BLAKE3 file hash without rewinding.
Compression-agnostic — each block carries its own codec (
none,zstd,lz4) via flag bits.Forward-compatible — unknown block types fall back to
GenericBlock.Integrity-first — each block carries a BLAKE3 of the previous block, producing a per-file hash chain finalized in
END_OF_CAPTURE.
Constants
Constant |
Value |
Where |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File header (64 bytes)
Layout verified against msl/reader.py:90-122.
Offset |
Size |
Field |
Notes |
|---|---|---|---|
0x00 |
8 |
magic |
|
0x08 |
1 |
endianness |
|
0x09 |
1 |
header_size |
declared header length (64 or 128) |
0x0A |
2 |
version |
uint16; |
0x0C |
4 |
flags |
|
0x10 |
8 |
cap_bitmap |
capability bitmap |
0x18 |
16 |
dump_uuid |
UUID |
0x28 |
8 |
timestamp_ns |
nanoseconds since epoch |
0x30 |
2 |
os_type |
|
0x32 |
2 |
arch_type |
|
0x34 |
4 |
pid |
process ID |
0x38 |
1 |
clock_source |
clock-source identifier |
0x39..0x3F |
7 |
reserved |
zero-filled |
Setting the ENCRYPTED flag bit causes MslReader to raise MslEncryptedError.
Block header (80 bytes)
Layout verified against msl/reader.py:124-139.
Offset |
Size |
Field |
Notes |
|---|---|---|---|
0x00 |
4 |
magic |
|
0x04 |
2 |
block_type |
|
0x06 |
2 |
flags |
|
0x08 |
4 |
block_length |
total block length on disk (header + payload) |
0x0C |
2 |
payload_version |
per-block schema version |
0x0E |
2 |
padding / reserved |
zero-filled |
0x10 |
16 |
block_uuid |
UUID |
0x20 |
16 |
parent_uuid |
UUID of referenced parent block (optional) |
0x30 |
32 |
prev_hash |
BLAKE3 of the previous block on disk; finalized in |
Compression is encoded in flags, not in a dedicated codec field:
|
Meaning |
|---|---|
|
payload is compressed |
|
zstd |
|
lz4 |
|
block contains / references key hints |
|
block has child blocks |
|
fragment of a larger logical block; merged by |
Block type registry (spec Table 9)
Source: msl/enums.py:27-51.
Code |
Name |
Notes |
|---|---|---|
|
|
sentinel |
|
|
primary payload — bytes + metadata |
|
|
loaded module record |
|
|
index of module entries |
|
|
per-thread register snapshot |
|
|
open-file-descriptor entry |
|
|
socket / endpoint entry |
|
|
process environment variables |
|
|
OS security token / capability |
|
|
decrypted / inferred key material |
|
|
records conversion from a legacy |
|
|
PID / UID / command line |
|
|
reference to a sibling |
|
|
global kernel / system snapshot |
|
|
system process list |
|
|
system connection list |
|
|
kernel-object handle entries |
|
|
routing / ARP / socket-family aggregate |
|
|
finalizes the file-level BLAKE3 chain |
|
|
virtual-address-space map overlay |
|
|
RESERVED — no producer; see |
Unknown block-type codes are preserved verbatim as GenericBlock so future spec revisions remain readable by older readers.
Note
Kaitai Struct is used only for foreign binaries (ELF, PE, Mach-O) under core/binary_formats/kaitai_compiled/. The .msl format itself is hand-rolled, with MslReader / MslWriter as the reference implementations.