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

Вопрос Как правильно искать декрипты?

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
12 Май 2022
Сообщения
220
Реакции
11
Я уже успел поплакать это себе теперь пришла очередь этого форума, почему я не пойду на uc(noad)? потому что я еблан который еле как понимает английский и не может правильно понять что делать

я делаю по гайду отсюда:
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)

я нашёл класс который мне нужен:
BaseNetworkable.%4e06d5458a7804f67326bc5bd9219d983ddfb09a

нашёл адрес: 0xD0C55B8

дальше мне нужно найти в ida это:
.data:000000018D0C55B8 BaseNetworkable_c dq 2001C5C7h ; DATA XREF: sub_180B50F10+23↑o

после псевдокод

я вижу что к v3 присваивается BaseNetworkable_c:
v3 = BaseNetworkable_c;

и где он используется:
Pseudo:
Expand Collapse Copy
  if ( !*(_DWORD *)(BaseNetworkable_c + 224) )

  {

    sub_18063F880(BaseNetworkable_c);

    v3 = BaseNetworkable_c;

  }

  v4 = sub_180B664A0(*(_QWORD *)(*(_QWORD *)(v3 + 184) + 24LL), qword_18D0C55A0);

в итоге получается что v4(sub_180B664A0) это декрипт

я получаю псевдокод и вижу это:
если я правильно понял этот блок кода декрипт:
Pseudo:
Expand Collapse Copy
  if ( *(_BYTE *)(a1 + 16) )
  {
    v4 = &v22;
    v22 = *(_QWORD *)(a1 + 24);
    v5 = 2;
    do
    {
      v6 = *(_DWORD *)v4;
      v4 = (signed __int64 *)((char *)v4 + 4);
      *((_DWORD *)v4 - 1) = ((((v6 + 147996509) ^ 0xEF41CE88) + 1994885345) << 6)
                          | ((((v6 + 147996509) ^ 0xEF41CE88) + 1994885345) >> 26);
      --v5;
    }
    while ( v5 );
    v7 = v22;
  }

я делаю примерный декрипт:
Pseudo:
Expand Collapse Copy
        inline uintptr_t decrypt_basenetworkable(uintptr_t a1)
        {
            if (!MemUtils::read<uint8_t>(a1 + 0x10))
                return 0;

            uint32_t eax_1 = MemUtils::read<uint32_t>(a1 + 0x18);
            uint32_t edx_1 = MemUtils::read<uint32_t>(a1 + 0x1C);

            eax_1 = ((eax_1 + 0x8C8B2D5) ^ 0xEF41CE88 + 0x76A1D5F1);
            eax_1 = (eax_1 << 6) | (eax_1 >> 26);

            edx_1 = ((edx_1 + 0x8C8B2D5) ^ 0xEF41CE88 + 0x76A1D5F1);
            edx_1 = (edx_1 << 6) | (edx_1 >> 26);

            uintptr_t handle = ((uintptr_t)edx_1 << 32) | eax_1;
            return il2cppgethandle((int32_t)handle);
        }}

что я получаю в итоге это только хуй во рту

может проблема в il2cppgethandle?
используя этот гайд:
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
я нахожу это: sub_1806425D0

что я делаю дальше:
если правильно понимать то unk_18D3B3170 это наш оффсет? тогда 0x18D3B3170 это наш offset, дальше мы делаем decrypt:
Pseudo:
Expand Collapse Copy
        inline uintptr_t il2cppgethandle(int32_t ObjectHandleID)
        {
            uint64_t rdi_1 = (uint64_t)(ObjectHandleID >> 3);
            uint64_t rcx_1 = (uint64_t)((ObjectHandleID & 7) - 1);
            if (rcx_1 > 3)
                return 0;

            uintptr_t rsi_1 = MemUtils::read<uintptr_t>((rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x8));
            uint32_t ecx_2 = MemUtils::read<uint32_t>((rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x10));
            if ((uint32_t)rdi_1 >= ecx_2)
                return 0;

            uint32_t eax_1 = MemUtils::read<uint32_t>(rsi_1 + 4 * ((rdi_1 >> 5)));
            if (((eax_1 >> (rdi_1 & 0x1F)) & 1) == 0)
                return 0;

            uintptr_t rdi_2 = (rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x8) + (rdi_1 << 3);
            uint8_t cl_1 = MemUtils::read<uint8_t>((rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x14));

            if (cl_1 > 1)
                return MemUtils::read<uintptr_t>(rdi_2);

            uint32_t eax_2 = MemUtils::read<uint32_t>(rdi_2);
            eax_2 = ~eax_2;
            return eax_2;
        }

