Сразу о плюсах и минусах:
+:
открытый код, твори не хочу, хоть за игру на других серверах бань (просто сайты серверов обычно такие: nameserver - super server, в лист прог nameserver, в сообщение: "нарушение п.сто стороннем сервере")
не чистит лог, т.е. можно запускать параллельно в разных папках, т.е. настроить на разные темы:
за программы/поиск в интернете/просмотр ютуба прочее
-:
пишет новичок в php, поэтому о способах реализации не говорим, перепишите, если надо, для шаровых серверов пойдет
не банит с вырезнным из клиента gacd
Личный тест:
Запуск (с тем списком, что ниже) программы crazybot, бан через 4 минуты (хотя скрипт запускается у меня раз в 3 минуты, наверно, лог пишется медленно), бан получил 5 мин только персонажен с которого играл, зашел на другого играл спокойно минут 10-15, вышел с игры, зашел снова, получил почти сразу же бан на час, видими при входе большая часть информации пишется.
Автор:
Автор друг, мне щас писать/переписывать некогда, делает по моим указаниям за пиво, у меня версия 2.1 с баном за вырезку службы gacd из клиента (бан ручной, хотя можно автоматический сделать, но я баню полностью, поэтому проверяю сам), с баном любым кол-вом ботов, расшарю как получу 3ю версию с веб-панелью.
Схема работы:
Парсит лог, ищет по списку слов ботов, банит, не было особого теста, как поведёт себя скрипт при большом он-лайне не известно.
Банит в 2 этапа: 1 предупреждающий на 5 мин, при повторном нарушение 1 час (можно менять)
Банит до первого найденного, т.е. за 1 запуск забанит только 1 персонажа (потом будет исправлено)
О настройке:
Скрипт вешается на кронтаб, каждую минуту ставить не надо, у меня на небольшом сервере раз в 3 минуты, да, если запускать реже 5 минут нужно исправить время первого бана с 5 минут на большее.
Файл ch.txt заполняют названиями програм, каждое слово с новой строки, аккуратнее, скрипт будет банить при нахождение этого слова(или его части) в процессах и окнах у пользователя, т.е. вводить "бот" или "auto" не стоит, а то за поиск в гугле "купить ботинки" будет бан, следить за списком нужных слов можно, запуская ботов и читая лог, т.е. вы запустили бота, например, autobot.exe в логе пишет:
[CLIENTINFO ] autobot.exe
[CLIENTINFO ] <Авто-бот PW...>
т.е. добавить можно autobot.exe или <Авто-бот
после первога запуска появиться файл ch, если нужно добавить новые слова удалите его сначала или допишите слово в файл ch
также создайте папку ban
не жалейте и дайте права 777 на всё
Итак, для работы надо (да-да залить архивом всё религия не позволяет):
включить логирование:
изменить строку в старте gacd
*/var/www/antiCH/gacd.log -это пусть куда будет писаться лог, измените его
создать папку ban
файл antiCH
*при очистке лога, перезаписать файл
файл antich.php
файл config.php
*данные от базы не нужны в этой версии
файл ch.txt
+:
открытый код, твори не хочу, хоть за игру на других серверах бань (просто сайты серверов обычно такие: nameserver - super server, в лист прог nameserver, в сообщение: "нарушение п.сто стороннем сервере")
не чистит лог, т.е. можно запускать параллельно в разных папках, т.е. настроить на разные темы:
за программы/поиск в интернете/просмотр ютуба прочее
-:
пишет новичок в php, поэтому о способах реализации не говорим, перепишите, если надо, для шаровых серверов пойдет
не банит с вырезнным из клиента gacd
Личный тест:
Запуск (с тем списком, что ниже) программы crazybot, бан через 4 минуты (хотя скрипт запускается у меня раз в 3 минуты, наверно, лог пишется медленно), бан получил 5 мин только персонажен с которого играл, зашел на другого играл спокойно минут 10-15, вышел с игры, зашел снова, получил почти сразу же бан на час, видими при входе большая часть информации пишется.
Автор:
Автор друг, мне щас писать/переписывать некогда, делает по моим указаниям за пиво, у меня версия 2.1 с баном за вырезку службы gacd из клиента (бан ручной, хотя можно автоматический сделать, но я баню полностью, поэтому проверяю сам), с баном любым кол-вом ботов, расшарю как получу 3ю версию с веб-панелью.
Схема работы:
Парсит лог, ищет по списку слов ботов, банит, не было особого теста, как поведёт себя скрипт при большом он-лайне не известно.
Банит в 2 этапа: 1 предупреждающий на 5 мин, при повторном нарушение 1 час (можно менять)
Банит до первого найденного, т.е. за 1 запуск забанит только 1 персонажа (потом будет исправлено)
О настройке:
Скрипт вешается на кронтаб, каждую минуту ставить не надо, у меня на небольшом сервере раз в 3 минуты, да, если запускать реже 5 минут нужно исправить время первого бана с 5 минут на большее.
Файл ch.txt заполняют названиями програм, каждое слово с новой строки, аккуратнее, скрипт будет банить при нахождение этого слова(или его части) в процессах и окнах у пользователя, т.е. вводить "бот" или "auto" не стоит, а то за поиск в гугле "купить ботинки" будет бан, следить за списком нужных слов можно, запуская ботов и читая лог, т.е. вы запустили бота, например, autobot.exe в логе пишет:
[CLIENTINFO ] autobot.exe
[CLIENTINFO ] <Авто-бот PW...>
т.е. добавить можно autobot.exe или <Авто-бот
после первога запуска появиться файл ch, если нужно добавить новые слова удалите его сначала или допишите слово в файл ch
также создайте папку ban
не жалейте и дайте права 777 на всё
Итак, для работы надо (да-да залить архивом всё религия не позволяет):
включить логирование:
изменить строку в старте gacd
Код:
cd $PW_PATH/gacd; ./gacd -print_interface_debug_init_code_clientinfo_query_punish_question_skeleton_mutate_pp_acdatasend gamesys.conf >/var/www/antiCH/gacd.log &
создать папку ban
файл antiCH
Код:
1
файл antich.php
PHP:
<?php
/*
#####################
#####BY###ADMENT#####
#####################
#######ANTICH########
#########1.0#########
*/
//в этом файле можно ничего не менять
//функция для слов маячков, проверьте файл ch.txt
include('config.php');
$filename = 'ch';
if (file_exists($filename)) {
$cheat=file_get_contents('ch');
} else {
$newch=file_get_contents('ch.txt');
$cheat=str_replace("\r\n", "|", $newch);
$fp = fopen("ch", "w");
fwrite($fp, $cheat);
fclose($fp);
};
//ниже читается лог-файл (gacd/gacd.log)
$str=file($adment_log);
$str_old=file_get_contents('antiCH');
$str_new=count($str);
file_put_contents('antiCH', $str_new);
$str_new=$str_old-$str_new-100;
$str=array_splice($str, $str_new);
$i=0;
$count=count($str);
//тут скрипт ищет название чита и строку в лог-файле
while($i<$count){
if (preg_match('/('.$cheat.')/i', $str[$i],$out) == 1) {
$cheat=$out[0];
$newcount=$i;
$i=$i+$count;
}else{
$i=$i+1;
};
};
//ниже скрипт ищет ид игрока
while($newcount>0){
if(strstr($str[$newcount],"acreport recieved from user")) {
$user_id=explode(" ", $str[$newcount]);
$user_id=trim($user_id[8]);
$newcount=0;
}else{
$newcount=$newcount-1; //строка не содержит чита, переход к новой строке
};
};
if($user_id){
//работаем с нарушителем
if(file_exists("ban/".$user_id)){
function socketsend($Data,$host,$port)
{
if(!@$sock=socket_create(AF_INET, SOCK_STREAM, SOL_TCP))
{throw new Exception("Не удалось связать сокет"); exit();}
socket_connect($sock,$host,$port);
socket_set_block($sock);
socket_send($sock, $Data, 8192, 0);
socket_recv($sock, $buf, 8192, 0);
socket_set_nonblock($sock);
socket_close($sock);
return $buf;
}
function cuint($data)
{
if($data < 64)
return strrev(pack("C", $data));
else if($data < 16384)
return strrev(pack("S", ($data | 0x8000)));
else if($data < 536870912)
return strrev(pack("I", ($data | 0xC0000000)));
return strrev(pack("c", -32) . pack("i", $data));
}
function PackString($data)
{
$data = iconv("UTF-8", "UTF-16LE", $data);
return cuint(strlen($data)).$data;
}
function PackOctet($data)
{
$data = pack("H*", $data);
return cuint(strlen($data)).$data;
}
function gameChat($user,$msg,$chan,$host,$port)
{
$System = pack("C*",$chan);
$Emotion = pack("C*",0);
$Char = pack("N*",$user);
$Message = PackString($msg);
$data = PackOctet('');
$Packet = $System.$Emotion.$Char.$Message.$data;
$Data = cuint(120).cuint(strlen($Packet)).$Packet;
socketsend($Data, $host,$port);
}
$Data = pack("N*", -1).pack("N*", -1).pack("N*",$user_id).pack("N*", $antich_time).PackString($reason);
$Data = pack("C",129).pack("C",104).cuint(strlen($Data)).$Data;
socketsend($Data,$host,$port);
gameChat('$user_id',"наружение п.6.2 - использование {$cheat}. Блокировка персонажа - 1 час.",0,$host, $port2);
}else{
function socketsend($Data,$host,$port)
{
if(!@$sock=socket_create(AF_INET, SOCK_STREAM, SOL_TCP))
{throw new Exception("Не удалось связать сокет"); exit();}
socket_connect($sock,$host,$port);
socket_set_block($sock);
socket_send($sock, $Data, 8192, 0);
socket_recv($sock, $buf, 8192, 0);
socket_set_nonblock($sock);
socket_close($sock);
return $buf;
}
function cuint($data)
{
if($data < 64)
return strrev(pack("C", $data));
else if($data < 16384)
return strrev(pack("S", ($data | 0x8000)));
else if($data < 536870912)
return strrev(pack("I", ($data | 0xC0000000)));
return strrev(pack("c", -32) . pack("i", $data));
}
function PackString($data)
{
$data = iconv("UTF-8", "UTF-16LE", $data);
return cuint(strlen($data)).$data;
}
function PackOctet($data)
{
$data = pack("H*", $data);
return cuint(strlen($data)).$data;
}
function gameChat($user,$msg,$chan,$host,$port)
{
$System = pack("C*",$chan);
$Emotion = pack("C*",0);
$Char = pack("N*",$user);
$Message = PackString($msg);
$data = PackOctet('');
$Packet = $System.$Emotion.$Char.$Message.$data;
$Data = cuint(120).cuint(strlen($Packet)).$Packet;
socketsend($Data, $host,$port);
}
$Data = pack("N*", -1).pack("N*", -1).pack("N*",$user_id).pack("N*", 600).PackString($reason);
$Data = pack("C",129).pack("C",104).cuint(strlen($Data)).$Data;
socketsend($Data,$host,$port);
gameChat('$user_id',"наружение п.6.1 - использование {$cheat}. Блокировка персонажа - 5 мин.",0,$host, $port2);
$fileopen=fopen("ban/".$user_id,"a+");
fwrite($fileopen,$cheat."\r\n");
fclose($fileopen);
};
};
?>
файл config.php
PHP:
<?php
/*
#####################
#####BY###ADMENT#####
#####################
#######ANTICH########
#########2.1#########
*/
$adment_log="gacd.log"; //путь к логу (gacd/gacd.log)
$antich_time=3600; //время бана в секундах, 1 сек - просто выбьет с игры, не ставить 0!
$host = "127.0.0.1"; //хост
$sql_user = "root"; // MySQL логин
$sql_pass = "debian";// MySQL пароль
$sql_data = "pw";
$port = "29100"; //gdeliveryd
$port2 = "29300"; //чат
?>
файл ch.txt
Код:
crazybot
CazyBot
upilot