IronView is a Python desktop application for inspecting binaries on Linux.
It combines four pieces:
libbfdfor section metadata and raw section bytesPySide6for the Qt GUIradare2throughr2pipefor disassembly and function discovery- optional
Ghidrafor external GUI work and headless analysis reports - GNU toolchain helpers like
addr2line,c++filt,nm,readelf, andgdb
The project supports both GUI and CLI workflows.
- Open a binary and inspect section metadata
- Detect whether the loaded binary is
ELF,PE/COFF, orMach-O - Preview raw section bytes as formatted hex
- Export the selected section to disk
- Filter sections by name, index, size, or address
- Preview section-level radare2 disassembly
- Browse radare2-discovered functions
- Browse radare2-discovered strings
- Browse radare2 imports
- Browse radare2 exports
- Browse radare2 relocations
- Browse radare2 symbols across
ELF,PE/COFF, andMach-O - Inspect radare2 function CFGs
- Filter functions by name, address, type, or signature
- Filter strings by value, address, section, or type
- Filter imports by name, PLT address, bind, or type
- Filter symbols by raw name, demangled name, address, or type
- Preview full function disassembly for a selected function
- Preview a function-level HLL-style view through radare2 decompilation backends with fallback across
pdg,pdd, andpdc - Track HLL backend metadata, fallback state, warnings, and line/address correlations when radare2 exposes them
- Select and reload HLL backends from the GUI, and click correlated HLL lines to jump into disassembly
- Toggle
Clean HLLmode to switch between raw backend output and IronView's cleaned presentation - Review correlated HLL context for functions, imports, strings, and symbols, then jump into those panes directly
- Follow inline semantic HLL links for matched functions, imports, strings, and symbols when the rendered text is unambiguous
- Review HLL call summaries and extracted argument/local declarations alongside the decompiled text
- Prefer backend JSON for HLL calls and declarations when available, with text parsing as a fallback
- Collapse common import-thunk, static-registration, fini-teardown, stack-canary, stack-probe, scoped-stack-object, and leading temp-declaration boilerplate in
Clean HLLmode - Click jump and call targets directly from section and function disassembly
- Inspect xrefs to selected strings and jump from xrefs into functions
- Inspect callers of imported functions and jump from callers into functions
- Correlate exports and relocations to loaded symbols, imports, and functions when possible
- Inspect xrefs to selected exports and relocations and jump from those xrefs into functions
- Resolve demangled names with
c++filt - Resolve source locations with
addr2linefor ELF binaries when debug data is available - Inspect cross-format binary metadata and linked libraries for
ELF,PE/COFF, andMach-O - Launch
Ghidrafrom the GUI - Run an in-app
Ghidraheadless analysis report for the loaded binary - Switch between light and dark themes
- View a bottom system console with runtime events and analysis activity
- Run Linux shell commands from the bottom console
- Collapse and restore the browser and console panes from the
Viewmenu - Launch
codexin an external terminal from the GUI - Launch
gdbin an external terminal for the current binary
- Python
3.14+ uv- A working
libbfdshared library on the host radare2available inPATH- The current documented and locally verified baseline is
radare2 6.1.1 - optional radare2 decompiler plugins such as
r2ghidra(pdg) orr2dec(pdd) for richer HLL output - optional
GhidrawithghidraandanalyzeHeadlessavailable for GUI launch and headless reports - GNU userland tools:
addr2line,c++filt,nm,readelf, and optionallygdb - A Linux desktop session for the GUI
Project dependencies are managed in pyproject.toml.
From the project root:
cd /home/gary/PycharmProjects/IronView
uv syncIf the project environment does not exist yet, uv sync will create it and install:
PySide6pytestr2pipe
The app is currently developed and documented against radare2 6.1.1.
Launch the GUI:
cd /home/gary/PycharmProjects/IronView
uv run python -m src.mainLaunch the GUI with a binary preloaded:
uv run python -m src.main --gui /bin/lsRun the CLI JSON output mode:
uv run python -m src.main /bin/lsDump one section as hex in CLI mode:
uv run python -m src.main /bin/ls --section .text- Start the app.
- Open a binary with
Ctrl+Oor theOpen Binarybutton. - Use the
Sectionspane to inspect raw sections. - Use the lower browser tabs for
Functions,Strings,Imports,Exports,Relocations, andSymbols. - Switch between the
Section,Function,String,Import,Export,Relocation,Symbol, andBinaryinspector tabs on the right. - Use the
HexandDisassemblytabs inside the section inspector for byte and instruction views, and click linked jump or call targets to navigate. - Select a string to load xrefs, then double-click an xref row to jump to the referenced function when available.
- Select an import to load callers, then double-click a caller row to jump to the referenced function when available.
- Select an export or relocation to load correlated context and xrefs.
- Double-click an export or relocation row to jump toward the matching symbol, import, or function when available.
- Double-click an export or relocation xref row to jump to the referenced function when available.
- Select a function or symbol to load demangling and, for ELF binaries, source-location metadata.
- Use the
HLLsub-tab inside the function inspector to review the best available radare2 decompilation backend output, switch backends, reload the HLL view, and toggleClean HLLon or off. - Click correlated HLL line links to jump into function disassembly when address mappings are available.
- Use the HLL context table to jump into matched functions, imports, strings, and symbols referenced by the decompiled output.
- Click inline HLL semantic links to jump into matched functions, imports, strings, and symbols when available.
- Keep
Clean HLLenabled for a shortened view that removes common radare2/plugin boilerplate such as import thunks, constructor registration, fini teardown, stack-canary scaffolding, stack probes, and decompiler scratch-variable declaration walls. - Use the HLL call summary and declarations view to review inferred callees, arguments, and locals.
- Use the
CFGsub-tab inside the function inspector to review basic blocks and click a block to jump into disassembly. - Use the
Binarytab to inspect the current binary through a radare2-backed metadata report and linked-library view. - Use the bottom
System Consoleto watch loads, exports, errors, and analysis activity. - Enter Linux commands in the console input and run them in the project directory.
- Use
View > Show BrowserandView > Show Consoleto reclaim space when focusing on HLL, disassembly, or CFG work. - Use
View > Reset Layoutif a splitter gets dragged into an awkward state; the browser, inspector, HLL, and console panes all restore to their default proportions. - Use
Run Codexto launchcodexin an external terminal with a real TTY. - Use
Run GDBto launchgdbfor the current binary in an external terminal. - Use
Launch Ghidrato open the external Ghidra GUI, orRun Headless Analysisin theBinarytab to collect a Ghidra report inside IronView.
src/main.py currently behaves like this:
- No positional
path: launch the Qt GUI pathonly: print JSON with path, file format, format detail, architecture size, and sectionspath --section NAME: print the section bytes as hex--gui [path]: force GUI mode
Implementation details are documented in docs/architecture.md.
At a high level:
src/binary_loader.pywrapslibbfdsrc/disassembler.pywrapsradare2src/ghidra_toolchain.pywraps optionalGhidralaunch and headless analysissrc/gnu_toolchain.pywraps GNU binutils helperssrc/gui.pyimplements the Qt applicationsrc/main.pyis the CLI/GUI entrypoint
Run the test suite:
cd /home/gary/PycharmProjects/IronView
QT_QPA_PLATFORM=offscreen uv run pytestRun a syntax check:
python3 -m py_compile src/ghidra_toolchain.py src/gnu_toolchain.py src/disassembler.py src/gui.py src/main.py src/binary_loader.py src/test_main.py- The app is currently Linux-oriented.
libbfdmust be available at runtime or section loading will fail.- radare2 is used for read-only analysis only.
ELFis the most complete format today.PE/COFFandMach-Ocurrently use thelibbfdand radare2 paths, while GNUaddr2linesource lookup remains intentionally disabled for them.- Source mapping depends on debug info being present in or reachable from the binary.
- The current radare2 integration covers sections, strings, imports, exports, relocations, symbols, functions, xrefs/callers, disassembly, HLL-style output through
pdg/pdd/pdcfallback,Clean HLLrendering heuristics, and first-pass CFG views. - The current Ghidra integration is intentionally shallow: external GUI launch plus on-demand headless report collection.
Clean HLLis a presentation layer. It improves readability by collapsing decompiler scratch locals, thunk boilerplate, stack scaffolding, and similar noise, but it does not replace a real source-level decompiler or guarantee semantically correct rewrites.