Хочу сделать чтобы скрипт разрешал логинеться только определенным логинам.
Для этого отлавливаю пакет AuthLogin из этого пакете проверяю логин и если ему доступ разрешен, то пропускаю этот пакет дальше на логин сервер.
Код:
var
ProtocolVersion: string;
begin
if pck='' then exit;
if FromServer then
case pck[1] of
// Ловим пакет KeyPacket от сервера чтобы он не дублировался
#$2E: begin
pck:='';
end;
end;
if FromClient then
case pck[1] of
//Перехватываем пакет от клиента с протоколом
#$0E: begin
// Записывам ProtocolVersion в переменную
ProtocolVersion:=pck;
//На пакет ProtocolVersion от клиента отвечаем ему пакетом KeyPacket
// Вот тут проблема у меня не могу разобраться с этим пакетом какой ключ писать
// вот сюда WriteQ(0) в остальных вроде все правильно
// вот такой пакет приходит от сервера если на него отправлять
//пакет ProtocolVersion
//2E 01 26 6E 69 A3 47 FB 9C BA 01 00 00 00 01 00 00 00 00 00 00 00 00
// Если ему отправлять такой же пакет то клиент его не принимает
buf:=#$2E;
WriteC(1);
WriteQ(0);
WriteD(1);
WriteD(1);
WriteC(0);
WriteD(0);
SendtoClient;
pck:='';
end;
//Пакет AuthLogin
#$2B: begin
if ReadS(2) = 'Логин которому разрешено заходить' then
begin
//Отсылаем на сервер ProtocolVersion
buf:=ProtocolVersion;
SendToServer;
//Отсылаем на сервер пакет AuthLogin
buf:=pck;
SendToServer;
end
else begin
//шлем логаут на клиента если ему не разрешено заходить
buf:=#$84;
SendToClient;
end;
//Удаляем пакет чтобы он не дублировался
pck:='';
end;
end;
end.
Помогите пожалуйста разобраться с пакетом KeyPacket
Последний раз редактировалось Marfey, 21.04.2010 в 01:54.
Для этого отлавливаю пакет AuthLogin из этого пакете проверяю логин и если ему доступ разрешен, то пропускаю этот пакет дальше на логин сервер.
Насколько я знаю пакетхак не работает с логин сервером, или не?
И вообще вы сильно усложняете себе жизнь.
Смысл вам блокировать пакеты KeyPacket ProtocolVersion, а потом отправлять их. Пусть клиент и сервер сами с ними работают как им захочется, вам же только проверить логин надо, а логин передается в пакете (который идет к ГЕЙМ серверу, а не к логин серверу) RequestAuthLogin. Значит просто в теле скрипта пишем код
Код:
if FromClient and pck[1]=#$00 then //тут идентификатор RequestAuthLogin, не помню какой именно, а пакетхака под рукой нету чтобы глянуть.
if ReadS(2) <> 'Логин которому разрешено заходить' then
pck:=''; //тупо блокируем пакет и дальше не войти, ну или шлем логаут.
А еще можно средствами самого пакетхака
Код:
if ConnectName<>'ник чара которому разрешено заходить' then pck:='';
__________________
В любом из нас спит гений. И с каждым днем все крепче.
[quote=J-Fobos;84647]Насколько я знаю пакетхак не работает с логин сервером, или не?
QUOTE]
Работает).
Если не перехватывать пакеты ProtocolVersion и KeyPacket, а только работать с пакетом AuthLogin, то все замечательно работает, но если логину через скрипт запрещено заходить на сервер (а у него например стоит делай захода 1 минута), то каждую минуту он будет слать на сервер пакет ProtocolVersion, а дальше будет молчание, мне кажеться это палевно и админы могут по IP потом блокирнуть.
Это я так тонко намекал что НЕ работает с логин сервером
Думаете просто так порт 2106 (это порт логин сервера) по умолчанию стоит в строке "не игровые порты" ? В этом можно легко убедится: убрать порт из исключений и установить опцию "не закрывать вкладки при закрытии соединений", тогда увидите связь с логин сервером.
А пакеты ProtocolVersion и KeyPacket для связи геймсервера и клиента. И исходя из того что вы сейчас написали получается, что скрипт в шапке темы бесполезный - попытка входа все равно будет зафиксирована на логин сервере.
Ну а по поводу "это палевно", частично вы правы, в логах будет отображаться что соединение разорвалось из за того что клиент не ответил, но я ж не знал что делай захода будет 1 минута, потому и написал pck:='', хотя и написал в коментах "или шлем логаут"
С логаутом лог сервера будет чист.
__________________
В любом из нас спит гений. И с каждым днем все крепче.
Это я так тонко намекал что НЕ работает с логин сервером
Думаете просто так порт 2106 (это порт логин сервера) по умолчанию стоит в строке "не игровые порты" ? В этом можно легко убедится: убрать порт из исключений и установить опцию "не закрывать вкладки при закрытии соединений", тогда увидите связь с логин сервером.
А пакеты ProtocolVersion и KeyPacket для связи геймсервера и клиента. И исходя из того что вы сейчас написали получается, что скрипт в шапке темы бесполезный - попытка входа все равно будет зафиксирована на логин сервере.
Ну а по поводу "это палевно", частично вы правы, в логах будет отображаться что соединение разорвалось из за того что клиент не ответил, но я ж не знал что делай захода будет 1 минута, потому и написал pck:='', хотя и написал в коментах "или шлем логаут"
С логаутом лог сервера будет чист.
Сори я заранее (до того как начал писать скрипт) убрал порт 2106 из не игровых и и установил галку "не закрывать вкладку при закрытии соединения".
И все это время не мог понять почему открываться две вкладки при соединение и в одной вкладке идут какие-то левые пакеты, а в другой нормальные.
Теперь я понял что одна была на логин сервер (где левые пакеты, т.е их не распознает l2phx), а вторая это с гейм сервером.
Специально проверил на локальном сервере. Когда блокировать пакет соединение висит, но в логах чисто. Когда происходит повторный заход в игру в логах выводится информация что соединение разорвано и создается новое. А если посылать пакет на логаут то соединение разрывается и в логах ничего не отображается. Так что можно без опаски посылать пакет на логаут при неверном логине. И если не секрет, а какой смысл в блоке логинов? (если для защиты скрипта от других пользователей, то удалением этих строк скрипт будет работоспособен)
__________________
В любом из нас спит гений. И с каждым днем все крепче.
А я с дешифрацией ид пакета, когда он меняется каждую сессию, не могу разобраться, плак плак
При беглом осмотре видно, что ты сам же запрещаешь отправлять пакеты этого типа, возможно дело в этом иф
Код:
if FromServer then
case pck[1] of
// Ловим пакет KeyPacket от сервера чтобы он не дублировался
#$2E: begin
pck:='';
end;
end;
Если это для бота, то палевно, т.к. бот очень часто стучится и может получить по башке большим баном. Нужно в самом боте сделать делей к коннекту, т.е. прикрутив к нему таймер в скрипте, и запретить отправлять любые пакеты, вкл лс
J-Fobos предложил хорошее решение.
Последний раз редактировалось Xen, 06.05.2010 в 08:58.
Xen, пакетхак не работает с лс, так что "запретить отправлять любые пакеты, вкл лс" не получится. И тема уже решилась, автор прекрасно реализовал нужные ему вещи (мы в личке пообщались).
__________________
В любом из нас спит гений. И с каждым днем все крепче.