Commit Graph

11 Commits

Author SHA1 Message Date
BFlat ebed13d0fc Keep ARM32 conditional call values, esbuild dependencies and window labels right (#656)
Replays #640–#642. Conditional A32 calls keep the skipped path's value, esbuild dependencies survive unrelated calls, and window comparison labels stay distinct without renumbering occurrences.

Co-authored-by: Afloat <132809511+Afloat16@users.noreply.github.com>
2026-11-03 20:49:11 +07:00
Bently 2c7a311dfd Find strings in ELF files with no section headers, read from their loaded segments (#491)
For ELF files with no section headers (common in firmware), native strings are read from the loaded segments, limited to the bytes each segment maps.
2026-11-03 14:50:43 +07:00
Bently c5fce85fe0 In stripped programs, a jump below a function's entry is a tail call to a function of its own (#492)
In a stripped program, an unconditional jump to code below a function's entry that the function hasn't reached otherwise is a tail call to a function of its own (such as frame_dummy jumping to register_tm_clones), instead of pulling that code into the caller.
2026-11-03 14:50:38 +07:00
BFlat 4a6d87a107 ARM32 loads and stores keep their memory operands in pseudo-C (#450)
ARM32 and Thumb loads and stores keep their memory operands, so pseudo-C shows r0 = *(uint32_t*)(r1 + 4); instead of r0 = 0;; write-back and shifted or subtracted index forms are shown as written. Fixes #277.
2026-11-03 00:12:07 +07:00
Afloat 858037dc3d Use ARM32 registers in value-flow graphs (R0.5) (#436)
ARM32 and Thumb value-flow graphs use r0–r3 and r12 for calls and r0 for returns instead of x86 registers. Fixes #239.
2026-11-02 23:41:56 +07:00
GGWA d57649cf7a ARM and Thumb branches point at their real targets (#363)
ARM and Thumb branches, BL/BLX calls and CBZ/CBNZ point at the targets llvm-objdump reports, so Thumb calls no longer land four bytes early. Fixes #250.
2026-11-02 23:39:14 +07:00
phatloi0010 8fb98ceea7 ARM32 pseudo-C keeps call return values in r0 (#380)
ARM32 and Thumb pseudo-C returns a call's result in r0 instead of an x86 register. Fixes #278.
2026-11-02 23:08:39 +07:00
GGWA 35d76945ca ELF files with no section headers show their dynamic symbols and functions (#233)
ELF files whose section headers were removed (common in NAS and router firmware) now show their functions, imports and exports. The dynamic symbol table is found through PT_DYNAMIC (DT_SYMTAB/DT_STRTAB, counted from DT_HASH, then DT_GNU_HASH, then an estimate with a warning), shared with the Flutter reader. The prologue scan walks executable segments when there are no sections.

Fixes #223
2026-11-02 13:26:37 +07:00
GGWA fa7f1a114e An A32 doubleword load or store into r15 decodes as invalid instead of stopping the ARM analysis (#204)
An A32 LDRD/STRD with Rt=15 (e.g. 0xc0c7fef3) made the decoder library panic on the nonexistent r16; such a word now decodes as no instruction, before the library sees it.
2026-11-02 10:07:46 +07:00
Agapenor 348949ca76 Analysing code at the top of the address space finishes instead of running forever (#78)
The PLT, prologue and pointer scans in disasm/program.rs use checked steps, so code near u64::MAX no longer wraps to 0 and walks the whole address space. Adds open roadmap lines for an A32 STRD/LDRD decoder panic and unchecked header offsets in dart.rs.
2026-11-01 22:39:42 +07:00
Brandon Thomas f64ae3bf3c Craft Anything
A native, pure-Rust app that shows anyone how a piece of software works, with
evidence-backed answers, then helps them rebuild it. It ships a desktop app, a
CLI and an MCP server, all driven by one engine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 10:52:14 -04:00