1.2.x - 1.5.x парсер лога (автобан) php v.1.0

ghang

Любопытный
Пользователь
19 Авг 2012
140
40
28
34
a-pw.ru
Сразу о плюсах и минусах:
+:
открытый код, твори не хочу, хоть за игру на других серверах бань (просто сайты серверов обычно такие: 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 &
*/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
 
  • Like
Реакции: Juzilkree

Vieraw

Администратор
Команда форума
Администратор
12 Май 2012
273
145
43
27
Этот код просто нечто и нет смысла его критиковать, т.к. в нем все ужасно.
По поводу пакетов:
360 GMKickoutRole
PHP:
cuint(360)
Эти записи аналогичны.
P.S. Не смотрел лог gacd, но если туда пишется id аккаунта, а не персонажа, то можете получить проблемы с тем что id персонажа и аккаунта не совпадают.
 

Vieraw

Администратор
Команда форума
Администратор
12 Май 2012
273
145
43
27
Зачем писать то, что уже есть в трех видах (на шарпе парсер, на пыхе парсер и на шарпе пакетный)?
В шаре не видел ничего подобного. Настоятельно рекомендую ознакомиться с темой, а потом писать.
 

Roymike

Любопытный
Пользователь
29 Мар 2012
104
55
28
34
в общем "это" не работает, ошибки:
PHP Notice: Undefined variable: newcount in /home/gacd/anticheat.php on line 45
PHP Notice: Undefined variable: user_id in /home/gacd/anticheat.php on line 107

А ещё электрон днина морозится и не скидывает мне античит, за который я когда-то платил...
 

ghang

Любопытный
Пользователь
19 Авг 2012
140
40
28
34
a-pw.ru
в общем "это" не работает, ошибки:
PHP Notice: Undefined variable: newcount in /home/gacd/anticheat.php on line 45
PHP Notice: Undefined variable: user_id in /home/gacd/anticheat.php on line 107

А ещё электрон днина морозится и не скидывает мне античит, за который я когда-то платил...

если всё по гайду, то работать должно, Notice это фигня многие "особо опытные" просто отключают эту ошибку на странице кода, более "опытные" в конфиге апача
парсер бы до 100+ строки не добежал бы если бы "не работало", он нашел что-то
если путь не указан к логу, права 777 не даны и папки ban нету, то и бана не будет
 

Вложения

  • 00013.jpg
    00013.jpg
    108,1 KB · Просмотры: 90

ghang

Любопытный
Пользователь
19 Авг 2012
140
40
28
34
a-pw.ru
PHP:
<?php
include('config.php');
$str=file($adment_log);
$str_old=file_get_contents('antiAU');
$str_new=count($str);
file_put_contents('antiAU', $str_new);
$str_new=$str_old-$str_new;
if($str_new!=0){
$stack=array();
$str=array_splice($str, $str_new);
$count=count($str);
$i=0;
while($i<$count){
if(strpos($str[$i],"userid=")) {
$str[$i]=strstr($str[$i],"userid=");
$user_id=explode(" ", $str[$i]);
$user_id=explode("=", $user_id[0]);
array_push($stack, $user_id[1]);
};
$i=$i+1;
};
$stack=array_unique($stack);
$count=count($stack);
for ($i=0; $i<$count; $i++) {
//построчная запись
};
};
?>

код, чтобы не было обхода вырезки, нужен ещё файл со значением 0 "antiAU"
код не дописан, где //построчная запись там нужно вставить запись в mysql по id аккаунта, создать отдельное поле в базе игроков, например, audate и записывать туда дату, когда скрипт был запущен (запись производится только от игроков имеющих службу в клиенте), часто запускать нет смысла, раз в сутки/двое, в итого у каждого игрока будет видена дата последнего входа со службой, в базе pw стандартно есть таблица с последним онлайном игроков вроде point, а там простой скрипт сверки дат и бан... т.е. если в таблице дата 25.10.2014, а users записалось 21.10.2014, то явно игрок с вырезаной службой играет
---
p.s. код написан коряво знаю, но игроков это никак не беспокоит
 
  • Like
Реакции: Juzilkree

ghang

Любопытный
Пользователь
19 Авг 2012
140
40
28
34
a-pw.ru
:angelic:кто то проверял работоспособность этого чуда?
нет, это вообще кусок, отодранный от какого-то непонятного скрипта:angelic:

Бан работает, сверку (2часть) доделал у себя - работает, всё здесь просто и просто дважды, скрипт бан никак не сможет отловить бота, которого нет в списке, т.е. если название окна бота или название процесса не будут найдены, пользователю ничего не будет.
нет никакого анализа пакетов и т.п., это шара.

Защита обходимa просто: завести 2 елементклиента со службой и без, засветить службу, а потом играть с ботом без службы, всё, так обходиться один раньше платный аналог.

Если на официальных серверах с ботами решили проблему, введением встроенного бота (если все ботоводы, то никто не ботовод), то говорить о защите фришки, бесполезно.

Если вы используете автобан, то не следует предупреждать об этом игроков, боитесь, что автобан забанит без причины? уберите автобан сделайте себе уведомление на почту и баньте в реальном времени гмом и никаких претензий от игроков:angelic:

борьба оружия и защиты - бесконечна ©сперто
 
Последнее редактирование:
  • Like
Реакции: Strong

Tomas

Любопытный
Пользователь
29 Авг 2014
229
43
28
33
нет, это вообще кусок, отодранный от какого-то непонятного скрипта:angelic:

Бан работает, сверку (2часть) доделал у себя - работает, всё здесь просто и просто дважды, скрипт бан никак не сможет отловить бота, которого нет в списке, т.е. если название окна бота или название процесса не будут найдены, пользователю ничего не будет.
нет никакого анализа пакетов и т.п., это шара.

Защита обходим просто: завести 2 елементклиента со службой и без, засветить службу, а потом играть с ботом без службы, всё, так обходиться один раньше платный аналог.

Если на официальных серверах с ботами решили проблему, введением встроенного бота (если все ботоводы, то никто не ботовод), то говорить о защите фришки, бесполезно.

Если вы используете автобан, то не следует предупреждать об этом игроков, боитесь, что автобан забанит без причины? уберите автобан сделайте себе уведомление на почту и баньте в реальном времени гмом и никаких претензий от игроков:angelic:

борьба оружия и защиты - бесконечна ©сперто

спасибо за поеснение меня интересовал какраз список )
 

Пользователи онлайн

Сейчас на форуме нет ни одного пользователя.

Последние ресурсы

Статистика форума

Темы
3.838
Сообщения
21.197
Пользователи
7.601
Новый пользователь
hkuno