Исходник bitstream readbits stack overflow fix

pendaras

Новичок
19
7
Если текущее решение ТС не идеально (не могу об этом судить т.к. не тестил), то в любом случае более совершенное решение выйдет в публичном доступе, ибо это в интересах большинства игровых серверов. Вопрос времени и терпения. В данный момент я бы не рекомендовал что-либо покупать в плане фикса, ибо вероятнее всего это будет абсолютно непрагматичная трата денег. А мб вообще надурят.

По этому я и не предлагал никому услуги, я продавал между своими знакомыми, они мне заплатили я и написал.
 

povargek

Известный
Друг
96
290
Автору на заметку: всегда собирай статик в условиях сампа
 

FYP

Известный
Администратор
1,764
5,921
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, вместо хука пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
 
Последнее редактирование:

Maddy

Известный
35
11
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
легенда
 

timmylich.

Новичок
3
0
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
Спасибо.
Пока одна проблема - хостер MyArena не позволяет подгрузить свой samp03svr на сервер, придётся ждать пока они проснуться...
 

Benjes

Новичок
2
2
Solución usando Pawn.RakNet

Pawn.RakNet:
IRawPacket:20(playerid, BitStream:bs) // 20 = ID_RPC
{
    new
        PacketID,
        RPC_ID,
        NumberOfBitsOfData
    ;

    BS_ReadValue(bs, PR_UINT8, PacketID, PR_UINT8, RPC_ID, PR_CUINT32, NumberOfBitsOfData);
    printf("IRawPacket -> ID_RPC: playerid: %d, RPC_ID: %d, NumberOfBitsOfData: %d", playerid, RPC_ID, NumberOfBitsOfData);

    if (PacketID == 40 || (NumberOfBitsOfData >= 0x1FFFFF || NumberOfBitsOfData <= 0x80000000 || NumberOfBitsOfData < 0))
    {
        new blockIp[32];
        GetPlayerIp(playerid, blockIp, sizeof blockIp);

        printf("[FIX CRASHER] RPCID: %d, NumberOfBitsOfData: %d", RPC_ID, NumberOfBitsOfData);
        BlockIpAddress(blockIp, 60 * 1000 * 2);

        return false;
    }

    return true;
}
 
Последнее редактирование:
  • Влюблен
  • Нравится
Реакции: Tornamic и King_Agressor

fzfzfz123

Новичок
9
22
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, вместо хука пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
это просто исправление одного бита! идеально 😆
 
  • Нравится
Реакции: FYP

Nexius

Известный
34
28
А что ты хотел увидеть? Никто бесплатно тебе "супер рабочий" скрипт не напишет.
Как видишь, уже написали (бинарники тут). Но лично я рекомендую омп как вариант, с которым вряд ли возникнут и любые возможные прецеденты в дальнейшем, при нахождении чего-то подобного в иной раз у самп сервера.
 

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,952
3,223
Solución usando Pawn.RakNet

Pawn.RakNet:
IRawPacket:20(playerid, BitStream:bs) // 20 = ID_RPC
{
    new
        PacketID,
        RPC_ID,
        NumberOfBitsOfData
    ;

    BS_ReadValue(bs, PR_UINT8, PacketID, PR_UINT8, RPC_ID, PR_CUINT32, NumberOfBitsOfData);
    printf("IRawPacket -> ID_RPC: playerid: %d, RPC_ID: %d, NumberOfBitsOfData: %d", playerid, RPC_ID, NumberOfBitsOfData);

    if (PacketID == 40 || (NumberOfBitsOfData >= 0x1FFFFF || NumberOfBitsOfData <= 0x80000000 || NumberOfBitsOfData < 0))
    {
        new blockIp[32];
        GetPlayerIp(playerid, blockIp, sizeof blockIp);

        printf("[FIX CRASHER] RPCID: %d, NumberOfBitsOfData: %d", RPC_ID, NumberOfBitsOfData);
        BlockIpAddress(blockIp, 60 * 1000 * 2);

        return false;
    }

    return true;
}
а если пакет будет обернут в ID_TIMESTAMP?
 

Nexius

Известный
34
28
Solución usando Pawn.RakNet

Pawn.RakNet:
IRawPacket:20(playerid, BitStream:bs) // 20 = ID_RPC
{
    new
        PacketID,
        RPC_ID,
        NumberOfBitsOfData
    ;

    BS_ReadValue(bs, PR_UINT8, PacketID, PR_UINT8, RPC_ID, PR_CUINT32, NumberOfBitsOfData);
    printf("IRawPacket -> ID_RPC: playerid: %d, RPC_ID: %d, NumberOfBitsOfData: %d", playerid, RPC_ID, NumberOfBitsOfData);

    if (PacketID == 40 || (NumberOfBitsOfData >= 0x1FFFFF || NumberOfBitsOfData <= 0x80000000 || NumberOfBitsOfData < 0))
    {
        new blockIp[32];
        GetPlayerIp(playerid, blockIp, sizeof blockIp);

        printf("[FIX CRASHER] RPCID: %d, NumberOfBitsOfData: %d", RPC_ID, NumberOfBitsOfData);
        BlockIpAddress(blockIp, 60 * 1000 * 2);

        return false;
    }

    return true;
}
Not a proper solution, the cause is not related exactly to this packet you're checking
 
  • Нравится
Реакции: 1NEXPL1CA

pendaras

Новичок
19
7
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, вместо хука пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched

Это не решение, это костыль который открывает другую проблему, она снимает проверки которые были заданы разработчиком, это не решение.

Тем более MyArena написала уже фикс этого крашера, всё кончено.
 

livingflore

Известный
370
321
Это не решение, это костыль который открывает другую проблему, она снимает проверки которые были заданы разработчиком, это не решение.

Тем более MyArena написала уже фикс этого крашера, всё кончено.
пользоваться майареной в 2024 году, ну для вас реально всё кончено, без обид)
 

pendaras

Новичок
19
7
пользоваться майареной в 2024 году, ну для вас реально всё кончено, без обид)

Ну это твоё личное мнение)
Арена досихпор держит хорошие сервера но у них хороши в основном VDS сервера, я учавствовал в тесте плагина по этому могу сказать что он работает, а то что прислал FYP открывает новую проблему.

ProcessCmds на PRO сервере MyArena.