Исходник Информация Гайд [Reverse-Engineering] Стань королём мобильного сампа, и, наконец научись его реверсить! + BLACK RUSSIA BYPASS!!!

gettimeofday

Потрачен
Автор темы
4
20
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всех приветствую.
В этой статье(если ее можно так назвать), я попытаюсь наглядно показать как именно выглядят обходы для мобильных SA:MP серверов, термин "обход" в контексте какого то мобильного сервера вы скорее всего слышали далеко не раз, так как на форуме регулярно появляются темы от разных людей которые пытаются купить эти самые обходы за баснословные сотни тысяч рублей.
И так, что вообще подразумевает в себе этот термин "обход" - Если говорить правильно и корректно с технической точки зрения то это эмуляция мобильного клиента для подключения на мобильные сервера с ПК клиента игры. То есть, ныне мобильные донатные помойки вроде блек раши, матрешки, гранда возомнили себя отдельной игрой и забыли на чем построена их сетевая логика и на основе какой именно игры они были основаны. Поэтому, большинство этих проектов добавляют проверки на то подключается ли юзер с их клиента или нет. Конкретно в этой статье пойдет речь о великой Black Russia(обход на которую сливался уже дважды, ну а в этой статье будет трижды). Собственно, начнём с банальности, попробуем подключиться на сервер с клиента сампа.
1764814179764.png

Ну и как ожидалось никуда я зайти конечно же не смог, то есть вообще, меня даже не попыталось подключить ни до какого пакета. В чем же дело? Ну, теперь перейдем к основной части нашей статьи, для старта нам предстоит вытянуть libsamp.so(или же libblackrussia-client.so) и закинуть его в IDA, как это сделать? Ну ответ настолько прост насколько и вопрос. В моем случае я буду использовать Jadx(smali decoder)
По великому запросу в гугл "СКАЧАТЬ БЛЕК РАША БЕСПЛАТНА БИЗ ЭСМЭСЭ И РЕЕСТРАЦИИ" скачиваем апк этой чудесной игры.
После того как мы скачали это чудо современного мобильного гейминга открываем их лаунчер в Jadx
Здесь нам потребуется вкладка "Ресурсы" жмем по ней.
После заходим в папку "lib" и выбираем нужную нам либу, в моем случае это будет либа под арм32 так как с ней банально проще работать.
После чего жмём на нее ПКМ и нажимаем "Export".
Далее закидываем либу в IDA, и с этого момента начинается ваш великий путь как полудурка без личной жизни в погоне за жалкими 30к рублей в месяц

Действительно крутого и прошаренного реверсера.
После того как вы закинете либу вам придется немного подождать ее анализа.
Вернемся к моменту входа попытки на сервер, как мы помним нас по каким то причинам даже не пытается подключить на сервер не до какого пакета, это происходить может по очень многим причинам, но я выделю основные:
Изменена надёжность отправки пакета, Изменено шифрование пакетов(kyretardizedatagram), Изменен айди первого пакета, Изменены стандартные Cookie которые отправляются при подключении.
И тем временем пока я писал причины по которым подключение может не происходит либа уже проанализировалась, и так, лично мои ставки что дело в шифровании и первом пакете, поэтому сразу переместимся в ProcessNetworkPacket и поищем там первый пакет, как это сделать?
Способ я скажу самый простой, а именно зайти в импорты, то есть сюда:
1764814801909.png

Выбрать тут импорт recvfrom:
1764814815209.png

Нажать по нему дважды, и зайти на его поинтер.
1764814849183.png

где позже нужно будет в случае IDA нажать X, здесь у нас откроются так называемые xrefs(вызовы этой функции в других, если говорить доступным языком) это наш любимый SocketLayer::RecvFrom из исходников раксампа.
И так, после перехода в эту функцию нам нужно будет нажать F5
1764814965287.png

После этого перед нами предстанет так называемый псевдокод, где и будет крыться нужный нам ProcessNetworkPacket, а именно, вот он:
1764815016126.png

Жмём дважды по названию этой функции и переходим в нее.
Пролистав вниз и дойдя до привычного места где обычно находится содержимое первого пакета я уже встречаю изменения, вот они:
1764815089033.png

