Skip to content

Commit

Permalink
add IDA save/load dolphin map scripts for 7.x
Browse files Browse the repository at this point in the history
  • Loading branch information
dreamsyntax committed Oct 9, 2021
1 parent ff1cb5a commit d99664a
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright 2018 Dolphin Emulator Project
# Licensed under GPLv2+
# Refer to the license.txt file included.
# Refer to the LICENSES/GPL-2.0-or-later.txt file included.

from collections import namedtuple

Expand Down Expand Up @@ -29,6 +29,8 @@ def ida_main():
import idc

filepath = idc.AskFile(0, "*.map", "Load a Dolphin emulator symbol map")
if filepath is None:
return
symbol_map = load_dolphin_map(filepath)

for symbol in symbol_map:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright 2018 Dolphin Emulator Project
# Licensed under GPLv2+
# Refer to the license.txt file included.
# Refer to the LICENSES/GPL-2.0-or-later.txt file included.

from collections import namedtuple

Expand All @@ -27,6 +27,8 @@ def ida_main():
import idc

filepath = idc.AskFile(1, "*.map", "Save a Dolphin emulator symbol map")
if filepath is None:
return
text_map = []
data_map = []
for ea, name in idautils.Names():
Expand Down
62 changes: 62 additions & 0 deletions Tools/IDA/IDA 7.x/LoadDolphinMap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Copyright 2021 Dolphin Emulator Project
# Licensed under GPLv2+
# Refer to the LICENSES/GPL-2.0-or-later.txt file included.

from collections import namedtuple


DolphinSymbol = namedtuple("DolphinSymbol", [
"section", "addr", "size", "vaddr", "align", "name"
])


def load_dolphin_map(filepath):
with open(filepath, "r") as f:
section = ""
symbol_map = []
for line in f.readlines():
t = line.strip().split(" ", 4)
if len(t) == 3 and t[1] == "section" and t[2] == "layout":
section = t[0]
continue
if not section or len(t) != 5:
continue
symbol_map.append(DolphinSymbol(section, *t))
return symbol_map


def ida_main():
import idc

filepath = ida_kernwin.ask_file(0, "*.map", "Load a Dolphin emulator symbol map")
if filepath is None:
return
symbol_map = load_dolphin_map(filepath)

for symbol in symbol_map:
addr = int(symbol.vaddr, 16)
size = int(symbol.size, 16)
ida_bytes.del_items(addr, size, 0)
if symbol.section in [".init", ".text"]:
idc.create_insn(addr)
success = ida_funcs.add_func(
addr,
idc.BADADDR if not size else (addr+size)
)
else:
success = ida_bytes.create_data(addr, idc.FF_BYTE, size, 0)

if not success:
ida_kernwin.msg("Can't apply properties for symbol:"
" {0.vaddr} - {0.name}\n".format(symbol))

flags = idc.SN_NOCHECK | idc.SN_PUBLIC
if symbol.name.startswith("zz_"):
flags |= idc.SN_AUTO | idc.SN_WEAK
else:
flags |= idc.SN_NON_AUTO
idc.set_name(addr, symbol.name, flags)


if __name__ == "__main__":
ida_main()
48 changes: 48 additions & 0 deletions Tools/IDA/IDA 7.x/SaveDolphinMap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Copyright 2021 Dolphin Emulator Project
# Licensed under GPLv2+
# Refer to the LICENSES/GPL-2.0-or-later.txt file included.

from collections import namedtuple


DolphinSymbol = namedtuple("DolphinSymbol", [
"section", "addr", "size", "vaddr", "align", "name"
])


def save_dolphin_map(filepath, text_map, data_map):
line = "{0.addr:08x} {0.size:08x} {0.vaddr:08x} {0.align} {0.name}\n"
with open(filepath, "w") as f:
f.write(".text section layout\n")
for symbol in text_map:
f.write(line.format(symbol))
f.write("\n.data section layout\n")
for symbol in data_map:
f.write(line.format(symbol))


def ida_main():
import idaapi
import idautils
import idc

filepath = ida_kernwin.ask_file(1, "*.map", "Save a Dolphin emulator symbol map")
if filepath is None:
return
text_map = []
data_map = []
for ea, name in idautils.Names():
f = idaapi.get_func(ea)
if f is not None:
text_map.append(
DolphinSymbol(".text", ea, f.size(), ea, 0, name)
)
else:
data_map.append(
DolphinSymbol(".data", ea, idc.get_item_size(ea), ea, 0, name)
)
save_dolphin_map(filepath, text_map, data_map)


if __name__ == "__main__":
ida_main()

0 comments on commit d99664a

Please sign in to comment.