Created
May 29, 2017 03:15
-
-
Save meepen/8a5189f8e0c232593c19a7a8a3755b94 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import sys | |
import struct | |
import idaapi | |
from idc import * | |
class NCSDLoader(object): | |
class FIRMLoader(object): | |
@staticmethod | |
def get_type(f): | |
if f.read(4) == "FIRM": | |
return "Nintendo 3DS FIRM" | |
@staticmethod | |
def accept_file(f): | |
return FIRMLoader.get_type(f) | |
@staticmethod | |
def load_file(f): | |
f.seek(0x8) | |
arm11entry, arm9entry, = struct.unpack("ii", f.read(0x8)) | |
AddEntryPoint(0, arm11entry, "arm11entrypoint", 1) | |
AddEntryPoint(1, arm9entry, "arm9entrypoint", 1) | |
for offset in range(0x40, 0x100, 0x30): | |
f.seek(offset) | |
segoffset, physaddr, size, = struct.unpack("iii", f.read(0xC)) | |
f.file2base(segoffset, physaddr, physaddr + size, 0) | |
AddSeg(physaddr, physaddr + size, segoffset, 1, 0, 0) | |
LOADERS = [FIRMLoader] | |
def find_loader(f): | |
for loader in LOADERS: | |
f.seek(0x00) | |
if loader.accept_file(f): return loader | |
def get_type(f): | |
loader = find_loader(f) | |
if loader: | |
f.seek(0x00) | |
return loader.get_type(f) | |
def accept_file(f, n): | |
if n == 0: | |
loader = find_loader(f) | |
if loader: | |
f.seek(0x00) | |
return loader.accept_file(f) | |
def load_file(f, neflags, format): | |
idaapi.set_processor_type("ARM", SETPROC_ALL|SETPROC_FATAL) | |
loader = find_loader(f) | |
if loader: | |
f.seek(0x00) | |
return loader.load_file(f) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment