Repository navigation
Releases: IR0NBYTE/Jadart
Release list
Jadart 1.2.0
Jadart 1.2.0: addresses you can paste into IDA, Ghidra, radare2 and Frida, and two new commands to take you there.
New
jadart symbolsexports every function's name, virtual address and recorded bounds as a table, JSON, or a script for radare2, Ghidra or IDA. The script checks it is running against the right binary before naming anything. On the clean fixture, radare2 alone finds 6,707 of 8,194 function starts and runs 652 functions past their end; with the script it finds all 8,194 and runs none past their end.jadart hookwrites an observation-only Frida script for one Android arm64 function. It hooks the right entry address and reads arguments from where that Dart release and function kind put them.xrefs FILE KIND PATTERNwithstring,poolorfunction, plus--exactand--class. The 1.1.0 form still works.
Changed output: read before upgrading scripts
- Every printed address is a virtual address (
_kDartIsolateSnapshotInstructions+ pc_offset), not.text+0x... A bare number you pass in is read as a virtual address when it falls inside the image;.text+,isolate+and+keep the old reading. - A function with no name is labelled
sub_0x<va>, and every command that takes a function accepts that label. - A bug in jadart exits 3, with
"internal": trueunder-j. Bad input still exits 1 or 2. verifyprints two lines on a pass;-vprints every gate.xrefson a string lists only pool entries some code loads directly. 1.1.0 also listed matches with no direct load, so counts drop (1,444 to 1,113 foreon the clean fixture) and a pattern that only such entries match now exits 1. #62 tracks reporting how many were left out.- From Python, a missing path raises
jadart.InputError(aJadartError) instead ofFileNotFoundError. - The
--jsonshape is unchanged and only gains fields (va,target_va,anchor,address_rule).
arm32 fixes
- Tier 2 ends a block where a function returns (
pop {fp, pc},bx lrand the conditional forms), sodecompile -t 2no longer shows code running after a return. - Conditional calls (
blls,bleq,blne) are in the call graph and named in tier 2, and every branch and call target prints as an address.
Also
- Faster:
functionsis about twice as fast, andxrefson a pool entry reads instruction words instead of disassembling the whole image. - Hardened: a crafted file always raises a typed error, never an untyped exception. Its readers are bounded, and
exportkeeps every path inside its output directory on Windows too. A bad--sigsfile is an input error. - Fully stripped
.sofiles parse, and output is UTF-8 on any console. - An agent skill installs from
skills/flutter-reverse-engineering/.
Install from source:
git clone https://github.com/IR0NBYTE/Jadart.git
pip install './Jadart/framework[disasm]'
Every change, with the measurements, is in CHANGELOG.md.
Jadart 1.1.0
First public cut of Jadart, a decompiler for Flutter/Dart AOT snapshots.
Give it a stripped libapp.so or an iOS App binary (or the APK / IPA that carries it) and get back the class tree, method bodies as pseudo-Dart, the string pool, embedded const tables and the source names of virtual calls. Eighteen registered Dart format epochs, 2.19.6 through 3.12.2. Byte-exact acceptance gates decide whether a parse is right, and an unknown release is refused rather than guessed at.
Install from source:
git clone https://github.com/IR0NBYTE/Jadart.git
pip install './Jadart/framework[disasm]'
What changed since 1.0.0 is in CHANGELOG.md.