Skip to content

Instantly share code, notes, and snippets.

@meepen
Created May 29, 2017 03:15
Show Gist options
  • Save meepen/8a5189f8e0c232593c19a7a8a3755b94 to your computer and use it in GitHub Desktop.
Save meepen/8a5189f8e0c232593c19a7a8a3755b94 to your computer and use it in GitHub Desktop.
#!/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