вроде всё хорошо но я уже полностью перестал понимать что хорошо а что не так. можете меня тыкнуть мордой в место в котором я ошибся
 
Последнее редактирование:
^ имеет меньший приоритет чем +, также лучше добавь промежуточные логи чтоб точно знать где проблема , также в ориге: v6 + 147996509 а у тебя eax_1 + 0x8C8B2D5 но должно быть 8D2 3F5D
 
Последнее редактирование:
у меня всё равно немного чёта не выходит, для примера я взял сурс kingvone:
мои декрипты:
Decrypt:
Expand Collapse Copy
namespace Offsets {
    inline auto Il2cpp_GetHandle = 0x18D3B3170;
    inline auto BaseNetworkable = 0xD0C55B8;

    namespace decrypts {
        inline uintptr_t il2cppgethandle(int32_t ObjectHandleID)
        {
            uint64_t rdi_1 = (uint64_t)(ObjectHandleID >> 3);
            uint64_t rcx_1 = (uint64_t)((ObjectHandleID & 7) - 1);
            if (rcx_1 > 3)
                return 0;

            uintptr_t rsi_1 = MemUtils::read<uintptr_t>((rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x8));
            uint32_t ecx_2 = MemUtils::read<uint32_t>((rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x10));
            if ((uint32_t)rdi_1 >= ecx_2)
                return 0;

            uint32_t eax_1 = MemUtils::read<uint32_t>(rsi_1 + 4 * ((rdi_1 >> 5)));
            if (((eax_1 >> (rdi_1 & 0x1F)) & 1) == 0)  
                return 0;

            uintptr_t rdi_2 = (rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x8) + (rdi_1 << 3);
            uint8_t cl_1 = MemUtils::read<uint8_t>((rcx_1 * 0x28) + (GameAssembly + Il2cpp_GetHandle + 0x14));

            if (cl_1 > 1)
                return MemUtils::read<uintptr_t>(rdi_2);

            uint32_t eax_2 = MemUtils::read<uint32_t>(rdi_2);
            eax_2 = ~eax_2;
            return eax_2;
        }

        inline uintptr_t decrypt_fieldhandle(uintptr_t field_ptr)
        {
            if (!MemUtils::read<uint8_t>(field_ptr + 0x10))
                return 0;

            uint32_t eax_1 = MemUtils::read<uint32_t>(field_ptr + 0x18);
            uint32_t edx_1 = MemUtils::read<uint32_t>(field_ptr + 0x1C);

            eax_1 = ((eax_1 + 147996509) ^ 0xEF41CE88) + 0x76A1D5F1;
            eax_1 = (eax_1 << 6) | (eax_1 >> 26);

            edx_1 = ((edx_1 + 147996509) ^ 0xEF41CE88) + 0x76A1D5F1;
            edx_1 = (edx_1 << 6) | (edx_1 >> 26);

            uintptr_t handle = ((uintptr_t)edx_1 << 32) | eax_1;
            return il2cppgethandle((int32_t)handle);
        }

    }
}

