Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос В чем ошибка?

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
6 Мар 2026
Сообщения
59
Реакции
1
0xB8 валид оффсет, но все равно пишет что статик филд инвалид (base - читает)

sassfd:
Expand Collapse Copy
#include "defines.h"
#include "utils/memory/driver.hpp"

#define OFFSET(name, type, offset) inline constexpr type name = offset

namespace il2cpp {
    OFFSET(gchandle, uintptr_t, 0xE7CBF30);
}

namespace basenetworkable {
    OFFSET(typeinfo, uintptr_t, 0xE4910A0);
    OFFSET(static_fields, uintptr_t, 0xB8);
    OFFSET(client_entities, uintptr_t, 0x38);
    OFFSET(entity_list, uintptr_t, 0x10);
    OFFSET(buffer, uintptr_t, 0x18);
};

namespace decrypt {
    uintptr_t Il2cppGetHandle(int32_t ObjectHandleId)
    {
        const uint64_t Index = static_cast<uint64_t>(ObjectHandleId >> 3);
        const uint64_t Table = static_cast<uint64_t>((ObjectHandleId & 7) - 1);

        const uint64_t HandleBase = driver.g_GameAssembly + il2cpp::gchandle;
        const uint64_t TableBase = HandleBase + (Table * 0x28);

        const uint64_t ObjectArrayBase = driver.read<uint64_t>(TableBase + 0x8) + (Index << 3);
        const uint8_t Mode = driver.read<uint8_t>(TableBase + 0x14);

        if (Mode > 1) {
            return driver.read<uint64_t>(ObjectArrayBase);
        }

        uint64_t Val = driver.read<uint64_t>(ObjectArrayBase);
        Val = ~Val;
        if (Val == ~0ULL) return 0;
        return Val;
    }

    uintptr_t client_entity(uintptr_t a1)
    {
        uint32_t v5 = 0, v6 = 0, a2 = 0, a3 = 0;
        uintptr_t v3 = a2, v7, v28 = 0, v29 = 0;

        if (driver.read<UCHAR>(a1 + 16))
        {
            a2 = (uintptr_t)&v28;
            v28 = driver.read<uintptr_t>(a1 + 24);
            a3 = 2;
            do {
                v5 = *(ULONG*)a2;
                a2 += 4LL;
                v6 = ((16 * (v5 - 1146544416)) | ((unsigned int)(v5 - 1146544416) >> 28)) ^ 0x7DF13224;
                *(ULONG*)(a2 - 4) = (v6 << 17) | (v6 >> 15);
                a3 = (unsigned int)(a3 - 1);
            } while ((ULONG)a3);
            v7 = v28;
        }
        else
        {
            v7 = 0;
        }
        v29 = v7;
        if (!v7)
            return 0;
        return Il2cppGetHandle(v7);
    }
}
int main(){

    while (!driver.attach(L"RustClient.exe")) {
        std::cout << "waiting for you start rust...\n" << std::endl;
        Sleep(1000);
    }

    uintptr_t base = driver.read<uintptr_t>(driver.g_GameAssembly + basenetworkable::typeinfo);
    if (!base) {
        std::cout << "[basenetworkable] -> typeinfo invalid.\n";
        return 0;
    }
    uintptr_t static_fields = driver.read<uintptr_t>(base + basenetworkable::static_fields);
    if (!static_fields) {
        std::cout << "[basenetworkable] -> static_fields invalid.\n";
        return 1;
    }
    uintptr_t client_entity_ptr = decrypt::client_entity(static_fields);
    if (!client_entity_ptr) {
        std::cout << "[decrypts] -> client_entity invalid.\n";
        return 2;
    }
    uintptr_t entity_list = driver.read<uintptr_t>(client_entity_ptr + basenetworkable::entity_list);
    if (!entity_list) {
        std::cout << "[basenetworkable] -> entity_list invalid.\n";
        return 3;
    }

    std::cout << std::hex;
    std::cout << "[base] -> 0x" << base << std::endl;
    std::cout << "[static_fields] -> 0x" << static_fields << std::endl;
    std::cout << "[client_entity_ptr] -> 0x" << client_entity_ptr << std::endl;
    std::cout << "[entity_list] -> 0x" << entity_list << std::endl;

    return -1;
}
 
проблема была в том, что я читал начальный адресс + тайпинфо, я убрал чтение и прошло, но мне стало интересно, а почему крашило при чтении? подскажите плз
че нахуй, бляяяяяяя, пиздец я слепой сукааааа, мне изначально писало [decrypts] -> client_entity invalid. я бля вообще хз как увидел в этом [basenetworkable] -> static_fields invalid.

Так то всё шикарно, да, но схуяли то декрипт не работает?

ssdf:
Expand Collapse Copy
#include "defines.h"
#include "utils/memory/driver.hpp"

