PDA

Просмотр полной версии : Пакет KeyPacket


Marfey
20.04.2010, 04:25
Доброе время суток...

Хочу сделать чтобы скрипт разрешал логинеться только определенным логинам.
Для этого отлавливаю пакет 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

J-Fobos
20.04.2010, 21:26
Для этого отлавливаю пакет AuthLogin из этого пакете проверяю логин и если ему доступ разрешен, то пропускаю этот пакет дальше на логин сервер.
Насколько я знаю пакетхак не работает с логин сервером, или не?

И вообще вы сильно усложняете себе жизнь.
Смысл вам блокировать пакеты KeyPacket ProtocolVersion, а потом отправлять их. Пусть клиент и сервер сами с ними работают как им захочется, вам же только проверить логин надо, а логин передается в пакете (который идет к ГЕЙМ серверу, а не к логин серверу) RequestAuthLogin. Значит просто в теле скрипта пишем код
if FromClient and pck[1]=#$00 then //тут идентификатор RequestAuthLogin, не помню какой именно, а пакетхака под рукой нету чтобы глянуть.
if ReadS(2) <> 'Логин которому разрешено заходить' then
pck:=''; //тупо блокируем пакет и дальше не войти, ну или шлем логаут.

А еще можно средствами самого пакетхака ;)
if ConnectName<>'ник чара которому разрешено заходить' then pck:='';

Marfey
21.04.2010, 01:52
[QUOTE=J-Fobos;84647]Насколько я знаю пакетхак не работает с логин сервером, или не?
QUOTE]

Работает).

Если не перехватывать пакеты ProtocolVersion и KeyPacket, а только работать с пакетом AuthLogin, то все замечательно работает, но если логину через скрипт запрещено заходить на сервер (а у него например стоит делай захода 1 минута), то каждую минуту он будет слать на сервер пакет ProtocolVersion, а дальше будет молчание, мне кажеться это палевно и админы могут по IP потом блокирнуть.

J-Fobos
21.04.2010, 02:47
Это я так тонко намекал что НЕ работает с логин сервером :)

Думаете просто так порт 2106 (это порт логин сервера) по умолчанию стоит в строке "не игровые порты" ? В этом можно легко убедится: убрать порт из исключений и установить опцию "не закрывать вкладки при закрытии соединений", тогда увидите связь с логин сервером.
А пакеты ProtocolVersion и KeyPacket для связи геймсервера и клиента. И исходя из того что вы сейчас написали получается, что скрипт в шапке темы бесполезный - попытка входа все равно будет зафиксирована на логин сервере.

Ну а по поводу "это палевно", частично вы правы, в логах будет отображаться что соединение разорвалось из за того что клиент не ответил, но я ж не знал что делай захода будет 1 минута, потому и написал pck:='', хотя и написал в коментах "или шлем логаут" :)
С логаутом лог сервера будет чист.

Marfey
21.04.2010, 03:27
Это я так тонко намекал что НЕ работает с логин сервером :)

Думаете просто так порт 2106 (это порт логин сервера) по умолчанию стоит в строке "не игровые порты" ? В этом можно легко убедится: убрать порт из исключений и установить опцию "не закрывать вкладки при закрытии соединений", тогда увидите связь с логин сервером.
А пакеты ProtocolVersion и KeyPacket для связи геймсервера и клиента. И исходя из того что вы сейчас написали получается, что скрипт в шапке темы бесполезный - попытка входа все равно будет зафиксирована на логин сервере.

Ну а по поводу "это палевно", частично вы правы, в логах будет отображаться что соединение разорвалось из за того что клиент не ответил, но я ж не знал что делай захода будет 1 минута, потому и написал pck:='', хотя и написал в коментах "или шлем логаут" :)
С логаутом лог сервера будет чист.

Сори я заранее (до того как начал писать скрипт) убрал порт 2106 из не игровых и и установил галку "не закрывать вкладку при закрытии соединения".
И все это время не мог понять почему открываться две вкладки при соединение и в одной вкладке идут какие-то левые пакеты, а в другой нормальные.
Теперь я понял что одна была на логин сервер (где левые пакеты, т.е их не распознает l2phx), а вторая это с гейм сервером.

J-Fobos
21.04.2010, 19:50
Специально проверил на локальном сервере. Когда блокировать пакет соединение висит, но в логах чисто. Когда происходит повторный заход в игру в логах выводится информация что соединение разорвано и создается новое. А если посылать пакет на логаут то соединение разрывается и в логах ничего не отображается. Так что можно без опаски посылать пакет на логаут при неверном логине. И если не секрет, а какой смысл в блоке логинов? (если для защиты скрипта от других пользователей, то удалением этих строк скрипт будет работоспособен)

Marfey
22.04.2010, 03:06
И если не секрет, а какой смысл в блоке логинов?

Отписал в личку.

Xen
06.05.2010, 08:27
А я с дешифрацией ид пакета, когда он меняется каждую сессию, не могу разобраться, плак плак

При беглом осмотре видно, что ты сам же запрещаешь отправлять пакеты этого типа, возможно дело в этом иф
if FromServer then
case pck[1] of

// Ловим пакет KeyPacket от сервера чтобы он не дублировался
#$2E: begin

pck:='';

end;
end;

Если это для бота, то палевно, т.к. бот очень часто стучится и может получить по башке большим баном. Нужно в самом боте сделать делей к коннекту, т.е. прикрутив к нему таймер в скрипте, и запретить отправлять любые пакеты, вкл лс
J-Fobos предложил хорошее решение.

J-Fobos
06.05.2010, 20:38
Xen, пакетхак не работает с лс, так что "запретить отправлять любые пакеты, вкл лс" не получится. И тема уже решилась, автор прекрасно реализовал нужные ему вещи (мы в личке пообщались). :)