// vim: ft=cpp sw=4 ts=4 et /* (C) 2003-2008 Willem Jan Hengeveld * * Web: http://www.xs4all.nl/~itsme/projects/ida/ */ #define UNLOADED_FILE 1 #include // this script processes the objective C typeinfo tables, // and names functions accordingly. // greatly improving the disassembly of objective C programs static create_mthnames(ea0, ea1, name, type) { auto ea; for (ea=ea0 ; ea seg __cat_inst_meth MakeName(Dword(ea+0x8), form("catmths_%s", name)); create_mthnames(Dword(ea+0x8)+8, Dword(ea+0x8)+8+12*Dword(Dword(ea+0x8)+4), name, "cat_"); } // todo: class methods -> __cat_cls_meth } } segea=SegByBase(SegByName("__module_info")); for (ea= SegStart(segea) ; ea!=BADADDR ; ea=NextHead(ea,SegEnd(segea))) { if (GuessType(ea)=="__module_info_struct") { MakeName(Dword(ea+0xC), form("symtab_%X", Dword(ea+0xC))); } } segea=SegByBase(SegByName("__cfstring")); for (ea= SegStart(segea) ; ea!=BADADDR ; ea=NextHead(ea,SegEnd(segea))) { if (GuessType(ea)=="__cfstring_struct") { if (!MakeName(ea, "cfs_"+Name(Dword(ea+8)))) { i=0; while (!MakeName(ea, form("cfs_%s_%d",Name(Dword(ea+8)),i))) i++; } for (rea=DfirstB(ea) ; rea!=BADADDR ; rea=DnextB(ea,rea)) { MakeComm(rea, String(Dword(ea+8))); } } } segea=SegByBase(SegByName("__message_refs")); for (ea= SegStart(segea) ; ea!=BADADDR ; ea=NextHead(ea,SegEnd(segea))) { if (!MakeName(ea, "msg_"+Name(Dword(ea)))) { i=0; while (!MakeName(ea, form("msg_%s_%d",Name(Dword(ea)),i))) i++; } for (rea=DfirstB(ea) ; rea!=BADADDR ; rea=DnextB(ea,rea)) { MakeComm(rea, "message "+String(Dword(ea))); } } segea=SegByBase(SegByName("__cls_refs")); for (ea= SegStart(segea) ; ea!=BADADDR ; ea=NextHead(ea,SegEnd(segea))) { if (!MakeName(ea, "cls_"+Name(Dword(ea)))) { i=0; while (!MakeName(ea, form("cls_%s_%d",Name(Dword(ea)),i))) i++; } for (rea=DfirstB(ea) ; rea!=BADADDR ; rea=DnextB(ea,rea)) { MakeComm(rea, "class "+String(Dword(ea))); } } segea=SegByBase(SegByName("__instance_vars")); for (ea= SegStart(segea) ; ea and vtbl_ from ivars+methods // todo: create __cfstring_struct in seg // todo: create align 40h between __class items and __meta_class item s // todo: create align 20h between __cls_meth, __inst_meth, __instance_vars, __symbols // todo: create dword arrays for __eh_frame // todo: const_coal contains obj defs + ptr to vtables too // todo: rename __pointers -> { __data -> __cstring ptrs, __data -> __cfstring, ... } } static main() { fix__objc_binary(); }