Начинающий
- Статус
- Оффлайн
- Регистрация
- 26 Апр 2025
- Сообщения
- 59
- Реакции
- 1
Мои декрипты на v2621 (21958632)
Оффсеты можете не просить, любой даун их найдет.
Оффсеты можете не просить, любой даун их найдет.
C++:
namespace decryptions {
inline uint64_t Il2cppGetHandle(int32_t ObjectHandleID) {
uint64_t index = ObjectHandleID >> 3;
uint64_t offset = (ObjectHandleID & 7) - 1;
uint64_t baseAddr = globals::game_assembly + offsets::Il2cppHandle + offset * 0x28;
uint32_t limit = m.read<uint32_t>(baseAddr + 0x10);
if (index >= limit) return 0;
uintptr_t objAddr = m.read<uintptr_t>(baseAddr);
if (!objAddr) return 0;
uint32_t bitMask = m.read<uint32_t>(objAddr + ((index >> 5) << 2));
if (!(bitMask & (1 << (index & 0x1f)))) return 0;
uintptr_t ObjectArray = m.read<uintptr_t>(baseAddr + 0x8) + (index << 3);
return m.read<uint8_t>(baseAddr + 0x14) > 1 ? m.read<uintptr_t>(ObjectArray) : static_cast<uint64_t>(static_cast<uint32_t>(~m.read<uint32_t>(ObjectArray)));
}
// Decrypt client entities (first key)
inline uint64_t decrypt_client_entities(uint64_t a1) {
if (!a1 || a1 < 0x10000) return 0;
uint32_t r8d = 0, eax = 0, ecx = 0;
uintptr_t rax = m.read<uintptr_t>(a1 + 0x18);
if (!rax || rax < 0x10000) return 0;
uintptr_t* rdx = &rax;
r8d = 0x02;
do {
ecx = *(uint32_t*)(rdx);
rdx = (uintptr_t*)((char*)rdx + 0x04);
ecx += 0x2B1979B2;
ecx ^= 0xDB4EE95A;
eax = ecx;
ecx <<= 0x14;
eax >>= 0x0C;
eax |= ecx;
*((uint32_t*)rdx - 1) = eax;
r8d -= 0x01;
} while (r8d);
return Il2cppGetHandle(static_cast<int32_t>(rax));
}
// Decrypt entity list (second key)
inline uint64_t decrypt_entity_list(uint64_t a1) {
if (!a1 || a1 < 0x10000) return 0;
uint32_t r8d = 0, eax = 0, ecx = 0;
uintptr_t rax = m.read<uintptr_t>(a1 + 0x18);
if (!rax || rax < 0x10000) return 0;
uintptr_t* rdx = &rax;
r8d = 0x02;
do {
ecx = *(uint32_t*)(rdx);
eax = *(uint32_t*)(rdx);
rdx = (uintptr_t*)((char*)rdx + 0x04);
eax <<= 0x05;
ecx >>= 0x1B;
ecx |= eax;
ecx += 0x98CEA3D;
eax = ecx;
ecx <<= 0x0E;
eax >>= 0x12;
eax |= ecx;
eax += 0x2F0E9DEE;
*((uint32_t*)rdx - 1) = eax;
r8d -= 0x01;
} while (r8d);
return Il2cppGetHandle(static_cast<int32_t>(rax));
}
// Decrypt player inventory (working version)
inline uint64_t decrypt_player_inventory(uint64_t a1) {
if (!a1 || a1 < 0x10000) return 0;
uint64_t rax = m.read<uint64_t>(a1 + 0x18);
if (!rax || rax < 0x10000) return 0;
uint32_t* ptr = (uint32_t*)&rax;
int counter = 2;
do {
uint32_t val = *ptr;
val = ((val ^ 0x2712E737) - 0x7173C5AC) ^ 0x5EC0AE19;
val -= 0x1916B3A4;
*ptr = val;
++ptr;
--counter;
} while (counter);
return Il2cppGetHandle(static_cast<int32_t>(rax));
}
// Decrypt clActiveItem (ulong key)
inline uint64_t decrypt_cl_active_item(uint64_t a1) {
if (!a1 || a1 < 0x1000) return 0;
uint64_t result = a1;
uint32_t* ptr = (uint32_t*)&result;
int counter = 2;
do {
uint32_t val = *ptr;
val += 0xC5BDE933;
val = (val >> 0x08) | (val << 0x18);
val += 0x05959A37;
*ptr = val;
++ptr;
--counter;
} while (counter);
return result;
}
// Decrypt player eyes (if needed)
inline uint64_t decrypt_player_eyes(uint64_t a1) {
if (!a1 || a1 < 0x10000) return 0;
uint32_t r8d = 0, eax = 0, ecx = 0;
uintptr_t rax = m.read<uintptr_t>(a1 + 0x18);
if (!rax || rax < 0x10000) return 0;
uintptr_t* rdx = &rax;
r8d = 0x02;
do {
ecx = *(uint32_t*)(rdx);
eax = *(uint32_t*)(rdx);
rdx = (uintptr_t*)((char*)rdx + 0x04);
ecx >>= 0x04;
eax <<= 0x1C;
ecx |= eax;
ecx -= 0x2ADDD303;
ecx ^= 0x749ED3AD;
eax = ecx;
ecx <<= 0x10;
eax >>= 0x10;
eax |= ecx;
*((uint32_t*)rdx - 1) = eax;
r8d -= 0x01;
} while (r8d);
return Il2cppGetHandle(static_cast<int32_t>(rax));
}
}
#endif
