xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patchedлегендас этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в 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
Спасибо.с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в 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
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;
}
это просто исправление одного бита! идеально 😆с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в 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
а если пакет будет обернут в ID_TIMESTAMP?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 checkingSolució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
💥а если пакет будет обернут в ID_TIMESTAMP?
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в 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
пользоваться майареной в 2024 году, ну для вас реально всё кончено, без обид)Это не решение, это костыль который открывает другую проблему, она снимает проверки которые были заданы разработчиком, это не решение.
Тем более MyArena написала уже фикс этого крашера, всё кончено.
link?Тем более MyArena написала уже фикс этого крашера, всё кончено.
пользоваться майареной в 2024 году, ну для вас реально всё кончено, без обид)
ProcessCmds на PRO сервере MyArena.link?
покупать арену ради фикса не особо хочетсяProcessCmds на PRO сервере MyArena.