-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathnro.py
40 lines (34 loc) · 1.36 KB
/
nro.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from binaryninja.architecture import Architecture
from binaryninja.binaryview import BinaryView
from binaryninja.types import Symbol
from binaryninja.enums import SegmentFlag, SectionSemantics, SymbolType
from .generic_binary import *
from lz4.block import decompress
class NROView(GenericBinary):
name = 'NRO'
long_name = name
base = 0x7100000000
entrypoint = base + 0x80
MAGIC = b"NRO0"
HDR_SIZE = 0
@classmethod
def is_valid_for_data(cls, data):
return data.read(0x10, 4) == cls.MAGIC
def __init__(self, data):
super().__init__(data)
self.reader.seek(0x20)
self.text_offset = self.reader.read32()
self.text_size = self.reader.read32()
self.rodata_offset = self.reader.read32()
self.rodata_size = self.reader.read32()
self.data_offset = self.reader.read32()
self.data_size = self.reader.read32()
self.bss_size = self.reader.read32()
self.reader.seek(self.text_offset)
self.raw = self.reader.read(self.text_size)
self.reader.seek(self.rodata_offset)
self.raw += self.reader.read(self.rodata_size)
self.reader.seek(self.data_offset)
self.raw += self.reader.read(self.data_size)
data.write(0, self.raw)
BinaryView.__init__(self, file_metadata=data.file, parent_view=data)