Гайд [DECRYPT] Как в EFT получить информацию о игроке (K/D, LVL, etc...)

На самом деле я Zodiak
Участник
Статус
Онлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
Опираясь на статью
Пожалуйста, авторизуйтесь для просмотра ссылки.
я разобрался как же все таки получать эти данные, ведь статья больше обобщенная.

У нас есть функция которая декриптит ответ от сервера посредством AES \uE2BC.\uE001, посмотрев как фукнция работает изнутри, можно заметить что она использует только static fields, и статические функции, так что класс в котором она вызывается можно не искать а просто в rcx запихать 0
DecryptFunc.png
Так же нам нужна декомпрессия, потому что зашифрованный запрос приходит закомпрессированный ZLIB, и в фукнции \uE2BC.\uE007 можно увидеть как в игре она декомпрессируется и выплевывает нашу расшифрованную строку.
Decompress.png

Нам потребуется функция E001 и статик функция DecompressNonAlloc, а так же что бы наша E001 приняла наши данные, нужно сформировать mono_array.
C++:
unity_string get_decrypted_responce( char* data, int length )
{
    auto mono_array_new = reinterpret_cast< __int64( * )( uintptr_t domain, uintptr_t byteclass, __int64 size ) >( mono_base + 0xB3E50 ); //B3E50
    auto mono_domain = *( uintptr_t* ) ( mono_base + 0x499C78 );
    auto mono_byte_class = *( uintptr_t* ) ( mono_base + 0x4A21B0 );
    auto mono_array_addr_with_size = reinterpret_cast< uintptr_t ( * )( uintptr_t, int, __int64 ) > ( mono_base + 0xB39E0 );

    auto decompress_no_alloc = reinterpret_cast< uintptr_t ( * )( uintptr_t array_address, int size, uintptr_t null ) >( decompress_zlib_address );
    auto uE001 = reinterpret_cast< uintptr_t ( * )( uintptr_t cipherText, uintptr_t, unity_string* ) >( decrypt_address );
   
    auto Crypted_array = mono_array_new ( mono_domain, mono_byte_class, length );//создаем array
    LI_FN ( memcpy ).get ( )( ( void* ) mono_array_addr_with_size ( Crypted_array, sizeof ( uint8_t ), 0 ), data, length );

    unity_string crypt = unity_string(xorstr_(L"aes"));
    uintptr_t result = uE001 ( 0, Crypted_array, &crypt );
    uintptr_t result_text = decompress_no_alloc ( result, data, 0 );
    return (unity_string)result_text;
}

Заебись. С декриптом покончено, но что бы декриптить что то, это что то надо получить. А без правильно сформированного запроса мы не получим данные, которые надо декриптить.
запрос идет на ссылку
Пожалуйста, авторизуйтесь для просмотра ссылки.

Проанализировав хедеры запроса продебажив UnityWebRequests.SetRequestHeader я нашел 5 необходимых хедеров.

Код:
User-Agent: UnityPlayer/2019.4.39f1 (UnityWebRequest/1.0, libcurl/7.80.0-DEV)
Content-Type: application/json
App-Version: EFT Client 0.14.6.0.29862
GClient-RequestId: 24 (не особо важен но я без него иногда получал не валид ответ)
Cookie: PHPSESSID=вашphpsessid
так же в теле запроса должен быть JSON, с аккаунт айдишником
JSON:
{"accountId":"айди"}
PHPSESSID можно получить вызвав \uE2C3.get_PhpSessionId, функция статическая, так что проблем с ней не возникнет.
accountId можно получить из самого игрока, ObservedPlayerView + 0x50, это unity_string*
на этом все.

(Но всем будет похуй на статью потому что форум пора переименовать в PasteExpensive.biz)
 
Сверху Снизу