Hacking DOL Loader for IDA 7

Green;Dog

New Member
OP
Newbie
Joined
Sep 18, 2016
Messages
4
Trophies
0
XP
105
Country
United States
No one asked, but here ya go. I couldn't find a loader that worked with IDA 7, and I wanted to look at melee's code.

I'm "new" (on a year old account that just hasn't done anything) so I can't post a link, nor can python files be uploaded, so throw this in a python file in your loaders directory.

Code:
import idaapi
import ida_segment
from idc import *
import struct

DolFormatName = 'Nintendo GC\Wii DOL'

# ---------------------------------------------------------
def read_int(li):
    s = li.read(4)
    return struct.unpack('>I', s)[0]

# ---------------------------------------------------------
def accept_file(li, filename):
    if filename.endswith('.dol'):
        return {'format': DolFormatName, 'processor': 'ppc'}
   
    return 0

# ---------------------------------------------------------
def load_file(li, neflags, format):
    li.seek(0);
   
    text_offset = []
    text_addr = []
    text_size = []
   
    data_offset = []
    data_addr = []
    data_size = []
   
    print('Reading offsets...')
   
    for x in range(0, 7):
        text_offset.append(read_int(li))
        print(hex(text_offset[x]))
   
    for x in range(0, 11):
        data_offset.append(read_int(li))
        print(hex(data_offset[x]))
   
    print('Reading addresses...')
   
    for x in range(0, 7):
        text_addr.append(read_int(li))
   
    for x in range(0, 11):
        data_addr.append(read_int(li))
   
    print('Reading sizes...')
   
    for x in range(0, 7):
        text_size.append(read_int(li))
   
    for x in range(0, 11):
        data_size.append(read_int(li))
   
    print('Reading bss info...')
   
    bss_addr = read_int(li)
    bss_size = read_int(li)
   
    print('Reading entry point...')
   
    entry_point = read_int(li)
   
    print('Setting processor type...')
   
    idaapi.set_processor_type('ppc', SETPROC_LOADER)
   
    print('Adding text segments...')
   
    for x in range(0, 7):
        if text_size[x] == 0:
            continue
        end_addr = text_addr[x] + text_size[x]
        ida_segment.add_segm(0, text_addr[x], end_addr, 'Text' + str(x), 'CODE')
        li.file2base(text_offset[x], text_addr[x], end_addr, 1)
   
    print('Adding data segments...')
   
    for x in range(0, 11):
        if data_size[x] == 0:
            continue
        end_addr = data_addr[x] + data_size[x]
        ida_segment.add_segm(0, data_addr[x], end_addr, 'Data' + str(x), 'DATA')
        li.file2base(data_offset[x], data_addr[x], end_addr, 1)
   
    print('Adding bss segment...')
   
    if bss_size != 0:
        ida_segment.add_segm(0, bss_addr, bss_addr + bss_size, 'bss', 'BSS')
   
    ida_entry.add_entry(entry_point, entry_point, 'entry', 1)
   
    return 1
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
    SylverReZ @ SylverReZ: @BigOnYa, And you too :) +1