и мой код рендера(база улучшенный kingvone):
Render:
Expand Collapse Copy
    if (currentTime >= ObjectsUpdateTime) {
        Players.Clear();
        NPCs.Clear();

        uintptr_t basenet_class = MemUtils::read<uintptr_t>(GameAssembly + Offsets::BaseNetworkable);
        if (!MemUtils::IsValidCheck((void*)basenet_class))
            goto end_update;

        uintptr_t field_info = MemUtils::read<uintptr_t>(basenet_class + 0xB8);
        if (!MemUtils::IsValidCheck((void*)field_info))
            goto end_update;

        uintptr_t basenet_obj = Offsets::decrypts::decrypt_fieldhandle(field_info);
        if (!MemUtils::IsValidCheck((void*)basenet_obj))
            goto end_update;

        uintptr_t entityrealm = MemUtils::read<uintptr_t>(basenet_obj + 0x20);
        if (!MemUtils::IsValidCheck((void*)entityrealm))
            goto end_update;

        uintptr_t entities_array = MemUtils::read<uintptr_t>(entityrealm + 0xA0);
        int entity_count = MemUtils::read<int32_t>(entityrealm + 0x10);
        if (!MemUtils::IsValidCheck((void*)entities_array) || entity_count <= 0)
            goto end_update;

        for (int i = 0; i < entity_count; i++) {
            int32_t handle = MemUtils::read<int32_t>(entities_array + i * 4);
            uintptr_t entity_obj = Offsets::decrypts::il2cppgethandle(handle);
            if (!MemUtils::IsValidCheck((void*)entity_obj))
                continue;

            auto gameobj = MemUtils::read<Unity::GameObject*>(entity_obj + 0x30);
            if (!MemUtils::IsValidCheck(gameobj))
                continue;

            auto ObjectName = gameobj->get_name();
            if (!MemUtils::IsValidCheck(ObjectName))
                continue;

            if (ObjectName->Contains(_(L"LocalPlayer")) && !MemUtils::IsValidCheck(LocalPlayer)) {
                LocalPlayer = (BasePlayer*)gameobj->GetComponent((Unity::Type*)il2cpp::TypeGetObject(_(""), _("BasePlayer")));
            }

            if (ObjectName->Contains(_(L"player/player.prefab"))) {
                auto Player = (BasePlayer*)gameobj->GetComponent((Unity::Type*)il2cpp::TypeGetObject(_(""), _("BasePlayer")));
                if (!MemUtils::IsValidCheck(Player))
                    continue;
                Players.Add((uintptr_t)Player);
            }

            if (ObjectName->Contains(_(L"scientist")) || ObjectName->Contains(_(L"npc"))) {
                auto NPC = (BasePlayer*)gameobj->GetComponent((Unity::Type*)il2cpp::TypeGetObject(_(""), _("BasePlayer")));
                if (!MemUtils::IsValidCheck(NPC))
                    continue;

                auto cached = NPCDataCache.Get((uintptr_t)NPC);
                if (cached && cached->name[0] == 0) {
                    auto npcName = NPC->GetName();
                    if (MemUtils::IsValidCheck((void*)npcName)) {
                        int len = 0;
                        while (len < 63 && npcName[len] != 0) {
                            cached->name[len] = npcName[len];
                            len++;
                        }
                        cached->name[len] = 0;
                    }
                    else {
                        const wchar_t* defaultName = _(L"Scientist");
                        int len = 0;
                        while (len < 63 && defaultName[len] != 0) {
                            cached->name[len] = defaultName[len];
                            len++;
                        }
                        cached->name[len] = 0;
                    }
                }
                NPCs.Add((uintptr_t)NPC);
            }
        }

    end_update:
        PlayerDataCache.InvalidateMissing(&Players);
        NPCDataCache.InvalidateMissing(&NPCs);
        ObjectsUpdateTime = currentTime + 0.5f;
    }

но есть проблема в том что у меня не получается всё равно, извиняюсь за свою тупость, но я из тех людей которым пока лицом в ошибку не тыкнешь не поймёшь в чём проблема и ошибка
 
смотри у тебя такая же проблема с 0x76A1D5F1 используй тоже в dec как у тебя в ida 1994885345 ну или 76E7 88E1, также добавь printf пару чтоб понять где именно краш
 
Назад
Сверху Снизу