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