И так, первое изменение которое попадётся в глаза опытному пользователю: А где мать его samp cookie(0x6969)?
А вот и ответ - их Нет!
Да, стендап был смешным, вернемся к сути, я уже вижу что тут нет 0x6969 и то что айди пакета с привычного 24 изменен на 36, что же делать, что же делать? Правильно, идти и скачивать исходники раксампа с гитхаба(https://github.com/YashasSamaga/RakSAMP), после загрузки нам нужно будет зайти в RakPeer и от туда в ProcessNetworkPacket
я уже добавил параметры чтобы вместо привычных самп куки отправлялись куки блек раши, вот как это выглядит
1764815419342.png

Тоже самое нужно будет сделать в RakPeer::RunUpdateCycle.
Собираем раксамп, и пробуем зайти
1764815707757.png

И вы только посмотрите, в очередной раз ничего не произошло, что не так?
У меня сразу же падают подозрения на шифрование, поэтому пойдем и посмотрим чем оно отличается, найти его можно аналогично ProcessNetworkPacket, только в импорте sendto, в целом я не буду дублировать в очередной раз как это сделать и мы просто перейдем в шифрование.
1764815813640.png

И действительно, отличается, вот как выглядит стандартный:
1764815853173.png

Еще кстати отличается таблица шифрования, это если что вот тут расположено
1764815882936.png

1764815966566.png

И так я добавил нужные изменения и изменил таблицу, собираем и пробуем зайти
1764816015893.png

И чёрт возьми опять ничего! Ну в чем же может быть проблема то-а? В надёжности!
Как это проверить? Достаточно зайти в любой пакет из UpdateNetwork(ProccessNetwork) и посмотреть с какой надёжностью он отправляется, как найти этот самый UpdateNetwork(ProccessNetwork)? В случае с блек рашей нажать в IDA shift + f12, получить список стрингов(нет не трусов) и вписать туда Packet_PlayerSync, это перебросит нас в обработчик синхры с ног.
Обратим внимание на этот момент
1764816170663.png

Для понимания, в сампе нет 1 надёжности, она начинается от 6 и заканчивается до 10, и здесь еще одна загвоздка, во первых не считая того что надёжность изменена, получается что изменен и ее битовый размер, так как число 10 это 4 бита, а число 1 это 3 бита, в общем, путем недолгих размышлений я понял что в блек раше надёжность начинается от 0 и заканчивается до 4, то есть 0 1 2 3 4
1764816292961.png

Я добавил новую надёжность, сейчас нам нужно изменить чтение битов надёжности в ReliabilityLayer, делать это нужно в этой функции
1764816383404.png

Здесь нам необходимо снизить размер битов надёжности с 4 до 3 и понизить ordering channel с 5 битов до 4
Так же, в этой функции нам необходимо изменить чтение битов надёжности и ordering channel
1764816452886.png

Делать это нужно в этом месте

1764816465838.png

И еще тут
1764816929358.png

После замены собираем и проверяем
1764816805235.png

И воуаля! Получаем пакет ауткей(на самом деле я уже достал все измененные пакеты, так как в любом случае все изменения в ракнете будут прикреплены я решил не афишировать). Но стоп, почему тогда не проходим дальше? Да еще и ауткей какой то странный, вернемся к либе, находится он в UpdateNetwork(xref к синхре с ног которую мы ранее нашли) в самом низу под айди 35
1764816978188.png

1764816995670.png

И я уже вижу здесь отличие, в исходниках 69 билда в ауткее обычно вызывается массив с ключами, здесь же его нет, как мы можем видеть dest(прочитанный от сервера размер ауткея) и параметр v7(сам ауткей) переходят в функцию sub_4D368C, вот и сама эта функция:
1764817088242.png

Как уже читатель мог догадаться, это генерация ауткея. Теперь нам нужно восстановить эту самую генерацию назад в с++
(я оставил это за статьей, так как это не самый быстрый процесс, ибо я не с первого раза смог портировать правильное заполнение основной части ауткея из константы unk_189EB8 и поэтому результат сгенерированный портированным алгоритмом отличался от того который ждёт сервер, поэтому вернемся уже к готовому результату)
И так, алгоритм генерации ключа восстановлен
1764817353420.png


1764817570852.png

Генерацию я успешно заменил, собираем и по традиции пробуем зайти.
Судя по логу ауткей успешно прошел, но у меня почему то крашнулся раксамп

[04:06:40.934] Connecting to 80.66.82.46:5125..
[04:06:41.401] [AUTH] HbSUR6dFsJxaOW5UvbP6IUVv -> NQLMNRNGEBGIMGHNGGPMLBIFKOENPRPOICDJGCHNHLAQGOIKBPKMOONNQAMLBJLAEFAPJBJMCEFPMEOCIPLLEECIPOBMIMNI

Скорее всего точнее я даже уверен что что то не так с 34 пакетом, вернёмся в либу и проверим.
1764817744873.png

И действительно, как минимум я уже вижу изменения в challengeAnswer и айди клиент джоина, и самое интересное это то что он больше чем 255, то есть получается его размер теперь 9 бит а не 8 как раньше(после чего был длительный двух часовой подбор всех рпс, я это в очередной раз оставил за статьей, так как попросту бласт хак не поддерживает настолько много фотографий в одной статье, поэтому вернемся уже к изменениям)
То есть, как я уже и сказал айди рпс теперь занимает 9 бит, и нам аналогично с надёжностью нужно заменить чтение битности рпс, делать это нужно в RakPeer::HandleRpcPacket
1764818015683.png

и RakPeer::RPC(тут я уже уперся опять же в лимит бласт хака по фотографиям, но поверьте, смысл никак не отличается от примера выше, переменная называется также)
Ну и после 5 часов трахопорки корыстного время провождения получаем заветный результат:
1764818258339.png

На этом величайшая статья подходит к концу.
P.S заранее рекомендую вам ее сохранить, из-за ее содержимого она скорее всего будет удалена по просьбе тех кто ботит этот ничтожный проект и лутает свои жалкие 30-40к в месяц, так как тут опубликован обход с исходником. Сурс раксампа как и все изменения будут опубликованы ниже. (а, и еще, для тех кто поймет пасхалку моего ника узнает какому именно проекту будет посвящена следующая статья, если эта выживет)

ALL BYPASSES MADE BY gettimeofday | ВСЕ ОБХОДЫ СДЕЛАНЫ gettimeofday
raksamp src: https://dropmefiles.com/T9LfP
raknet internals:

black russia raknet:
#include <windows.h>
#include <iostream>

const uint64_t unk_189EB8[16] = {
    0x43000000591, 0x3DC0000039F, 0x18400000924, 0x8F000000A34,
    0x915000005B2, 0x5F7000007BC, 0xAC500000A26, 0x5F2000005A7,
    0xC470000057B, 0x54700000D88, 0xC1200000E1C, 0x50E000007DD,
    0xEC600000341, 0x5C10000095D, 0x93000000C61, 0x480000009BA
};

void sub_4D368C(char* out, char* in) {
    size_t inlen;
    char* v4;
    size_t inlen2;
    int v6;
    unsigned char* v7;
    int v8;
    int v9;
    int v10;
    uint32_t v11;
    unsigned int v12;
    char v13;
    unsigned char v14;
    unsigned char* v15;
    unsigned int v16;
    int v17;
    uint32_t v18;
    int v19;
    unsigned int v20;
    int v21;
    int v22;
    char* v23;
    int v24;
    char* out1;
    int v27;
    int v28;
    size_t inlen1;
    int v30;
    int v31;
    uint64_t dest[16];
    int v33;
    char buffer[0x100];

    out1 = out;
    inlen = strlen(in);
    if (inlen <= 0x80) {
        v4 = buffer;

        inlen1 = inlen;
        memcpy(v4, in, inlen + 1);
        v4[inlen1] = 0;
        memcpy(dest, unk_189EB8, sizeof(dest));
        inlen2 = inlen1;

        if (inlen1) {
            v6 = (unsigned __int8)*v4;
            if (*v4) {
                v7 = reinterpret_cast<unsigned char*>(v4);
                v8 = -348;
                v9 = 0;
                v10 = 3 * inlen1 - 34;
                if (!(v6 << 24)) goto LABEL_8;

            LABEL_5:
                v11 = ((uint32_t*)dest)[v9];
                v31 = -347 - v9;
                v30 = v9 - inlen2;
                v12 = 0;
                v27 = v8;
                v13 = 4 * (v9 + inlen2);
                v28 = v9;
                do {
                    v14 = v6 + (v12 >> 5);
                    v15 = v7;
                    v7[v12] = v14 + v13;
                    v16 = v14;
                    v7 = v15;
                    v17 = v31 + v12;
                    v18 = (v14 - inlen1) % (v12 + 0xFFFF);
                    v19 = v18 + v10 - ((v16 - (unsigned __int8)v12 + 2 * v16) >> 24) + v11;
                    v6 = v15[++v12];
                    v20 = (4 * v16 - 32) ^ ((v19 ^ (2 * (v30 + (v16 >> 1)))) >> 1);
                    v11 = v17 + v20;
                    inlen2 = inlen1;
                } while (v6);

                v8 = v27;
                v9 = v28;
                v21 = (v27 + v20 + v12) & 0xFFF;

                while (1) {
                    ((uint32_t*)dest)[v9++] = v21;
                    if (v9 == 32) break;
                    v6 = *v7;
                    --v8;
                    if (v6 << 24) goto LABEL_5;
                LABEL_8:
                    v21 = ((uint32_t*)dest)[v9];
                }
            }
            v22 = 31;
            v23 = out1 + 1;
            do {
                v24 = ((uint32_t*)dest)[v22--];
                v23[1] = (v24 & 0xF) + 67;
                *v23 = ((v24 >> 4) & 0xF) + 66;
                v23 += 3;
                *(v23 - 4) = ((v24 >> 8) & 0xF) + 65;
            } while (v22 != -1);
            out1[96] = 0;
        }
    }
}

unsigned char sampEncrTable[256] =
{
    0xDC, 0x4D, 0x34, 0x31, 0x3, 0xB, 0xE4, 0xC8, 0xC7, 0x73,
    0x38, 0xE9, 0xD9, 0x16, 0x80, 0x6, 0xD6, 0x8B, 0x20,
    0x3B, 0x93, 0xEB, 0x11, 0x40, 0xD, 0xC4, 0xDD, 0x77,
    0x8F, 0xA1, 0x18, 0x48, 0x99, 0xBD, 0xDF, 0x27, 0x28,
    0xE, 0x61, 0x4F, 0x53, 0x7F, 0xF0, 0x30, 0xF9, 0x12,
    0x71, 0x62, 0x6A, 0x4B, 0x35, 0x8A, 0xE6, 0xD1, 0xF1,
    0x1D, 0xA8, 0xFA, 0xED, 0xD3, 0xA7, 0x92, 0x0, 0x8E,
    0x52, 0xF8, 0x57, 0x1E, 0x29, 0x24, 0x8D, 0x75, 0x4,
    0x3C, 0x25, 0xCD, 0xA, 0x59, 0xAD, 0x6D, 0x87, 0x2, 0x9E,
    0x15, 0xB9, 0x6C, 0x7C, 0xB7, 0xBC, 0xA9, 0xE7, 0x85,
    0x13, 0xF7, 0x39, 0xE8, 0xC5, 0xCA, 0x50, 0x3A, 0xC0,
    0xA2, 0x5B, 0x8, 0xB8, 0x81, 0xFB, 0xA5, 0x7D, 0xA3,
    0x43, 0x74, 0xEE, 0x76, 0x4A, 0x23, 0x72, 0x3F, 0x1B,
    0x2B, 0xB3, 0x60, 0xBF, 0x2E, 0xAA, 0xEF, 0xFF, 0x17,
    0x64, 0xF2, 0xDB, 0x9D, 0x66, 0x9B, 0xD2, 0xB1, 0xCB,
    0xCC, 0x86, 0x42, 0x84, 0x98, 0xEA, 0xCE, 0x5F, 0x70,
    0xF, 0x1F, 0x36, 0x83, 0xAB, 0xD8, 0xF4, 0x88, 0xC3,
    0x65, 0xAF, 0xA6, 0x82, 0xA4, 0x32, 0x68, 0x2C, 0xDA,
    0x9F, 0x22, 0xC9, 0x55, 0xBE, 0x94, 0x96, 0x41, 0xC,
    0x5A, 0x9A, 0xDE, 0xC1, 0x3E, 0x46, 0x97, 0xE3, 0xE0,
    0x69, 0xB5, 0xA0, 0xF5, 0xB6, 0x10, 0x4C, 0x7B, 0xBA,
    0x1C, 0x49, 0x33, 0x51, 0xFD, 0x63, 0x90, 0x6F, 0x8C,
    0x14, 0x58, 0x5C, 0x4E, 0x6E, 0x1, 0xE5, 0xD0, 0xD7,
    0xAE, 0x1A, 0x7E, 0xC2, 0x19, 0x91, 0x56, 0x9C, 0xB2,
    0x6B, 0xFC, 0x78, 0x2D, 0xB4, 0x9, 0x89, 0xEC, 0x54,
    0xFE, 0x3D, 0x5D, 0x2F, 0x67, 0xD4, 0x47, 0x26, 0xF3,
    0xF6, 0x5, 0x7, 0x45, 0x7A, 0xBB, 0x21, 0x2A, 0xB0, 0xD5,
    0xAC, 0xC6, 0x44, 0xE2, 0x37, 0x79, 0x95, 0xE1, 0xCF,
    0x5E
};

unsigned char encrBuffer[4092];

void kyretardizeDatagram(unsigned char* buf, int len, int port, int unk)
{
    unsigned char v28 = 0;
    unsigned char bChecksum = 0;
    unk = 0;
    bool v27;
    for (int i = 0; i < len; i++)
    {
        unsigned char bData = buf[i];
        bChecksum ^= bData & 0x99;
    }
    encrBuffer[0] = bChecksum;

    unsigned char* buf_nocrc = &encrBuffer[1];
    memcpy(buf_nocrc, buf, len);

    for (int i = 0; i < len; i++)
    {
        v27 = unk == 0;
        unk ^= 1u;

        if (v27)
            v28 = (unsigned __int16)(port ^ 0x5555) >> 8;
        else
            v28 = (unsigned __int8)(port ^ 0x55);

        buf_nocrc[i] = sampEncrTable[buf_nocrc[i]] ^ v28;
    }
}

int RPC_ServerJoin = 316;
int RPC_ServerQuit = 324;
int RPC_InitGame = 367;
int RPC_ClientJoin = 295;
int RPC_NPCJoin = 517;
int RPC_Death = 438;
int RPC_RequestClass = 313;
int RPC_RequestSpawn = 366;
int RPC_SetInteriorId = 339;
int RPC_Spawn = 344;
int RPC_Chat = 371;
int RPC_EnterVehicle = 388;
int RPC_ExitVehicle = 331;
int RPC_DamageVehicle = 431;
int RPC_MenuSelect = 343;
int RPC_MenuQuit = 387;
int RPC_ScmEvent = 376;
int RPC_AdminMapTeleport = 428;
int RPC_WorldPlayerAdd = 340;
int RPC_WorldPlayerDeath = 412;
int RPC_WorldPlayerRemove = 354;
int RPC_WorldVehicleAdd = 328;
int RPC_WorldVehicleRemove = 430;
int RPC_SetCheckpoint = 440;
int RPC_DisableCheckpoint = 421;
int RPC_SetRaceCheckpoint = 338;
int RPC_DisableRaceCheckpoint = 404;
int RPC_UpdateScoresPingsIPs = 393;
int RPC_SvrStats = 386;
int RPC_GameModeRestart = 367;
int RPC_ConnectionRejected = 414;
int RPC_ClientMessage = 386;
int RPC_WorldTime = 365;
int RPC_Pickup = 403;
int RPC_DestroyPickup = 397;
int RPC_DestroyWeaponPickup = 394;
int RPC_Weather = 411;
int RPC_SetTimeEx = 359;
int RPC_ToggleClock = 359;
int RPC_ServerCommand = 321;
int RPC_PickedUpPickup = 370;
int RPC_PickedUpWeapon = 394;
int RPC_VehicleDestroyed = 502;
int RPC_DialogResponse = 514;
int RPC_PlayAudioStream = 369;
int RPC_StopAudioStream = 512;
int RPC_ClickPlayer = 515;
int RPC_PlayerUpdate = 343;
int RPC_ClickTextDraw = 436;
int RPC_MapMarker = 317;
int RPC_PlayerGiveTakeDamage = 389;
int RPC_EnterEditObject = 408;
int RPC_EditObject = 408;

int RPC_ScrSetSpawnInfo = 349;
int RPC_ScrSetPlayerTeam = 396;
int RPC_ScrSetPlayerSkin = 305;
int RPC_ScrSetPlayerName = 437;
int RPC_ScrSetPlayerPos = 392;
int RPC_ScrSetPlayerPosFindZ = 341;
int RPC_ScrSetPlayerHealth = 346;
int RPC_ScrPutPlayerInVehicle = 318;
int RPC_ScrRemovePlayerFromVehicle = 362;
int RPC_ScrSetPlayerColor = 396;
int RPC_ScrDisplayGameText = 427;
int RPC_ScrSetInterior = 368;
int RPC_ScrSetCameraPos = 307;
int RPC_ScrSetCameraLookAt = 357;
int RPC_ScrSetVehiclePos = 435;
int RPC_ScrSetVehicleZAngle = 325;
int RPC_ScrVehicleParams = 311;
int RPC_ScrSetCameraBehindPlayer = 356;
int RPC_ScrTogglePlayerControllable = 301;
int RPC_ScrPlaySound = 369;
int RPC_ScrSetWorldBounds = 347;
int RPC_ScrHaveSomeMoney = 322;
int RPC_ScrSetPlayerFacingAngle = 352;
int RPC_ScrResetMoney = 398;
int RPC_ScrResetPlayerWeapons = 334;
int RPC_ScrGivePlayerWeapon = 402;
int RPC_ScrRespawnVehicle = 430;
int RPC_ScrLinkVehicle = 312;
int RPC_ScrSetPlayerArmour = 342;
int RPC_ScrDeathMessage = 412;
int RPC_ScrSetMapIcon = 320;
int RPC_ScrDisableMapIcon = 666;
int RPC_ScrSetWeaponAmmo = 350;
int RPC_ScrSetGravity = 424;
int RPC_ScrSetVehicleHealth = 373;
int RPC_ScrAttachTrailerToVehicle = 298;
int RPC_ScrDetachTrailerFromVehicle = 337;
int RPC_ScrCreateObject = 401;
int RPC_ScrSetObjectPos = 323;
int RPC_ScrSetObjectRotation = 326;
int RPC_ScrDestroyObject = 335;
int RPC_ScrCreateExplosion = 434;
int RPC_ScrShowNameTag = 434;
int RPC_ScrMoveObject = 310;
int RPC_ScrStopObject = 433;
int RPC_ScrNumberPlate = 509;
int RPC_ScrTogglePlayerSpectating = 422;
int RPC_ScrSetPlayerSpectating = 422;
int RPC_ScrPlayerSpectatePlayer = 416;
int RPC_ScrPlayerSpectateVehicle = 297;
int RPC_ScrRemoveComponent = 419;
int RPC_ScrForceSpawnSelection = 366;
int RPC_ScrAttachObjectToPlayer = 511;
int RPC_ScrInitMenu = 343;
int RPC_ScrShowMenu = 343;
int RPC_ScrHideMenu = 387;
int RPC_ScrSetPlayerWantedLevel = 400;
int RPC_ScrShowTextDraw = 378;
int RPC_ScrHideTextDraw = 363;
int RPC_ScrEditTextDraw = 302;
int RPC_ScrAddGangZone = 358;
int RPC_ScrRemoveGangZone = 332;
int RPC_ScrFlashGangZone = 374;
int RPC_ScrStopFlashGangZone = 385;
int RPC_ScrApplyAnimation = 319;
int RPC_ScrClearAnimations = 306;
int RPC_ScrSetSpecialAction = 309;
int RPC_ScrEnableStuntBonus = 424;
int RPC_ScrSetFightingStyle = 430;
int RPC_ScrSetPlayerVelocity = 343;
int RPC_ScrSetVehicleVelocity = 345;
int RPC_ScrToggleWidescreen = 424;
int RPC_ScrSetVehicleTireStatus = 510;
int RPC_ScrSetPlayerDrunkLevel = 431;
int RPC_ScrDialogBox = 348;
int RPC_ScrCreate3DTextLabel = 327;

enum PacketEnumeration
{
    ID_USER_INTERFACE_SYNC = 1,
    ID_UNOCCUPIED_SYNC = 2,
    ID_VEHICLE_SYNC = 3,
    ID_TURNLIGHTS_SYNC = 4,
    ID_PASSENGER_SYNC = 5,
    ID_AIM_SYNC = 6,
    ID_SPECTATOR_SYNC = 7,
    ID_STATS_UPDATE = 8,
    ID_PLAYER_SYNC = 9,
    ID_TRAILER_SYNC = 10,
    ID_WEAPONS_UPDATE = 11,
    ID_BULLET_SYNC = 12,
    ID_NEW_INCOMING_CONNECTION = 16,
    ID_CONNECTION_LOST = 17,
    ID_DISCONNECTION_NOTIFICATION = 18,
    ID_TIMESTAMP = 19,
    ID_CONNECTION_ATTEMPT_FAILED = 20,
    ID_MODIFIED_PACKET = 21,
    ID_NO_FREE_INCOMING_CONNECTIONS = 22,
    ID_CONNECTION_REQUEST_ACCEPTED = 23,
    ID_PONG = 24,
    ID_CONNECTION_BANNED = 25,
    ID_INVALID_PASSWORD = 26,
    ID_RPC = 29,
    ID_CONNECTED_PONG = 30,
    ID_PING = 31,
    ID_INTERNAL_PING = 32,
    ID_PING_OPEN_CONNECTIONS = 33,
    ID_DETECT_LOST_CONNECTIONS = 34,
    ID_AUTH_KEY = 35,
    ID_OPEN_CONNECTION_REQUEST = 36,
    ID_CONNECTION_REQUEST = 37,
    ID_OPEN_CONNECTION_REPLY = 38,
    ID_REQUEST_STATIC_DATA = 39,
    ID_SECURED_CONNECTION_RESPONSE = 40,
    ID_SECURED_CONNECTION_CONFIRMATION = 41,
    ID_RPC_MAPPING = 42,
    ID_RPC_REPLY = 43,
    ID_BROADCAST_PINGS = 44,
    ID_SET_RANDOM_NUMBER_SEED = 45,
    ID_RSA_PUBLIC_KEY_MISMATCH = 46,
    ID_RECEIVED_STATIC_DATA = 47,
    ID_REMOTE_DISCONNECTION_NOTIFICATION = 48,
    ID_REMOTE_CONNECTION_LOST = 49,
    ID_REMOTE_NEW_INCOMING_CONNECTION = 50,
    ID_REMOTE_EXISTING_CONNECTION = 51,
    ID_REMOTE_STATIC_DATA = 52,
    ID_OPEN_CONNECTION_COOKIE = 53,
    ID_ADVERTISE_SYSTEM = 53,
    ID_INVALID_PASS = 54,
    ID_RCON_COMMAND = 201,
    ID_RCON_RESPONCE = 202,
    ID_MARKERS_SYNC = 208,
};

enum PacketReliability
{
    UNRELIABLE = 0,   /// Same as regular UDP, except that it will also discard duplicate datagrams.  RakNet adds (6 to 17) + 21 bits of overhead, 16 of which is used to detect duplicate packets and 6 to 17 of which is used for message length.
    UNRELIABLE_SEQUENCED = 1,  /// Regular UDP with a sequence counter.  Out of order messages will be discarded.  This adds an additional 13 bits on top what is used for UNRELIABLE.
    RELIABLE = 2,   /// The message is sent reliably, but not necessarily in any order.  Same overhead as UNRELIABLE.
    RELIABLE_ORDERED = 3,   /// This message is reliable and will arrive in the order you sent it.  Messages will be delayed while waiting for out of order messages.  Same overhead as UNRELIABLE_SEQUENCED.
    RELIABLE_SEQUENCED = 4 /// This message is reliable and will arrive in the sequence you sent it.  Out or order messages will be dropped.  Same overhead as UNRELIABLE_SEQUENCED.
};
 

Вложения

  • 1764815933238.png
    1764815933238.png
    96.5 KB · Просмотры: 62
  • 1764817562238.png
    1764817562238.png
    118.6 KB · Просмотры: 63
Последнее редактирование:

MrCreepTon

Неизвестный
Всефорумный модератор
2,359
5,364
P.S заранее рекомендую вам ее сохранить, из-за ее содержимого она скорее всего будет удалена по просьбе тех кто ботит этот ничтожный проект и лутает свои жалкие 30-40к в месяц, так как тут опубликован обход с исходником
Думаю конкуренты ботоводы не разберутся как это скомпилировать и отдадут кому-то 100к за эту задачу.
А статья прикольная, +реп
 

gettimeofday

Потрачен
Автор темы
4
20
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Думаю конкуренты ботоводы не разберутся как это скомпилировать и отдадут кому-то 100к за эту задачу.
А статья прикольная, +реп
Имея готовый исходник не нужно много ума чтобы его собрать, спасибо за отзыв.