All pastes #911437 Raw Edit

Anonymous

public text v1 · immutable
·published 2008-02-20 18:26 UTC
rendered paste body
//http://iphone.fiveforty.net/wiki/index.php/Objective-C_Script_for_IDA

#include <idc.idc>

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");
}