RofsExtractor is a command-line utility for listing and extracting files from Symbian ROM images and raw firmware dumps. It supports ordinary bare ROM images, embedded ROM images, NAND dumps with out-of-band data, and raw NOR dumps whose physical regions use different runtime address mappings.
- List the complete Symbian ROM directory tree without extracting files.
- Extract all files or only paths matching a case-insensitive substring.
- Read plain and EPOC loader-wrapped ROM images.
- Scan a larger firmware file for an embedded Symbian ROM image.
- Decode uncompressed and BytePair-compressed demand-paged ROM data.
- Strip interleaved NAND OOB data before parsing the ROM.
- Automatically reconstruct multi-region virtual-to-physical mappings in supported raw NOR dumps.
- Preserve the ROM directory structure and include the ROM image header when extracting executables and DLLs.
- Python 3.10 or newer
- No third-party Python packages
Display all available commands:
python3 RofsExtractor.py --helpList the files and directories in a ROM image:
python3 RofsExtractor.py list rom.binExtract the complete ROM image to the default extracted directory:
python3 RofsExtractor.py extract rom.binChoose a different output directory:
python3 RofsExtractor.py extract rom.bin --output rom_extractedExtract only paths containing a particular string:
python3 RofsExtractor.py extract rom.bin \
--pattern sys/bin \
--output system_binariesThe --pattern comparison is case-insensitive and is applied to the complete path stored in the ROM.
Use --help with list or extract for all available options.
If the ROM header begins at offset zero, no additional options are required:
python3 RofsExtractor.py list rom.bin
python3 RofsExtractor.py extract rom.bin --output extractedIf the exact ROM offset is known, pass it as a decimal or 0x-prefixed hexadecimal value:
python3 RofsExtractor.py extract firmware.bin \
--offset 0x40000 \
--output extractedIf the offset is unknown, use the heuristic scanner:
python3 RofsExtractor.py extract firmware.bin \
--scan \
--output extractedScanning checks candidate ROM headers and selects the candidate with the most plausible directory tree.
Raw NOR dumps may contain several physical regions whose directory entries refer to different runtime virtual address ranges. The tool detects these mappings from valid ROM-resident E32 executable headers, locates the root directory, and joins files that cross mapping boundaries.
No manual mapping options are required:
python3 RofsExtractor.py list dump_nor.bin
python3 RofsExtractor.py extract dump_nor.bin --output extractedWhen detection succeeds, the first line of list output shows the root directory offset and the recovered mappings.
For a raw NAND dump containing interleaved page data and spare/OOB bytes, specify both sizes. For example, to keep 512 data bytes and discard 16 OOB bytes from every physical page:
python3 RofsExtractor.py extract dump_nand.bin \
--nand-page-size 512 \
--nand-oob-size 16 \
--scan \
--output extracted--nand-page-size and --nand-oob-size must always be used together. These options only remove OOB bytes; they do not reconstruct an FTL or correct NAND ECC errors.
By default, extraction stops when a corrupt BytePair-compressed page is encountered. To continue recovery, replace each corrupt page with zeroes:
python3 RofsExtractor.py extract rom.bin \
--ignore-corrupt-pages \
--output recoveredThe tool prints a warning for every substituted page. Files using those pages may be incomplete or unusable.
Treat extracted files as recovery output until they have been validated. Heuristic scanning and raw NOR mapping detection depend on consistent headers and directory metadata; damaged or partial dumps may produce missing files or fail detection.
--ignore-corrupt-pages deliberately replaces unreadable data with zeroes. It is useful for best-effort recovery, but it does not repair the affected executable or resource data.