Как отправить серверу фейк инфу?

caing

Известный
Автор темы
43
6
Версия MoonLoader
.026-beta
Как отправить фейк инфу, что я пассажир, а не водитель?
 

Vintik

Через тернии к звёздам
Проверенный
1,556
1,027
Вот гитхаб SAMP.Lua (во-первых, тебе надо скачать и установить эту библиотеку отсюда)
Переходишь в samp.lua -> samp -> synchronization.lua, там есть:
Синхронизация водителя:
typedef struct VehicleSyncData {
    uint16_t vehicleId;
    uint16_t leftRightKeys;
    uint16_t upDownKeys;
    union {
        uint16_t keysData;
        SampKeys keys;
    };
    float     quaternion[4];
    VectorXYZ position;
    VectorXYZ moveSpeed;
    float     vehicleHealth;
    uint8_t   playerHealth;
    uint8_t   armor;
    uint8_t   currentWeapon : 6;
    uint8_t   specialKey : 2;
    uint8_t   siren;
    uint8_t   landingGearState;
    uint16_t  trailerId;
    union {
        float    bikeLean;
        float    trainSpeed;
        uint16_t hydraThrustAngle[2];
    };
} VehicleSyncData;
Синхронизация пассажира:
typedef struct PassengerSyncData {
    uint16_t vehicleId;
    uint8_t  seatId : 6;
    bool     driveBy : 1;
    bool     cuffed : 1;
    uint8_t  currentWeapon : 6;
    uint8_t  specialKey : 2;
    uint8_t  health;
    uint8_t  armor;
    uint16_t leftRightKeys;
    uint16_t upDownKeys;
    union {
        uint16_t keysData;
        SampKeys keys;
    };
    VectorXYZ position;
} PassengerSyncData;
Значит, когда ты водитель - твой клиент шлёт синхронизацию водителя серверу, тебе надо перехватывать посылку и вместо неё отправлять синхру пассажира, звучит как план 😀. Кстати, всё что мы можем перехватить, можно найти на том же гитхабе в файле samp.lua -> samp -> events.lua, например:
Вот конкретно пакеты данных:
-- Outgoing packets
OUTCOMING_PACKETS[PACKET.RCON_COMMAND]        = {'onSendRconCommand', {command = 'string32'}}
OUTCOMING_PACKETS[PACKET.STATS_UPDATE]        = {'onSendStatsUpdate', {money = 'int32'}, {drunkLevel = 'int32'}}
local function empty_writer() end
OUTCOMING_PACKETS[PACKET.PLAYER_SYNC]         = {'onSendPlayerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'PlayerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.VEHICLE_SYNC]        = {'onSendVehicleSync', function(bs) return utils.process_outcoming_sync_data(bs, 'VehicleSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.PASSENGER_SYNC]      = {'onSendPassengerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'PassengerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.AIM_SYNC]            = {'onSendAimSync', function(bs) return utils.process_outcoming_sync_data(bs, 'AimSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.UNOCCUPIED_SYNC]     = {'onSendUnoccupiedSync', function(bs) return utils.process_outcoming_sync_data(bs, 'UnoccupiedSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.TRAILER_SYNC]        = {'onSendTrailerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'TrailerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.BULLET_SYNC]         = {'onSendBulletSync', function(bs) return utils.process_outcoming_sync_data(bs, 'BulletSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.SPECTATOR_SYNC]      = {'onSendSpectatorSync', function(bs) return utils.process_outcoming_sync_data(bs, 'SpectatorSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.WEAPONS_UPDATE] = {'onSendWeaponsUpdate', handler.packet_weapons_update_reader, handler.packet_weapons_update_writer}
OUTCOMING_PACKETS[PACKET.AUTHENTICATION] = {'onSendAuthenticationResponse', {response = 'string8'}}
Так вот наш луа код:
Lua:
local ev = lib 'samp.events'

function ev.onSendVehicleSync(data) -- когда игра пытается серверу отправить синхру водителя
  -- тут будем писать наш код замены синхры
  return false -- в конце говорим, что мы не будем отправлять ту изначальную синхру (отменяем действие)
end
Идём на бх.вики, ищем функцию отправки синхры:
1702303809960.png
Вот такую функцию мы нашли:
sampForcePassengerSyncSeatId(int id, int seatId)
int id SAMP ид т/с
int seatId Номер сиденья
ид тс берём со старой синхры, ид сиденья выбираешь сам. продолжаем писать код:
Lua:
local ev = lib 'samp.events'

function ev.onSendVehicleSync(data) -- когда игра пытается серверу отправить синхру водителя
  local vehId = data.vehicleId -- напомню, структуру data я скинул в начале с гитхаба
  sampForcePassengerSyncSeatId(vehId, 1) -- наверное пассажир это 1, мб 0. надо тестить
  return false -- в конце говорим, что мы не будем отправлять ту изначальную синхру (отменяем действие)
end
Проверь, должно работать по идее.
Ты будешь у себя ехать за рулём, а у других - наверное сидеть в машине сбоку, а она будет ехать "сама". Мб где то ошибка

Но!
Сервера с анти читом могут кикнуть, потому что если ты был пешеходом, сел на водительское и стал пассажиром - это подозрительно. Надо хукать RPC посадки в машину (список RPC в том же файле events.lua) и там менять место, что ты садишься на пассажира. Тоже проверь
 

caing

Известный
Автор темы
43
6
Вот гитхаб SAMP.Lua (во-первых, тебе надо скачать и установить эту библиотеку отсюда)
Переходишь в samp.lua -> samp -> synchronization.lua, там есть:
Синхронизация водителя:
typedef struct VehicleSyncData {
    uint16_t vehicleId;
    uint16_t leftRightKeys;
    uint16_t upDownKeys;
    union {
        uint16_t keysData;
        SampKeys keys;
    };
    float     quaternion[4];
    VectorXYZ position;
    VectorXYZ moveSpeed;
    float     vehicleHealth;
    uint8_t   playerHealth;
    uint8_t   armor;
    uint8_t   currentWeapon : 6;
    uint8_t   specialKey : 2;
    uint8_t   siren;
    uint8_t   landingGearState;
    uint16_t  trailerId;
    union {
        float    bikeLean;
        float    trainSpeed;
        uint16_t hydraThrustAngle[2];
    };
} VehicleSyncData;
Синхронизация пассажира:
typedef struct PassengerSyncData {
    uint16_t vehicleId;
    uint8_t  seatId : 6;
    bool     driveBy : 1;
    bool     cuffed : 1;
    uint8_t  currentWeapon : 6;
    uint8_t  specialKey : 2;
    uint8_t  health;
    uint8_t  armor;
    uint16_t leftRightKeys;
    uint16_t upDownKeys;
    union {
        uint16_t keysData;
        SampKeys keys;
    };
    VectorXYZ position;
} PassengerSyncData;
Значит, когда ты водитель - твой клиент шлёт синхронизацию водителя серверу, тебе надо перехватывать посылку и вместо неё отправлять синхру пассажира, звучит как план 😀. Кстати, всё что мы можем перехватить, можно найти на том же гитхабе в файле samp.lua -> samp -> events.lua, например:
Вот конкретно пакеты данных:
-- Outgoing packets
OUTCOMING_PACKETS[PACKET.RCON_COMMAND]        = {'onSendRconCommand', {command = 'string32'}}
OUTCOMING_PACKETS[PACKET.STATS_UPDATE]        = {'onSendStatsUpdate', {money = 'int32'}, {drunkLevel = 'int32'}}
local function empty_writer() end
OUTCOMING_PACKETS[PACKET.PLAYER_SYNC]         = {'onSendPlayerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'PlayerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.VEHICLE_SYNC]        = {'onSendVehicleSync', function(bs) return utils.process_outcoming_sync_data(bs, 'VehicleSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.PASSENGER_SYNC]      = {'onSendPassengerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'PassengerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.AIM_SYNC]            = {'onSendAimSync', function(bs) return utils.process_outcoming_sync_data(bs, 'AimSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.UNOCCUPIED_SYNC]     = {'onSendUnoccupiedSync', function(bs) return utils.process_outcoming_sync_data(bs, 'UnoccupiedSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.TRAILER_SYNC]        = {'onSendTrailerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'TrailerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.BULLET_SYNC]         = {'onSendBulletSync', function(bs) return utils.process_outcoming_sync_data(bs, 'BulletSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.SPECTATOR_SYNC]      = {'onSendSpectatorSync', function(bs) return utils.process_outcoming_sync_data(bs, 'SpectatorSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.WEAPONS_UPDATE] = {'onSendWeaponsUpdate', handler.packet_weapons_update_reader, handler.packet_weapons_update_writer}
OUTCOMING_PACKETS[PACKET.AUTHENTICATION] = {'onSendAuthenticationResponse', {response = 'string8'}}
Так вот наш луа код:
Lua:
local ev = lib 'samp.events'

function ev.onSendVehicleSync(data) -- когда игра пытается серверу отправить синхру водителя
  -- тут будем писать наш код замены синхры
  return false -- в конце говорим, что мы не будем отправлять ту изначальную синхру (отменяем действие)
end
Идём на бх.вики, ищем функцию отправки синхры:
Вот такую функцию мы нашли:
sampForcePassengerSyncSeatId(int id, int seatId)

ид тс берём со старой синхры, ид сиденья выбираешь сам. продолжаем писать код:
Lua:
local ev = lib 'samp.events'

function ev.onSendVehicleSync(data) -- когда игра пытается серверу отправить синхру водителя
  local vehId = data.vehicleId -- напомню, структуру data я скинул в начале с гитхаба
  sampForcePassengerSyncSeatId(vehId, 1) -- наверное пассажир это 1, мб 0. надо тестить
  return false -- в конце говорим, что мы не будем отправлять ту изначальную синхру (отменяем действие)
end
Проверь, должно работать по идее.
Ты будешь у себя ехать за рулём, а у других - наверное сидеть в машине сбоку, а она будет ехать "сама". Мб где то ошибка

Но!
Сервера с анти читом могут кикнуть, потому что если ты был пешеходом, сел на водительское и стал пассажиром - это подозрительно. Надо хукать RPC посадки в машину (список RPC в том же файле events.lua) и там менять место, что ты садишься на пассажира. Тоже проверь
Большое спасибо за развернутый ответ, буду тестировать все!
 
  • Нравится
Реакции: Vintik