#define OFFSET(name, type, offset) inline constexpr type name = offset

namespace il2cpp {
    OFFSET(gchandle, uintptr_t, 0xE7CBF30);
}

namespace basenetworkable {
    OFFSET(typeinfo, uintptr_t, 0xE4910A0);
    OFFSET(static_fields, uintptr_t, 0xB8);
    OFFSET(client_entities, uintptr_t, 0x38);
    OFFSET(entity_list, uintptr_t, 0x10);
    OFFSET(buffer, uintptr_t, 0x18);
};

namespace decrypt {
    uintptr_t Il2cppGetHandle(int32_t ObjectHandleId)
    {
        const uint64_t Index = static_cast<uint64_t>(ObjectHandleId >> 3);
        const uint64_t Table = static_cast<uint64_t>((ObjectHandleId & 7) - 1);

        const uint64_t HandleBase = driver.g_GameAssembly + il2cpp::gchandle;
        const uint64_t TableBase = HandleBase + (Table * 0x28);

        const uint64_t ObjectArrayBase = driver.read<uint64_t>(TableBase + 0x8) + (Index << 3);
        const uint8_t Mode = driver.read<uint8_t>(TableBase + 0x14);

        if (Mode > 1) {
            return driver.read<uint64_t>(ObjectArrayBase);
        }

        uint64_t Val = driver.read<uint64_t>(ObjectArrayBase);
        Val = ~Val;
        if (Val == ~0ULL) return 0;
        return Val;
    }
    uintptr_t client_entities(uintptr_t a1) {

        uint32_t eax = 0, ecx = 0, r14d = 0;
        uintptr_t rax = 0, rbx = 0, rcx = a1, rdi = a1;

        rax = driver.read<uintptr_t>(rdi + 0x18);
        uint32_t* rdx = (uint32_t*)&rax;

        for (uint32_t r8d = 2; r8d > 0; --r8d) {
            // UNHANDLED INSTRUCTION: nop [rax], eax
            // UNHANDLED INSTRUCTION: nop [rax+rax*1], ax
            eax = *(uint32_t*)(rdx); // mov eax, [rdx]
            rdx = (uint32_t*)((uint8_t*)rdx + 0x04); // lea rdx, [rdx+0x04]
            eax += 0xFFFFFFFFBBA91EE0; // add eax, 0xBBA91EE0
            ecx = eax; // mov ecx, eax
            eax <<= 0x04; // shl eax, 0x04
            ecx >>= 0x1C; // shr ecx, 0x1C
            ecx |= eax; // or ecx, eax
            ecx ^= 0x7DF13224; // xor ecx, 0x7DF13224
            eax = ecx; // mov eax, ecx
            ecx <<= 0x11; // shl ecx, 0x11
            eax >>= 0x0F; // shr eax, 0x0F
            eax |= ecx; // or eax, ecx
            *((uint32_t*)rdx - 1) = eax; // mov [rdx-0x04], eax
        }

        return Il2cppGetHandle(rax);
    }
}
int main(){

    while (!driver.attach(L"RustClient.exe")) {
        std::cout << "waiting for you start rust...\n" << std::endl;
        Sleep(1000);
    }

    uintptr_t base = driver.read<uintptr_t>(driver.g_GameAssembly + basenetworkable::typeinfo);
    if (!driver.is_valid(base)) {
        std::cout << "[basenetworkable] -> typeinfo invalid.\n";
        return 0;
    }
    uintptr_t static_fields = driver.read<uintptr_t>(base + basenetworkable::static_fields);
    if (!driver.is_valid(static_fields)) {
        std::cout << "[basenetworkable] -> static_fields invalid.\n";
        return 1;
    }
    uintptr_t client_entity_ptr = decrypt::client_entities(static_fields);
    if (!driver.is_valid(client_entity_ptr)) {
        std::cout << "[decrypts] -> client_entity invalid.\n";
        return 2;
    }
    uintptr_t entity_list = driver.read<uintptr_t>(client_entity_ptr + basenetworkable::entity_list);
    if (!driver.is_valid(entity_list)) {
        std::cout << "[basenetworkable] -> entity_list invalid.\n";
        return 3;
    }

    std::cout << std::hex;
    std::cout << "[base] -> 0x" << base << std::endl;
    std::cout << "[static_fields] -> 0x" << static_fields << std::endl;
    std::cout << "[client_entity_ptr] -> 0x" << client_entity_ptr << std::endl;
    std::cout << "[entity_list] -> 0x" << entity_list << std::endl;

    return -1;
}
 
Последнее редактирование:
проблема была в том, что я читал начальный адресс + тайпинфо, я убрал чтение и прошло, но мне стало интересно, а почему крашило при чтении? подскажите плз
че нахуй, бляяяяяяя, пиздец я слепой сукааааа, мне изначально писало [decrypts] -> client_entity invalid. я бля вообще хз как увидел в этом [basenetworkable] -> static_fields invalid.

