
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░
рдЖрдИрдбреАрдП рдкреНрд░реЛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рд▓рд┐рдЦрдиреЗ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд╣реИред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЖрдЬ рд╣рдо рдПрдХ рдкреБрд░рд╛рдиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд▓реЛрдбрд░ рдореЙрдбреНрдпреВрд▓ (рд▓реЛрдбрд░) рд▓рд┐рдЦрдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН, AmigaOS рдХреЗ рд▓рд┐рдП ред рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рдореИрдВ рд░рд┐рд▓реЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ (рд╡реЗ рднреА relocations
), рдЬреЛ рдХрдИ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ ( PE
, ELF
, MS-DOS
, рдЖрджрд┐) рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдкрд░рд┐рдЪрдп
рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Amiga Hunk рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ (AmigaOS рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ: executable
-, library
рдлрд╝рд╛рдЗрд▓реЗрдВ, рдЖрджрд┐) рдФрд░ IDA рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдВрднрд╡рддрдГ рджреЗрдЦрд╛ рдХрд┐ рдмреВрдЯрд▓реЛрдбрд░ред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, IDA SDK
рдореЗрдВ рднреА рд╕реНрд░реЛрдд рд╣реИрдВ):


рд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ... рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореБрджреНрджреЗ
рддреЛ рдпрд╣рд╛рдБ рдореБрджреНрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:
- рдкреБрдирд░реНрд╡рд╛рд╕ред рдЕрдореАрдЧрд╛ рд╣рдВрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ, рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рд╣реИред рдФрд░ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╡реЗ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рднреА рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд▓рд┐рдВрдХ рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк " рд░рд┐рдмреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо ... " рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд▓реЛрдбрд░ рдореЗрдВ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИред - рдлрд╝рд╛рдЗрд▓ рдХреЛ
0x00000000
рдЖрдзрд╛рд░ рдкрддреЗ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╢реВрдиреНрдп рдСрдлрд╕реЗрдЯ рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ - рд▓реЛрдбрд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдИрдбреАрдП (рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ) рдЖрдИрдбреАрдП рдХреЛ рдХреБрдЫ "рдкрд╣рдЪрд╛рдирдиреЗ" рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ: рдкреЙрдЗрдВрдЯрд░реНрд╕, рд╕рд░рдгрд┐рдпреЛрдВ, рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ред
рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ x86 / x64 / ARM рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЕрдХреНрд╕рд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЛрдбрд╛рдВрддрд░рдХ рд╕реВрдЪреА рдРрд╕реА рд▓рдЧрддреА рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдЖрдИрдбреАрдП рдХреЛ рдПрдХ рдирдЬрд╝рд░ рд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред (рдФрд░ рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рднреА рд╣рдЯрд╛рдПрдВ рдФрд░ рдЬрд╛рдиреЗрдВ рдХрд┐ radare2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ) ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреВрдЯрд▓реЛрдбрд░ рдЭрдВрдбреЗ рд╣реИрдВред

рдмреВрдЯрд▓реЛрдбрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдирд╛
рджрд░рдЕрд╕рд▓, рдмреВрдЯрд▓реЛрдбрд░ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рддреАрди рдХреЙрд▓рдмреИрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
1) accept_file(li, filename)
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдИрдбреАрдП рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ filename
рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ
def accept_file(li, filename): li.seek(0) tag = li.read(4) if tag == 'TAG1':
2) load_file(li, neflags, format)
рдпрд╣рд╛рдВ, рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЦрдВрдбреЛрдВ / рд╕рдВрд░рдЪрдирд╛рдУрдВ / рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рд░реАрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛рдПрдВред
def load_file(li, neflags, format):
3) move_segm(frm, to, sz, fileformatname)
рдпрджрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рдЖрдзрд╛рд░ рдкрддреЗ рдХреЛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рдФрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рд╕рднреА рд░рд┐рд▓реЛрдХреЗрд╢рди рдХреЛ рд░рд┐рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЛрдб рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд░рд╣реЗрдЧрд╛ред рдпрд╣рд╛рдВ рд╣рдо рдмрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдЭреБрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдбреЗрд▓реНрдЯрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреИрдЪ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
def move_segm(frm, to, sz, fileformatname): delta = to xEA = ida_fixup.get_first_fixup_ea() while xEA != idaapi.BADADDR: fd = ida_fixup.fixup_data_t(idaapi.FIXUP_OFF32) ida_fixup.get_fixup(xEA, fd) fd.off += delta if fd.get_type() == ida_fixup.FIXUP_OFF8: idaapi.put_byte(xEA, fd.off) elif fd.get_type() == ida_fixup.FIXUP_OFF16: idaapi.put_word(xEA, fd.off) elif fd.get_type() == ida_fixup.FIXUP_OFF32: idaapi.put_long(xEA, fd.off) fd.set(xEA) xEA = ida_fixup.get_next_fixup_ea(xEA) idaapi.cvar.inf.baseaddr = idaapi.cvar.inf.baseaddr + delta return 1
рдмреВрдЯрд▓реЛрдбрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ import idaapi import ida_idp import ida_fixup def accept_file(li, filename): li.seek(0) tag = li.read(4) if tag == 'TAG1':
рдореБрдЦреНрдп рдмреВрдЯрд▓реЛрдбрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛
рдЗрд╕рд▓рд┐рдП, рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реБрд▓рдЭ рдЧрдИред рдЖрдЗрдП рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ "рдХрд╛рд░реНрдпрд╕реНрдерд▓" рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ PyCharm рдореЗрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЖрдЗрдП рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЖрдпрд╛рддреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддреЛрдВ рдореЗрдВ IDA рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝реЗрдВ:

рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдорд┐рдЧреЛ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдиреБрдХрд░рдг рдХреЗ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╢рд╛рдпрдж рдЕрдорд┐рдЯреВрд▓ рдЬреИрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдорд┐рдЧрд╛ рд╣рдВрдХ (рдЕрдиреБрдХрд░рдг рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд┐рд░реНрдл рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдкреВрд░рд╛ рдЙрдкрдХрд░рдг рд╣реИред рдореИрдВ "рдмреВрдЯрд▓реЛрдбрд░" (рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдмреВрдЯрд▓реЛрдбрд░ рдЧреИрд░-рд▓рд╛рднрдХрд╛рд░реА рд╣реЛрдЧрд╛) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
amitools
рдкрд░ рдПрдХ рдЫреЛрдЯреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж amitools
рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓реАред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ, рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ, рд╕реНрдерд╛рдирд╛рдВрддрд░рдг, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рд░реАрд▓реЛрдХрдбреИрдо рдлрд╛рдЗрд▓ рд░реАрд▓реЛрдХ рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдЕрдм рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛: amitools
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЗрд╕ рд╕рднреА рдкреЗрдбрд╝ рд╕реЗ, рдЖрдкрдХреЛ BinFmtHunk.py
рдФрд░ BinFmtHunk.py
рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рд╕рднреА BinFmtHunk.py
рдХреЛ рд╣рдорд╛рд░реА рдмреВрдЯрд▓реЛрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреА amitools
, рдЬрд┐рд╕рд╕реЗ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдЪреАрдЬ рдЬреЛ рдореИрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рджреЛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП data_offset
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: HunkSegmentBlock
рдФрд░ HunkOverlayBlock
ред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ:
HunkSegmentBlock class HunkSegmentBlock(HunkBlock): """HUNK_CODE, HUNK_DATA, HUNK_BSS""" def __init__(self, blk_id=None, data=None, data_offset=0, size_longs=0): HunkBlock.__init__(self) if blk_id is not None: self.blk_id = blk_id self.data = data self.data_offset = data_offset self.size_longs = size_longs def parse(self, f): size = self._read_long(f) self.size_longs = size if self.blk_id != HUNK_BSS: size *= 4 self.data_offset = f.tell() self.data = f.read(size)
HunkOverlayBlock class HunkOverlayBlock(HunkBlock): """HUNK_OVERLAY""" blk_id = HUNK_OVERLAY def __init__(self): HunkBlock.__init__(self) self.data_offset = 0 self.data = None def parse(self, f): num_longs = self._read_long(f) self.data_offset = f.tell() self.data = f.read(num_longs * 4)
рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ Segment
рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ Hunk
рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЦрдВрдб class Segment: def __init__(self, seg_type, size, data=None, data_offset=0, flags=0): self.seg_type = seg_type self.size = size self.data_offset = data_offset self.data = data self.flags = flags self.relocs = {} self.symtab = None self.id = None self.file_data = None self.debug_line = None
рдЕрдЧрд▓рд╛, BinFmtHunk
рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП BinFmtHunk
рд╕реЗрдЧрдореЗрдВрдЯ рдмрдирд╛рддреЗ рд╕рдордп data_offset
рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдПрдХ рдЦрдВрдб рдЦрдВрдб рдЧрдгрдирд╛ рдкрд╛рд╢ рдореЗрдВ create_image_from_load_seg_file
рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
create_image_from_load_seg_file segs = lsf.get_segments() for seg in segs:
рдЖрдИрдбреАрдП рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛
рдЕрдм рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП, рдЪрд▓реЛ рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦреЗрдВред рдкрд╣рд▓реЗ accept_file
рдХрд┐рдпрд╛ accept_file
:
accept_file def accept_file(li, filename): li.seek(0) bf = BinFmtHunk() tag = li.read(4) tagf = StringIO.StringIO(tag) if bf.is_image_fobj(tagf): return {'format': 'Amiga Hunk executable', 'processor': '68040'} else: return 0
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдкрд╣рд▓реЗ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЖрднрд╛рд╕реА рдлрд╝рд╛рдЗрд▓ ( StringIO
) StringIO
рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ is_image_fobj
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ is_image_fobj
рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рд╕рд╣реА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╢рдмреНрджрдХреЛрд╢ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ: format
(рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкрд╛рда рд╡рд┐рд╡рд░рдг) рдФрд░ processor
(рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ IDB рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ Motorola 68040
рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддреА рд╣реИ:
idaapi.set_processor_type('68040', ida_idp.SETPROC_LOADER)
рдмреВрдЯрд▓реЛрдбрд░ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдЧреЗрдо рдкрд╣рдЪрд╛рдирд╛ рди рдЬрд╛рдП рдФрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реЗ рд╕рд░рдгрд┐рдпрд╛рдВ рди рдмрдирд╛рдИ рдЬрд╛рдПрдВ (рдЭрдВрдбреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ):
idaapi.cvar.inf.af = idaapi.AF_CODE | idaapi.AF_JUMPTBL | idaapi.AF_USED | idaapi.AF_UNK | \ idaapi.AF_PROC | idaapi.AF_LVAR | idaapi.AF_STKARG | idaapi.AF_REGARG | \ idaapi.AF_TRACE | idaapi.AF_VERSP | idaapi.AF_ANORET | idaapi.AF_MEMFUNC | \ idaapi.AF_TRFUNC | idaapi.AF_FIXUP | idaapi.AF_JFUNC | idaapi.AF_NULLSUB | \ idaapi.AF_NULLSUB | idaapi.AF_IMMOFF | idaapi.AF_STRLIT
рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ BinFmtHunk
(рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рд╡рд╣ рд╕рдм) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
li.seek(0) data = li.read(li.size()) bf = BinFmtHunk() fobj = StringIO.StringIO(data) bi = bf.load_image_fobj(fobj)
рд╢реВрдиреНрдп рдбрд╛рдЙрдирд▓реЛрдб рдкрддреЗ рдХреЗ рд╕рд╛рде, рдореИрдВ рдПрдХ рдФрд░ ImageBase
рдЪреБрдирдиреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ ImageBase
ред рд╡реИрд╕реЗ, AmigaOS рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╛рдЗрд▓реЗрдВ рдХреЗрд╡рд▓ рд╕реБрд▓рдн рдкрддреЗ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд╡рд╣рд╛рдВ рдХреЛрдИ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЗ рдирд╣реАрдВ рд╣реИрдВред рдореИрдВрдиреЗ 0x21F000
рдЪреБрдирд╛, рдпрд╣ рд╕реБрдВрджрд░ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
rel = Relocate(bi)
рд╡рд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрддрд╛ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЦрдВрдбреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЖрдИрдбреА рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ (рдЖрдИрдбреАрдП рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ: reloc == fixup
):
for seg in bi.get_segments(): offset = addrs[seg.id] size = seg.size to_segs = seg.get_reloc_to_segs() for to_seg in to_segs: reloc = seg.get_reloc(to_seg) for r in reloc.get_relocs(): offset2 = r.get_offset() rel_off = Relocate.read_long(datas[seg.id], offset2) addr = offset + rel_off + r.addend fd = idaapi.fixup_data_t(idaapi.FIXUP_OFF32) fd.off = addr fd.set(offset + offset2) idaapi.mem2base(str(datas[seg.id]), offset, seg.data_offset) idaapi.add_segm(0, offset, offset + size, 'SEG_%02d' % seg.id, seg.get_type_name())
load_file
рд▓рд┐рдП рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо:
return 1
рдХреЛрдб move_segm
рдмрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд move_segm
ред
рдмреВрдЯрд▓реЛрдбрд░ рд╕рд╛рд░рд╛рдВрд╢ рдХреЛрдб рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖
amiga_hunk.py import idaapi import ida_idp import ida_fixup import StringIO import struct HUNK_UNIT = 999 HUNK_NAME = 1000 HUNK_CODE = 1001 HUNK_DATA = 1002 HUNK_BSS = 1003 HUNK_ABSRELOC32 = 1004 HUNK_RELRELOC16 = 1005 HUNK_RELRELOC8 = 1006 HUNK_EXT = 1007 HUNK_SYMBOL = 1008 HUNK_DEBUG = 1009 HUNK_END = 1010 HUNK_HEADER = 1011 HUNK_OVERLAY = 1013 HUNK_BREAK = 1014 HUNK_DREL32 = 1015 HUNK_DREL16 = 1016 HUNK_DREL8 = 1017 HUNK_LIB = 1018 HUNK_INDEX = 1019 HUNK_RELOC32SHORT = 1020 HUNK_RELRELOC32 = 1021 HUNK_ABSRELOC16 = 1022 HUNK_PPC_CODE = 1257 HUNK_RELRELOC26 = 1260 hunk_names = { HUNK_UNIT: "HUNK_UNIT", HUNK_NAME: "HUNK_NAME", HUNK_CODE: "HUNK_CODE", HUNK_DATA: "HUNK_DATA", HUNK_BSS: "HUNK_BSS", HUNK_ABSRELOC32: "HUNK_ABSRELOC32", HUNK_RELRELOC16: "HUNK_RELRELOC16", HUNK_RELRELOC8: "HUNK_RELRELOC8", HUNK_EXT: "HUNK_EXT", HUNK_SYMBOL: "HUNK_SYMBOL", HUNK_DEBUG: "HUNK_DEBUG", HUNK_END: "HUNK_END", HUNK_HEADER: "HUNK_HEADER", HUNK_OVERLAY: "HUNK_OVERLAY", HUNK_BREAK: "HUNK_BREAK", HUNK_DREL32: "HUNK_DREL32", HUNK_DREL16: "HUNK_DREL16", HUNK_DREL8: "HUNK_DREL8", HUNK_LIB: "HUNK_LIB", HUNK_INDEX: "HUNK_INDEX", HUNK_RELOC32SHORT: "HUNK_RELOC32SHORT", HUNK_RELRELOC32: "HUNK_RELRELOC32", HUNK_ABSRELOC16: "HUNK_ABSRELOC16", HUNK_PPC_CODE: "HUNK_PPC_CODE", HUNK_RELRELOC26: "HUNK_RELRELOC26", } EXT_SYMB = 0 EXT_DEF = 1 EXT_ABS = 2 EXT_RES = 3 EXT_ABSREF32 = 129 EXT_ABSCOMMON = 130 EXT_RELREF16 = 131 EXT_RELREF8 = 132 EXT_DEXT32 = 133 EXT_DEXT16 = 134 EXT_DEXT8 = 135 EXT_RELREF32 = 136 EXT_RELCOMMON = 137 EXT_ABSREF16 = 138 EXT_ABSREF8 = 139 EXT_RELREF26 = 229 TYPE_UNKNOWN = 0 TYPE_LOADSEG = 1 TYPE_UNIT = 2 TYPE_LIB = 3 HUNK_TYPE_MASK = 0xffff SEGMENT_TYPE_CODE = 0 SEGMENT_TYPE_DATA = 1 SEGMENT_TYPE_BSS = 2 BIN_IMAGE_TYPE_HUNK = 0 segment_type_names = [ "CODE", "DATA", "BSS" ] loadseg_valid_begin_hunks = [ HUNK_CODE, HUNK_DATA, HUNK_BSS, HUNK_PPC_CODE ] loadseg_valid_extra_hunks = [ HUNK_ABSRELOC32, HUNK_RELOC32SHORT, HUNK_DEBUG, HUNK_SYMBOL, HUNK_NAME ] class HunkParseError(Exception): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg class HunkBlock: """Base class for all hunk block types""" def __init__(self): pass blk_id = 0xdeadbeef sub_offset = None
: https://github.com/lab313ru/amiga_hunk_loader
IDA, , . ┬л┬╗ Python , , ( -?), .
- IDA , . , - , , .
.