This is the AMP version of this page.
If you want to load the real page instead, click this text.

Discussion error in the code

Ccb0y

Platinian
I'm trying to get instances of a class and it keeps crashing.


C++:
#define IL2CPP_MODULE OBFUSCATE("libil2cpp.so")

typedef int64_t (__fastcall* UnityFindObjectOfTypeFunc)(int64_t type);
typedef int64_t (__fastcall* System_Type_GetTypeFunc)(int64_t a1);

UnityFindObjectOfTypeFunc FindObjectOfType =
        reinterpret_cast<UnityFindObjectOfTypeFunc>(reinterpret_cast<char*>(findLibrary("libil2cpp.so")) + 0x15EA128);
System_Type_GetTypeFunc GetTypeFunc =
        reinterpret_cast<System_Type_GetTypeFunc>(reinterpret_cast<char*>(findLibrary("libil2cpp.so")) + 0xDE0D7C);







template <typename T>
struct monoArray
{
    void* klass;
    void* monitor;
    void* bounds;
    int   max_length;
    void* vector[1];
    int getLength()
    {
        return max_length;
    }
    T getPointer()
    {
        return (T)vector;
    }
};
typedef struct _monoString
{
    void* klass;
    void* monitor;
    int length;
    char chars[1];

    int getLength()
    {
        return length;
    }

    std::string getChars()
    {
        return std::string(chars, length * 2);
    }
} monoString;



monoString* CreateMonoString(const char* str) {
    size_t len = std::strlen(str);
    monoString* ms = (monoString*)std::malloc(sizeof(monoString) + len);
    if (ms) {
        ms->length = (int)len;
        std::memcpy(ms->chars, str, len);
    }
    return ms;
}


void* GetType(monoString* typeStr) {
    DWORD addrVal = getAbsoluteAddress(IL2CPP_MODULE, Offsets::UnityEngine::oGetType);
    void* addr = reinterpret_cast<void*>(addrVal);
    auto fn = reinterpret_cast<void* (*)(monoString*)>(addr);
    if (!fn) {
        LOGI("GetType function pointer is null\n");
        return nullptr;
    }
    return fn(typeStr);
}


monoArray<void**>* FindObjectsOfType(void* type) {
    DWORD addrVal = getAbsoluteAddress(IL2CPP_MODULE, Offsets::UnityEngine::oFindObjectOfType);
    void* addr = reinterpret_cast<void*>(addrVal);
    auto fn = reinterpret_cast<monoArray<void**>* (*)(void*)>(addr);
    if (!fn) {
        LOGI("FindObjectsOfType function pointer is null\n");
        return nullptr;
    }
    return fn(type);
}
void Test() {

    monoString* enemyAIStr = CreateMonoString("EnemyAI");
    if (!enemyAIStr) {
        LOGI("Failed to create monoString for EnemyAI\n");
        return;
    }

 
    void* type = GetType(enemyAIStr);
    if (!type) {
        LOGI("GetType returned null\n");
        return;
    }
//
//   
//    monoArray<void**>* objEnemyAI = FindObjectsOfType(type);
//    if (!objEnemyAI) {
//        LOGI("objEnemyAI NOT FOUND!\n");
//        return;
//    }
//
//    int length = objEnemyAI->getLength();
//    void** objects = objEnemyAI->getPointer();
//    for (int j = 0; j < length; j++) {
//        void* object = objects[j];
//        if (object) {
//            LOGI("FOUND: %p\n", object);
//        }
//    }
    int64_t result = FindObjectOfType((reinterpret_cast<int64_t>(type)));
    LOGI("FindObjectOfType returned: %lld\n", result);
}

I'm using a template from: GitHub - seedhollow/IL2CppAndroid: Android Mod Menu Template based on LGL Mod Menu

C++:
#define IL2CPP_MODULE OBFUSCATE("libil2cpp.so")

void hook_thread() {
    


}


void *hack_thread(void *) {
    LOGI(OBFUSCATE("pthread created"));

 

 
    do {
        sleep(1);
    } while (!KittyMemory::getLibraryMap(IL2CPP_MODULE).isValid());

    LOGI(OBFUSCATE("%s has been loaded"), (const char *) IL2CPP_MODULE);
    LOGI(OBFUSCATE("Trying to hook in il2cpp now..."));

    

    UnityResolve::Init(dlopen(IL2CPP_MODULE, RTLD_NOW));

    
    LOGI(OBFUSCATE("Starting hooks"));
    hook_thread();
    return NULL;
}

__attribute__((constructor))
void init() {
  
    pthread_t ptid;
    pthread_create(&ptid, NULL, hack_thread, NULL);
}