Так то всё шикарно, да, но схуяли то декрипт не работает?

ssdf:
Expand Collapse Copy
#include "defines.h"
#include "utils/memory/driver.hpp"

#define OFFSET(name, type, offset) inline constexpr type name = offset

namespace il2cpp {
    OFFSET(gchandle, uintptr_t, 0xE7CBF30);
}

namespace basenetworkable {
    OFFSET(typeinfo, uintptr_t, 0xE4910A0);
    OFFSET(static_fields, uintptr_t, 0xB8);
    OFFSET(client_entities, uintptr_t, 0x38);
    OFFSET(entity_list, uintptr_t, 0x10);
    OFFSET(buffer, uintptr_t, 0x18);
};

namespace decrypt {
    uintptr_t Il2cppGetHandle(int32_t ObjectHandleId)
    {
        const uint64_t Index = static_cast<uint64_t>(ObjectHandleId >> 3);
        const uint64_t Table = static_cast<uint64_t>((ObjectHandleId & 7) - 1);

        const uint64_t HandleBase = driver.g_GameAssembly + il2cpp::gchandle;
        const uint64_t TableBase = HandleBase + (Table * 0x28);

        const uint64_t ObjectArrayBase = driver.read<uint64_t>(TableBase + 0x8) + (Index << 3);
        const uint8_t Mode = driver.read<uint8_t>(TableBase + 0x14);

        if (Mode > 1) {
            return driver.read<uint64_t>(ObjectArrayBase);
        }

        uint64_t Val = driver.read<uint64_t>(ObjectArrayBase);
        Val = ~Val;
        if (Val == ~0ULL) return 0;
        return Val;
    }
    uintptr_t client_entities(uintptr_t a1) {

        uint32_t eax = 0, ecx = 0, r14d = 0;
        uintptr_t rax = 0, rbx = 0, rcx = a1, rdi = a1;

        rax = driver.read<uintptr_t>(rdi + 0x18);
        uint32_t* rdx = (uint32_t*)&rax;

        for (uint32_t r8d = 2; r8d > 0; --r8d) {
            // UNHANDLED INSTRUCTION: nop [rax], eax
            // UNHANDLED INSTRUCTION: nop [rax+rax*1], ax
            eax = *(uint32_t*)(rdx); // mov eax, [rdx]
            rdx = (uint32_t*)((uint8_t*)rdx + 0x04); // lea rdx, [rdx+0x04]
            eax += 0xFFFFFFFFBBA91EE0; // add eax, 0xBBA91EE0
            ecx = eax; // mov ecx, eax
            eax <<= 0x04; // shl eax, 0x04
            ecx >>= 0x1C; // shr ecx, 0x1C
            ecx |= eax; // or ecx, eax
            ecx ^= 0x7DF13224; // xor ecx, 0x7DF13224
            eax = ecx; // mov eax, ecx
            ecx <<= 0x11; // shl ecx, 0x11
            eax >>= 0x0F; // shr eax, 0x0F
            eax |= ecx; // or eax, ecx
            *((uint32_t*)rdx - 1) = eax; // mov [rdx-0x04], eax
        }

        return Il2cppGetHandle(rax);
    }
}
int main(){

    while (!driver.attach(L"RustClient.exe")) {
        std::cout << "waiting for you start rust...\n" << std::endl;
        Sleep(1000);
    }

    uintptr_t base = driver.read<uintptr_t>(driver.g_GameAssembly + basenetworkable::typeinfo);
    if (!driver.is_valid(base)) {
        std::cout << "[basenetworkable] -> typeinfo invalid.\n";
        return 0;
    }
    uintptr_t static_fields = driver.read<uintptr_t>(base + basenetworkable::static_fields);
    if (!driver.is_valid(static_fields)) {
        std::cout << "[basenetworkable] -> static_fields invalid.\n";
        return 1;
    }
    uintptr_t client_entity_ptr = decrypt::client_entities(static_fields);
    if (!driver.is_valid(client_entity_ptr)) {
        std::cout << "[decrypts] -> client_entity invalid.\n";
        return 2;
    }
    uintptr_t entity_list = driver.read<uintptr_t>(client_entity_ptr + basenetworkable::entity_list);
    if (!driver.is_valid(entity_list)) {
        std::cout << "[basenetworkable] -> entity_list invalid.\n";
        return 3;
    }

    std::cout << std::hex;
    std::cout << "[base] -> 0x" << base << std::endl;
    std::cout << "[static_fields] -> 0x" << static_fields << std::endl;
    std::cout << "[client_entity_ptr] -> 0x" << client_entity_ptr << std::endl;
    std::cout << "[entity_list] -> 0x" << entity_list << std::endl;

    return -1;
}
мб чейн неправильный
 
Назад
Сверху Снизу