Начинающий
- Статус
- Оффлайн
- Регистрация
- 6 Ноя 2022
- Сообщения
- 138
- Реакции
- 9
для начала в дампе ищем:
"class BaseNetworkable.%" в котором будет чтото подобное:
копируем полное название класса, в нашем случае "BaseNetworkable.%b6e7495bc2868ce199b342d4aec0a2483c23de6e"
ищем "BaseNetworkable.%b6e7495bc2868ce199b342d4aec0a2483c23de6e_TypeInfo" находим, берем его адрес "219897672"
переводим в hex и переходим в иду
переходим по нашему адресу + get_imagebase()
открываем хревы и выбираем любой попавшейся
перед нами открывается вот такая картина:
где 0x40 - нужный наш clientEntities, он находится под криптом, что найти декрипт нужно перейти по сабу левее, в нашем случае sub_180E6DDF0
перейдя по сабу увидем:
1 это нужный нам декрипт и ниже il2cpp_get_handle, который нам тоже понадобится, в случае если вы external.
далее нам нужен entityList, который тоже находится под криптом, чтобы получить его, мы возвращаемся в предыдущий саб и ищем где вызывается v13
находим его ниже
переходим по сабу sub_184DAEDE0 и сразу же видим v4 = sub_181BC94F0(*(_QWORD *)(a1 + 0x10), qword_18D249660); где 0x10 - и есть криптнутый entityList
тут же находится наш декрипт entityList:
далее нам нужно найти буфер листа, сделать это можно, вернуться назад и просто пролистав немного ниже:
в итоге list - 0x18
list buffer - 0x10
list size - 0x18
в конце концов мы получаем такой код
"class BaseNetworkable.%" в котором будет чтото подобное:
копируем полное название класса, в нашем случае "BaseNetworkable.%b6e7495bc2868ce199b342d4aec0a2483c23de6e"
ищем "BaseNetworkable.%b6e7495bc2868ce199b342d4aec0a2483c23de6e_TypeInfo" находим, берем его адрес "219897672"
переводим в hex и переходим в иду
переходим по нашему адресу + get_imagebase()
открываем хревы и выбираем любой попавшейся
перед нами открывается вот такая картина:
где 0x40 - нужный наш clientEntities, он находится под криптом, что найти декрипт нужно перейти по сабу левее, в нашем случае sub_180E6DDF0
перейдя по сабу увидем:
1 это нужный нам декрипт и ниже il2cpp_get_handle, который нам тоже понадобится, в случае если вы external.
далее нам нужен entityList, который тоже находится под криптом, чтобы получить его, мы возвращаемся в предыдущий саб и ищем где вызывается v13
находим его ниже
переходим по сабу sub_184DAEDE0 и сразу же видим v4 = sub_181BC94F0(*(_QWORD *)(a1 + 0x10), qword_18D249660); где 0x10 - и есть криптнутый entityList
тут же находится наш декрипт entityList:
далее нам нужно найти буфер листа, сделать это можно, вернуться назад и просто пролистав немного ниже:
в итоге list - 0x18
list buffer - 0x10
list size - 0x18
в конце концов мы получаем такой код
итоговый код:
uint64_t decrypt_client_entities(uint64_t encrypted)
{
signed __int64 *v4; // rdx
int v5; // r8d
int v6; // eax
signed __int64 v7; // rcx
signed __int64 v22;
v4 = &v22;
v22 = memory::read<uint64_t>(encrypted + 24);
v5 = 2;
do
{
v6 = *(_DWORD *)v4;
v4 = (signed __int64 *)((char *)v4 + 4);
*((_DWORD *)v4 - 1) = (((v6 - 1544952125) << 14) | ((unsigned int)(v6 - 1544952125) >> 18)) - 1794566037;
--v5;
}
while ( v5 );
v7 = v22;
return il2cpp_get_handle(v7);
}
uint64_t decrypt_entities_list(uint64_t encrypted) {
signed __int64 *v4; // rdx
int v5; // r8d
int v6; // eax
unsigned int v7; // eax
signed __int64 v8; // rcx
signed __int64 v23;
v4 = &v23;
v23 = memory::read<uint64_t>(encrypted + 24);
v5 = 2;
do
{
v6 = *(_DWORD *)v4;
v4 = (signed __int64 *)((char *)v4 + 4);
v7 = (((v6 - 879541231) << 25) | ((unsigned int)(v6 - 879541231) >> 7)) - 1602652980;
*((_DWORD *)v4 - 1) = (v7 << 23) | (v7 >> 9);
--v5;
}
while ( v5 );
v8 = v23;
return il2cpp_get_handle(v8);
}
uint64_t base_networkable_c = memory::read<uint64_t>(memory::modules::game_assembly + 0xD1B5F48);
uint64_t base_networkable = memory::read<uint64_t>(base_networkable_c + 0xb8);
uint64_t encrypted_client_entities = memory::read<uint64_t>(base_networkable + 0x40);
uint64_t client_entities = decrypt_client_entities(encrypted_client_entities);
uint64_t encrypted_entities_list = memory::read<uint64_t>(client_entities + 0x10);
uint64_t entities_list = decrypt_entitie_list(encrypteds_entitie_list);
uint64_t list = memory::read<uint64_t>(entities_list + 0x18);
uint32_t list_size = memory::read<uint32_t>(list + 0x18);
uint64_t list_buffer = memory::read<uint64_t>(list + 0x10);
for ( int i = 0; i < list_size; i++){
uint64_t player = memory::read<uint64_t>(list_buffer + 0x20 + ( i * 0x8 ) );
}
берем оффсет (сейчас он 0x490)
переименовываем для удобства крипченное название в <> в ItemID
далее переходим к поиску public ItemID % в классе BasePlayer находим любой попавшийся, и переходим по его адресу в иде
зачастую оно выглядит вот так:
но моментами там идет отдельным сабом
в итоге получаем:
переименовываем для удобства крипченное название в <> в ItemID
далее переходим к поиску public ItemID % в классе BasePlayer находим любой попавшийся, и переходим по его адресу в иде
зачастую оно выглядит вот так:
но моментами там идет отдельным сабом
в итоге получаем:
итоговый код:
uint64_t decrypt_cl_active_item( uint64_t encrypted ) {
int *v3; // rdx
int v4; // r8d
int v5; // eax
__int128 v9;
v3 = (int *)&v9;
v4 = 2;
v9 = encrypted;
do
{
v5 = *v3++;
*(v3 - 1) = (((v5 - 39167478) << 8) | ((unsigned int)(v5 - 39167478) >> 24)) - 813727899;
--v4;
}
while ( v4 );
return v9;
}
uint64_t encrypted_cl_active = memory::read<uint64_t>(player + 0x490);
uint64_t decrypted_cl_active = decrypt_cl_active_item(encrypted_cl_active);
для этого можем просто использовать GetComponent или же:
переходим в класс BasePlayer и ищем подобную функцию:
берем адрес и прыгаем в иду:
и видем такое:
переходим по сабу sub_1812562B0:
производим некие манипуляции и получаем:
с PlayerInventory делаем тоже самое
переходим в класс BasePlayer и ищем подобную функцию:
берем адрес и прыгаем в иду:
и видем такое:
переходим по сабу sub_1812562B0:
производим некие манипуляции и получаем:
код:
uint64_t decrypt_player_eyes ( uint64_t encrypted ) {
signed __int64 *v4; // rdx
int v5; // r8d
int v6; // eax
signed __int64 v7; // rcx
v4 = &v22;
v22 = *(_QWORD *)(encrypted + 24);
v5 = 2;
do
{
v6 = *(_DWORD *)v4;
v4 = (signed __int64 *)((char *)v4 + 4);
*((_DWORD *)v4 - 1) = (((v6 - 504983963) << 21) | ((unsigned int)(v6 - 504983963) >> 11)) + 1214266128;
--v5;
}
while ( v5 );
v7 = v22;
return il2cpp_get_handle(v7);
}
uint64_t encrypted_eyes = memory::read<uint64_t>(player + 0x310);
uint64_t eyes = decrypt_player_eyes(encrypted_eyes);
пишу это для тех, кто не знал этого раньше и хотелось бы разбавить данный форум
а так в итоге хочу сказать, впервые пишу вообще какой либо гайд, если гдето ошибся поправляйте <3

