Исходник Информация [Reverse-Engineering] Все актуальные изменения в RakNet от Black Russia

gettimeofday

Потрачен
Автор темы
4
23
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В очередной раз всех приветствую.
В этой теме будут регулярно публиковаться все актуальные изменения в RakNet от Black Russia и актуальные версии обхода(под SA:MP и форк RakSAMP), происходить это будет до того момента пока некий персонаж с именем пользователя в своем компьютере "kyrylo" не решится наконец то добавить O-LLVM.
P.S Заранее вам скажу, детекты от их античита и защиты от автобана здесь не будет, я не поощряю ботинг и мои статьи нацелены лишь на усложнение его продолжения на этом проекте.
Все актуальные изменения к текущему моменту:


internals:
#include <windows.h>
#include <iostream>
#include <raknet/BitStream.h>

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

void genauthkey(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, secret, 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.
};

/// sync fixes

struct passengersyncdata
{
    uint16_t VehicleID;
    union
    {
        struct
        {
            uint8_t byteSeatFlags : 7;
            uint8_t byteDriveBy : 1;
        };
        uint8_t seatInfo;
    };
    uint8_t byteCurrentWeapon;
    uint8_t bytePlayerHealth;
    uint8_t bytePlayerArmour;
    uint16_t lrAnalog;
    uint16_t udAnalog;
    uint16_t wKeys;
    float vecPos[3];
};

void passengersync_fix()
{
    passengersyncdata syncData;
    RakNet::BitStream bsData;
    bsData.Read((char*)&syncData, sizeof(passengersyncdata));
    bsData.Write((uint8_t)5);
    bsData.Write(syncData.VehicleID);
    bsData.Write(syncData.byteSeatFlags);
    bsData.Write(syncData.byteCurrentWeapon);
    bsData.Write(syncData.bytePlayerHealth);
    bsData.Write(syncData.bytePlayerArmour);
    bsData.Write(syncData.lrAnalog);
    bsData.Write(syncData.udAnalog);
    bsData.Write(syncData.wKeys);
    bsData.Write(syncData.vecPos[0]);
    bsData.Write(syncData.vecPos[1]);
    bsData.Write(syncData.vecPos[2]);
};

struct onfootsyncdata
{
    uint16_t lrAnalog;
    uint16_t udAnalog;
    uint16_t wKeys;
    float vecPos[3];
    float fQuaternion[4];
    uint8_t byteHealth;
    uint8_t byteArmour;
    uint8_t byteCurrentWeapon;
    uint8_t byteSpecialAction;
    float vecMoveSpeed[3];
    float vecSurfOffsets[3];
    uint16_t wSurfInfo;
    int32_t iCurrentAnimationID;
};

void onfootsync_fix()
{
    onfootsyncdata syncData;
    RakNet::BitStream bsData;
    bsData.Read((char*)&syncData, sizeof(onfootsyncdata));
    bsData.Write((uint8_t)9);
    bsData.Write(syncData.lrAnalog);
    bsData.Write(syncData.udAnalog);
    bsData.Write(syncData.wKeys);
    bsData.Write(syncData.vecPos[0]);
    bsData.Write(syncData.vecPos[1]);
    bsData.Write(syncData.vecPos[2]);
    bsData.Write(syncData.fQuaternion[0]);
    bsData.Write(syncData.fQuaternion[1]);
    bsData.Write(syncData.fQuaternion[2]);
    bsData.Write(syncData.fQuaternion[3]);
    bsData.Write((uint8_t)syncData.byteHealth);
    bsData.Write((uint8_t)syncData.byteArmour);
    bsData.Write(syncData.byteCurrentWeapon);
    bsData.Write(syncData.byteSpecialAction);
    bsData.Write(syncData.vecMoveSpeed[0]);
    bsData.Write(syncData.vecMoveSpeed[1]);
    bsData.Write(syncData.vecMoveSpeed[2]);
    bsData.Write(syncData.vecSurfOffsets[0]);
    bsData.Write(syncData.vecSurfOffsets[1]);
    bsData.Write(syncData.vecSurfOffsets[2]);
    bsData.Write(syncData.wSurfInfo);
    bsData.Write((int32_t)0);
    bsData.Write((uint8_t)255);
};
 
  • Ха-ха
Реакции: Sargon и gravanoo

gravanoo

Участник
46
21
спасибо за гайды. надеюсь скоро получится заработать свои первые жалкие 30-40к
 
  • Клоун
Реакции: gettimeofday

gettimeofday

Потрачен
Автор темы
4
23
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
спасибо за гайды. надеюсь скоро получится заработать свои первые жалкие 30-40к
Дружище, сгоняй поузнавай откуда вирты на радмире появляются и побольше построчи в тг "А ТЫ БОТИШЬ?". Никитка, не занимайся хуйней, ты же и сам знаешь что ты ничего из себя не представляешь
 
  • Ха-ха
  • Вау
Реакции: ARMOR, XRLM и gravanoo