//http://iphone.fiveforty.net/wiki/index.php/Objective-C_Script_for_IDA #include static fixSelectors() { auto start; auto end; auto i; auto prefix; auto name; start = SegByBase(SegByName("__message_refs")); if (start==BADADDR) return; end = SegEnd(start); for(i = start; i < end; i = i + 4) { name = "sel_" + GetString(Dword(i), -1, ASCSTR_C); MakeNameEx(i, name, SN_NOWARN); } } static fixClassRefs() { auto start; auto end; auto i; auto prefix; auto name; start = SegByBase(SegByName("__cls_refs")); if (start==BADADDR) return; end = SegEnd(start); for(i = start; i < end; i = i + 4) { name = "clsref_" + GetString(Dword(i), -1, ASCSTR_C); MakeNameEx(i, name, SN_NOWARN); } } static fixCFStrings() { auto start; auto end; auto i; auto prefix; auto name; start = SegByBase(SegByName("__cfstring")); if (start==BADADDR) return; end = SegEnd(start); for(i = start; i < end; i = i + 16) { name = GetString(Dword(i + 8), -1, ASCSTR_C); MakeNameEx(i, "cfstr_" + name, SN_NOWARN); MakeRptCmt(i, name); //MakeDword(i); //MakeDword(i + 4); //MakeDword(i + 8); //OpOff(i + 8, 0, 0); //MakeDword(i + 12); } } static makeStructFromIvars(name, ivarAddr, instSize) { auto struc; auto count; auto i; auto size; auto offset; auto varName; struc = AddStrucEx(-1, name, 0); count = Dword(ivarAddr); for(i = 0; i < count; i++) { varName = GetString(Dword(ivarAddr + 4 + i * 12), -1, ASCSTR_C); offset = Dword(ivarAddr + 4 + i * 12 + 8); if(i < count - 1) { size = Dword(ivarAddr + 4 + (i + 1) * 12 + 8) - offset; } else { size = instSize - offset; } AddStrucMember(struc, varName, offset, 0, 0, size); } } static fixClasses(meta) { auto start; auto end; auto i; auto j; auto name; auto methName; auto meths; auto count; auto addr; auto codeAddr; auto segName; auto clsPrefix; auto methPrefix; auto methChar; if(meta == 1) { segName = "__meta_class"; clsPrefix = "metadef_"; methPrefix = "clsmeth_"; methChar = "+"; } else { segName = "__class"; clsPrefix = "clsdef_"; methPrefix = "instmeth_"; methChar = "-"; } start = SegByBase(SegByName(segName)); if (start==BADADDR) return; end = SegEnd(start); for(i = start; i < end; i = i + 0x40) { name = GetString(Dword(i + 8), -1, ASCSTR_C); MakeNameEx(i, clsPrefix + name, SN_NOWARN); MakeNameEx(Dword(i + 28), methPrefix + name, SN_NOWARN); if(meta == 0) { MakeNameEx(Dword(i + 24), "ivars_" + name, SN_NOWARN); makeStructFromIvars(name, Dword(i + 24), Dword(i + 20)); } meths = Dword(i + 28); count = Dword(meths + 4); for(j = 0; j < count; j = j + 1) { addr = (meths + 8 + j * 3 * 4); methName = GetString(Dword(addr), -1, ASCSTR_C); codeAddr = Dword(addr + 8); MakeNameEx(codeAddr, name + "_" + methName, SN_NOWARN); SetFunctionCmt(codeAddr, methChar + " [" + name + " " + methName + "]\n" + "Signature: " + GetString(Dword(addr + 4), -1, ASCSTR_C), 0); } } } static fixMethodList(name, meths, meta) { auto j; auto count; auto addr; auto methName; auto codeAddr; auto methChar; auto prefix; if(meta == 1) { prefix = "catclsmeth_"; methChar = "+"; } else { prefix = "catinstmeth_"; methChar = "-"; } MakeNameEx(prefix + meths, name, SN_NOWARN); count = Dword(meths + 4); for(j = 0; j < count; j = j + 1) { addr = (meths + 8 + j * 3 * 4); methName = GetString(Dword(addr), -1, ASCSTR_C); codeAddr = Dword(addr + 8); MakeNameEx(codeAddr, name + "_" + methName, SN_NOWARN); SetFunctionCmt(codeAddr, methChar + " [" + name + " " + methName + "]\n" + "Signature: " + GetString(Dword(addr + 4), -1, ASCSTR_C), 0); } } static fixCategories() { auto start; auto end; auto i; auto j; auto className; auto catName; auto methName; auto meths; auto count; auto addr; auto codeAddr; auto segName; auto instMeths; auto clsMeths; segName = "__category"; start = SegByBase(SegByName(segName)); if (start==BADADDR) return; end = SegEnd(start); for(i = start; i < end; i = i + 0x1C) { catName = GetString(Dword(i + 0), -1, ASCSTR_C); className = GetString(Dword(i + 4), -1, ASCSTR_C); MakeNameEx(i, "catdef_" + className + "__" + catName, SN_NOWARN); instMeths = Dword(i + 8); clsMeths = Dword(i + 12); fixMethodList(className + "_" + catName, instMeths, 0); fixMethodList(className + "_" + catName, clsMeths, 1); } } static main() { Message("Fixing selectors...\n"); fixSelectors(); Message("Fixing class refs...\n"); fixClassRefs(); Message("Fixing CFStrings...\n"); fixCFStrings(); Message("Fixing classes 0...\n"); fixClasses(0); Message("Fixing classes 1...\n"); fixClasses(1); Message("Fixing categories...\n"); fixCategories(); Message("Done.\n"); }