Некоторые из вас уже могли видеть трюк с подменой SendClientMessage у меня в подписи (да и сейчас можете - картинка выскакивает рандомно, попробуйте несколько раз обновить страницу), которым можно вызвать рандомный краш в 1 из 50 случаев.
По сути это просто тихий сбой, но что будет, если сделать что-то подобное, только с более заметными последствиями?
PHP код:
stock __fuckup_SendClientMessage(&playerid, &color, const message[])
{ // SCM fuckup #2 by Daniel_Cortez
if(random(50) + 1 == 50)
{
playerid = random(GetPlayerPoolSize() + 1);
color = random(~0);
for (new i = 0; ; ++i)
{
if(message[i] == '\0')
break;
static t;
t = random(255 - 32) + 32;
#emit load.s.pri i
#emit load.s.alt message
#emit idxaddr
#emit move.alt
#emit load.pri t
#emit stor.i
}
}
return SendClientMessage(playerid, color, message);
}
#if defined _ALS_SendClientMessage
#undef SendClientMessage
#else
#define _ALS_SendClientMessage
#endif
#define SendClientMessage __fuckup_SendClientMessage
Обратите внимание: перед аргументами playerid и color стоит знак "&" - это значит, что вместо значений аргументов будут передаваться ссылки на них. Благодаря этому перехватчик сможет изменить значения переменных в вызывающей функции (по тому же принципу, как это делает функция GetPlayerPos).
перед аргументом message никаких "&" не нужно: массивы и без того передаются по ссылке.
В переменную color записывается рандомный цвет, а в playerid - ID одного из игроков (этот ID получается с использованием функции GetPlayerPoolSize: так больше вероятность, что сообщение будет показано именно существующему игроку), либо 0, если сервер пуст.
Отдельного упоминания заслуживает подмена значения в message: этот параметр имеет атрибут const, поэтому с помощью обычных средств Pawn нельзя присвоить новое значение ни самому массиву, ни его ячейкам по отдельности - модифицировать константный массив можно только с помощью #emit.
Можно убрать атрибут const, но тогда функция будет работать не во всех случаях:
PHP код:
static const sample_text[] = "Sample text";
SendClientMessage(0, -1, sample_text); // error 035: argument type mismatch (argument 3)
Поэтому у меня не осталось никакого выбора, кроме как изменить значение message с помощью #emit, игнорируя атрибут const.
Тестовый код:
PHP код:
main()
{
new playerid = 23;
new color = 0xFF00FF00;
static const message[] = "Sample text";
printf("%d %d %s", playerid, color, message);
for (new i = 0; i < 200; ++i)
SendClientMessage(playerid, color, message),
printf("%d %d %s", playerid, color, message);
}
Пример вывода (обратите внимание, как меняются значения playerid, color и message):
Код:
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 9120520 TЇжА¤│Аy"M>
0 9120520 TЇжА¤│Аy"M>
0 9120520 TЇжА¤│Аy"M>