From a7fd2f8080123ddcbb51fdcc3d3e786e60a111b5 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Mon, 1 Apr 2024 15:19:59 -0400 Subject: Add md1rom binary view with pure Rust lzma implementation --- view/md1rom/md1rom.h | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 view/md1rom/md1rom.h (limited to 'view/md1rom/md1rom.h') diff --git a/view/md1rom/md1rom.h b/view/md1rom/md1rom.h new file mode 100644 index 00000000..445e27aa --- /dev/null +++ b/view/md1rom/md1rom.h @@ -0,0 +1,98 @@ +#include "binaryninjaapi.h" + +namespace BinaryNinja +{ + const uint32_t MAGIC_1 = 0x58881688; + const uint32_t MAGIC_2 = 0x58891689; + const uint64_t MAIN_ROM_BASE = 0x90000000; + + struct Md1romSegment + { + uint32_t magic; + uint32_t length; + std::string name; + uint32_t addr; + uint32_t mode; + uint32_t magic2; + uint32_t offset; + // start of the header in the raw view + uint32_t headerStart; + + // start of the data in the raw view + uint32_t dataStart; + }; + + struct Md1DebugSymbol + { + std::string name; + uint32_t start; + uint32_t end; + }; + + struct CATDEntryHeader + { + uint32_t unknown; + uint32_t offset; + uint32_t size; + }; + + struct CATDEntry + { + uint32_t offset; + uint32_t size; + uint32_t uncompressedSize; + }; + + class Md1romView: public BinaryView + { + bool m_parseOnly; + uint64_t m_entryPoint{}; + BNEndianness m_endian = LittleEndian; + size_t m_addressSize = 4; + Ref m_arch = nullptr; + Ref m_plat = nullptr; + Ref m_logger; + bool m_relocatable = false; + + std::vector m_segments; + std::vector m_debugSymbols; + std::vector m_catdEntryHeaders; + std::vector m_catdEntries; + + bool m_mainRomFound = false, m_dbgInfoFound = false, m_dbgDbFound = false; + Md1romSegment m_mainRom, m_dbgInfoSeg, m_dbgDatabaseSeg; + + SymbolQueue* m_symbolQueue = nullptr; + + virtual uint64_t PerformGetEntryPoint() const override; + + virtual bool PerformIsExecutable() const override { return true; } + virtual BNEndianness PerformGetDefaultEndianness() const override; + virtual bool PerformIsRelocatable() const override; + virtual size_t PerformGetAddressSize() const override; + + void ParseDebugInfo(); + void ParseDebugDatabase(); + void DefineMd1RomSymbol(BNSymbolType type, const std::string& name, uint64_t addr, + BNSymbolBinding binding=NoBinding, Ref typeObj=nullptr); + + public: + Md1romView(BinaryView* data, bool parseOnly = false); + ~Md1romView(); + + virtual bool Init() override; + }; + + class Md1romViewType: public BinaryViewType + { + Ref m_logger; + public: + Md1romViewType(); + virtual Ref Create(BinaryView* data) override; + virtual Ref Parse(BinaryView* data) override; + virtual bool IsTypeValidForData(BinaryView* data) override; + virtual Ref GetLoadSettingsForData(BinaryView* data) override; + }; + + void InitMd1romViewType(); +} -- cgit v1.3.1