dwarffi is a Python library for parsing ISF files and providing an interface to access kernel symbols and types.
Project description
dwarffi
A debug-symbol-powered type interface for Python.
dwarffi lets you interact with real-world memory layouts using
Intermediate Symbol Files (ISF)—portable JSON representations of compiled type information.
It provides a CFFI-like experience without requiring header files: instead, it uses the
structures as they exist in the compiled binary’s debug data.
ISF files encode the exact memory layout (offsets, padding, alignment, bitfields, pointer size, endianness) as defined by the toolchain and target architecture.
- Linux / embedded workflows: ISF generated from DWARF in ELF binaries (e.g., via
dwarf2json). - Windows workflows: ISF generated from PDB symbols (e.g., Volatility3-style Windows ISFs generated from PDBs).
- MacOS / Mach-O workflows: ISF generated from DWARF in Mach-O binaries.
Read more about dwarf2json and ISF in the dwarf2json README.
For Windows ISF context, see Volatility3.
You can also find many symbol tables in ISF format on Volatility3's symbols repository.
🚀 Features
- ISF-Native: No header rewriting. Point to a
.jsonor.json.xzISF file and use types immediately. - Cross-Platform Symbols:
- DWARF-backed ISFs (common on Linux/ELF, embedded targets)
- PDB-backed ISFs (common for Windows kernel/user-mode analysis toolchains)
- Architecture & ABI Aware: Handles big-endian and little-endian layouts transparently, respects pointer width and packing.
- Dynamic
cdef: Compile C code on the fly to generate types, with automatic debug-type retention to prevent compilers from stripping unused definitions. - Recursive Typedef Handling: Automatic resolution and decay of typedef chains.
- C-Style Magic:
- Pointer arithmetic (
ptr + 5) - Pointer subtraction (
ptr2 - ptr1) - Array slicing (
arr[1:5]) - Deep struct initialization via nested dictionaries
- Pointer arithmetic (
- Safety Semantics:
- Automatic bit-masking
- Sign extension
- C-style integer overflow/underflow behavior
- Anonymous Struct/Union Flattening: Access anonymous union members directly (ideal for register maps).
- ISF Export Support: Save dynamically generated ISFs to
.jsonor.json.xz. - Introspection Utilities:
inspect_layout()for pahole-style field offsets/paddingpretty_print()andto_dict()for human-readable / JSON-friendly inspection of instances
📦 Installation
pip install dwarffi
Requirements for cdef()
To use dynamic compilation:
- A C compiler (
gcc,clang, or cross-compiler) dwarf2jsonavailable in your PATH
NOTE: Some compilers may optimize away unused debug types. For example, with gcc, use:
-fno-eliminate-unused-debug-types.
🛠️ Quick Start
1️⃣ CFFI-style cdef
from dwarffi import DFFI
ffi = DFFI()
ffi.cdef("""
struct sensor_data {
uint32_t timestamp;
int16_t readings[3];
uint8_t status;
};
""")
sensor = ffi.new("struct sensor_data", {
"timestamp": 1234567,
"readings": [10, -5, 20],
"status": 0x01
})
print(f"Bytes: {ffi.to_bytes(sensor).hex()}")
print(f"Reading[1]: {sensor.readings[1]}") # -5
2️⃣ Load an ISF (Linux/ELF DWARF)
from dwarffi import DFFI
# Accepts .json or .json.xz
ffi = DFFI("vmlinux_isf.json.xz")
task = ffi.typeof("struct task_struct")
print("task_struct sizeof:", ffi.sizeof(task))
ffi.inspect_layout("struct task_struct")
3️⃣ Load an ISF (Windows PDB-derived / Volatility-style)
from dwarffi import DFFI
# Volatility-style Windows symbols are typically .json.xz ISFs
ffi = DFFI("ntkrnlmp.pdb/<GUID>-<AGE>.json.xz")
le = ffi.typeof("struct _LIST_ENTRY")
buf = bytearray(ffi.sizeof(le))
inst = ffi.from_buffer("struct _LIST_ENTRY", buf)
inst.Flink = 0x1122334455667788
inst.Blink = 0x8877665544332211
print(ffi.pretty_print(inst))
print(ffi.to_dict(inst))
ffi.inspect_layout("struct _UNICODE_STRING")
🧩 Advanced Usage
Anonymous Unions
ffi.cdef("""
struct reg_map {
union {
uint32_t ALL;
struct {
uint16_t LOW;
uint16_t HIGH;
};
};
};
""")
reg = ffi.new("struct reg_map")
reg.ALL = 0x12345678
print(hex(reg.HIGH)) # 0x1234
Pointer Arithmetic
ptr = ffi.cast("int *", 0x4000)
next_ptr = ptr + 1
print(hex(next_ptr.address))
⚙️ How It Works
dwarffi operates in three phases:
1. Parsing
Loads one or more ISF files (.json or .json.xz) that represent a compiled type tree
(e.g., derived from DWARF or PDB symbols).
2. Type Synthesis
Builds Python representations of:
- Base types
- Structs / unions
- Enums
- Typedef chains
- Arrays
- Pointers
- Bitfields
3. Memory Mapping
Uses Python’s struct.pack / struct.unpack to:
- Convert Python integers into architecture-accurate byte layouts
- Apply endianness rules and pointer size
- Respect alignment, padding, and bitfield masks
Instances are bound views into bytearray buffers. Field access directly
reads/writes into the underlying buffer.
📚 Core API Reference
DFFI(path: str | Path | dict | None = None)
Create an empty instance or load an ISF (from a dict, .json, or .json.xz).
cdef(source, compiler="gcc", save_isf_to=None)
Compile C source → DWARF → ISF → load into current FFI.
new(ctype, init=None)
Allocate a new instance of a C type.
from_buffer(ctype, buffer)
Bind a type to existing memory.
sizeof(ctype)
Return size in bytes.
offsetof(ctype, field)
Return byte offset of a field.
cast(ctype, value)
Reinterpret memory or create pointer instances.
addressof(instance)
Return pointer to instance.
inspect_layout(ctype)
Print pahole-style offsets and padding.
pretty_print(cdata)
Recursively format bound instances/arrays/pointers as a readable tree.
to_dict(cdata)
Convert bound instances/arrays/pointers to Python-native structures.
🤝 Contributing
Contributions are welcome!
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dwarffi-0.0.7.tar.gz.
File metadata
- Download URL: dwarffi-0.0.7.tar.gz
- Upload date:
- Size: 53.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2cd7e52998e6ee4a81adfab08642c5b409ba85a091657351aab0edc47a76c4a9
|
|
| MD5 |
d45e855c532011a5613777490a6cff21
|
|
| BLAKE2b-256 |
9b9678fda6f6d1b530bb7d1b5f80c5f0711b39a06624dd098118e0c82acfb47e
|
Provenance
The following attestation bundles were made for dwarffi-0.0.7.tar.gz:
Publisher:
publish.yml on rehosting/dwarffi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dwarffi-0.0.7.tar.gz -
Subject digest:
2cd7e52998e6ee4a81adfab08642c5b409ba85a091657351aab0edc47a76c4a9 - Sigstore transparency entry: 991659682
- Sigstore integration time:
-
Permalink:
rehosting/dwarffi@6d0f0f56b719bc0b6410e0166c3e2cde7476bf80 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rehosting
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6d0f0f56b719bc0b6410e0166c3e2cde7476bf80 -
Trigger Event:
push
-
Statement type:
File details
Details for the file dwarffi-0.0.7-py3-none-any.whl.
File metadata
- Download URL: dwarffi-0.0.7-py3-none-any.whl
- Upload date:
- Size: 27.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
abfa983c36d9af204ff4a2beab33268249c2d3b9e6ad61dab492679ab4d15bbb
|
|
| MD5 |
3029f05d7271edb98846a1022ab39a45
|
|
| BLAKE2b-256 |
8653f1caa9d49cf39aa29c7a86e3dd71ddca9d683dd17f9edc6f621122f421c4
|
Provenance
The following attestation bundles were made for dwarffi-0.0.7-py3-none-any.whl:
Publisher:
publish.yml on rehosting/dwarffi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dwarffi-0.0.7-py3-none-any.whl -
Subject digest:
abfa983c36d9af204ff4a2beab33268249c2d3b9e6ad61dab492679ab4d15bbb - Sigstore transparency entry: 991659689
- Sigstore integration time:
-
Permalink:
rehosting/dwarffi@6d0f0f56b719bc0b6410e0166c3e2cde7476bf80 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rehosting
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6d0f0f56b719bc0b6410e0166c3e2cde7476bf80 -
Trigger Event:
push
-
Statement type: