Example/semi-doc of the IOS-Il2cppResolver tool made by @batchh. Its not gonna be the best however it is better than nothing. I recommend you use this if you don't understand how to use the tool.
I will update this if I get a better understanding or if more information is passed down to me to add here. Unless it becomes obsolete.
Download IOS-Il2cppResolver:
Just so you're aware it is not limited to whatever is inside the AssemblyCSharp.dll. It also includes any and all types that is being used within the game including but not limited to UnityEngine types.
Resolving functions from namespaces/classes:
// Get the pointer of the following function from the following Namespace/classe(s)
// Arg1: Namespace/Class path
// Arg2: Method name
// Arg3: Target arguments
// Return: target ptr (in this case 'get_CampType' pointer)
IL2CPP::Class::Utils::GetMethodPointerRVA("GameEngine.BattleSystem.BattleUnitStatus", "get_CampType", 3);
// return -> *function_ptr
// Example of get_CampType
public static void get_CampType(DataCharacter p_DataCharacter, int p_Level = 0, [Optional] Stat p_Stat)
{
return null;
}
// As you can see we have 3 arguments within the target function.
// IF you do not parse the amount of arguments within 'get_CampType' then it can cause an issue with resolving the function. Even the [optional]'s
For some context. The method pointer is returned allowing you to instantly hook as soon as you call the function and the pointer is returned.
Hooking directly after getting target pointer:
// Here we are instantly hooking whatever result is resolved and returned from the GetMethodPointerRVA
HOOK(IL2CPP::Class::Utils::GetMethodPointerRVA("GameEngine.BattleSystem.BattleUnitStatus", "get_CampType", 0), Hget_CampType, old_get_CampType);
// It is recommended you dont do this but instead first get the rva, make sure it is handled then hook it to ensure it doesnt break anything or cause any issues. Remember to parse the argument size where the 0 is. Read above snippet for insight.
Helper.hpp
Going over soon.
Class.hpp
IL2CPP::Class:
Going over soon.
IL2CPP::Class::Utils:
Getting the static field of a class:
int* field = IL2CPP::Class::Utils::GetStaticField("MyClassPath", "myField");
printf(field); // prints the pointer of the field
Setting the static field of a class:
int* cashToSet = 100000;
IL2CPP::Class::Utils::SetStaticField("MyPathToClass", "myField", cashToSet);
// Gets the targeted field then sets the value to it of the targeted pointer in this case 'cashToSet'.
Getting the pointer of a static field of a class:
int* fieldPtr = IL2CPP::Class::Utils::GetFieldOffset("MyPathToClass", "myField");
printf(fieldPtr);
// We resolve the pointer of the field then we print it.
Getting the method pointer of a method:
void* methodPtr = IL2CPP::Class::Utils::GetMethodPointer("MyPathToClass", "MyMethodName"); // resolves the method then returns its pointer
int* intMethodPtr = static_cast<int*>(methodPtr); // We then cast it (I call it a convert) into a pointer
printf("%p\n", static_cast<void*>(intMethodPtr)); // We then print the resulting pointer after convertion
Getting the RVA of a Method:
uint64_t RVA = IL2CPP::Class::Utils::GetMethodPointerRVA("MyPathToClass", "myMethod",0); // already covered above
printf(RVA); // prints the RVA of the method
Getting the param name from specific method index:
void MyMethod(int param1, int param2); // example
char* paramN = MethodGetParamName("MyMethod", 2); // get param2
printf(paramN); // -> "param2"
Getting the param type from specific method index:
void MyMethod(int param1, int param2); // example
char* paramN = MethodGetParamType("MyMethod", 2); // get param2
printf(paramN); // -> "int/integer" (not sure what the actual output would be but you get the idea)
Getting the class from a specific type:
char* Class = ClassFromType("bool"); // get param2
printf(paramN); // -> myClass