avatar_Sparkling

Сброс таргета через геодату: уязвимости, читы, баги La2

Автор Sparkling, 2014 Окт. 15, 16:15

« назад - далее »

0 Пользователи и 3 гостей просматривают эту тему.

Ключевые слова [SEO] багиlineage2уязвимости

Sparkling

Уязвимость заключается в том, что при изменении координаты Z можно чаром "взлететь" в небо или "провалиться" сквозь землю. При этом у самого такого чара пропадают все игроки и нпц, а так же с него сбрасывается таргет. Баг был обнаружен, когда в городе была мирная зона и нажимая в небо чар переходил в General Field с пропажей всех объектов (чаров, нпц) в городе.

Под этот баг написали скрипт для пакетника, который автоматически сбрасывает таргет. Описание принципа работы: после включения скрипта необходимо вызвать пакет от сервера UserInfo, в котором содержится ObjectID вашего чара. Для вызова UserInfo можно снять/одеть пуху, шмот, использовать баф на себя, сесть на продажу, сделать тп и т.д. После того как будет запомнен ObjectID, скрипту необходимо поймать от клиента пакет ValidatePosition, в котором хранятся координаты и Heading чара. Для этого достаточно сделать шаг или побежать. Клиент отправит MoveBackwardToLocation с последующими ValidatePosition. После этого скрипт автоматически отсылает ValidatePosition с измененной координатой Z, что сбрасывает таргет, если вас выделили, или при нажатии социального действия Victory. Для возврата нормальной координаты Z - социальное действие Greeting.

Вкратце:
1. Запустить скрипт.
2. Одеть/снять оружие или шмот.
3. Сдвинуться с места.
4. Включить социальным действием Victory.

Сам скрипт для хроник Gracia Final:
Спойлер
const
// FromClient
mv = #$0F; // MoveBackwardToLocation
vp = #$59; // ValidatePosition
sa = #$56; // RequestActionUse
// FromServer
cs = #$4A; // CreatureSay
ts = #$23; // TargetSelected
ui = #$32; // UserInfo
vl = #$79; // ValidateLocation

high = 5000;

// Name='nick';

var
ObjectID,act,ToX,ToY,ToZ,OriginX,OriginY,OriginZ,MoveMovement: integer;
X,Y,Z,Heading,Data: integer;
IsHidden: boolean;

procedure SendMsg2(msg:string);
begin
buf := cs;
WriteD(0);
WriteD(15);
WriteS('');
WriteS(msg);
//SendToClientEx(Name);
SendToClient;
end;

procedure Init; //Вызывается при включении скрипта
begin
act := 0;
ObjectID := 0;
IsHidden := false;
SendMsg2('Снимите или оденьте пуху и сдвиньтесь с места');
end;

procedure Hide;
begin
buf := vp;
WriteD(X);
WriteD(Y);
if act=1 then
WriteD(Z - high)
else if act=2 then
WriteD(Z + high)
else
WriteD(Z);
WriteD(Heading);
WriteD(Data);
SendToServer;
pck := '';
if act=0 then
IsHidden := false
else
IsHidden := true;
end;

begin

// If got targeted
if FromServer and (pck[1]=ts) and (ReadD(6)=ObjectID) then
begin
if ReadD(2)<>ObjectID then
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
end;

// Get ObjectID from UserInfo packet
if FromServer and (pck[1]=ui) and (ObjectID=0) then
begin
ObjectID := ReadD($12);
SendMsg2('Запомнен ObjectID = '+IntToStr(ObjectID));
end
;
// New MoveBackwardToLocation
if FromClient and (pck[1]=mv) and (act>0) then
begin
// Reading values
ToX := ReadD(2);
ToY := ReadD(6);
ToZ := ReadD(10);
OriginX := ReadD(14);
OriginY := ReadD(18);
OriginZ := ReadD(22);
MoveMovement := ReadD(26);
// Making packet
buf := mv;
WriteD(ToX);
WriteD(ToY);
if act=1 then
WriteD(ToZ - high)
else if act=2 then
WriteD(ToZ + high)
else
WriteD(ToZ);
WriteD(OriginX);
WriteD(OriginY);
if act=1 then
WriteD(OriginZ - high)
else if act=2 then
WriteD(OriginZ + high)
else
WriteD(OriginZ);
WriteD(MoveMovement);
//SendToServerEx(Name);
SendToServer;
pck := '';
end;

// New ValidatePosition
if FromClient and (pck[1]=vp) then
begin
// Always keep coordinates
X := ReadD(2);
Y := ReadD(6);
Z := ReadD(10);
Heading := ReadD(14);
Data := ReadD(18);
if act>0 then
begin
Hide;
end;
end;

// Block ValidateLocation
if FromServer and (pck[1]=vl) then
begin
pck := '';
end;

// Social action check
if FromClient and (pck[1]=sa) then
begin
case pck[2] of
#$0C:
begin
act := 0;
SendMsg2('OFF');
if IsHidden then Hide;
end;
#$0D:
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
#$0E:
begin
act := 2;
SendMsg2('Air ON');
Hide;
end;
end;
pck := '';
end;

end.
[свернуть]


Что бы не было лишних вопросов - скрипты активируются, через l2phx. Вопросы по программе лучше задавать на официальном форуме - coderx.ru

Пакеты под Interlude
Спойлер
const
// FromClient
mv = #$01; // MoveBackwardToLocation
vp = #$48; // ValidatePosition
sa = #$1B; // RequestActionUse
// FromServer
cs = #$4A; // CreatureSay
ts = #$29; // TargetSelected
ui = #$04; // UserInfo
vl = #$61; // ValidateLocation

high = 5000;

// Name='nick';

var
ObjectID,act,ToX,ToY,ToZ,OriginX,OriginY,OriginZ,MoveMovement: integer;
X,Y,Z,Heading,Data: integer;
IsHidden: boolean;

procedure SendMsg2(msg:string);
begin
buf := cs;
WriteD(0);
WriteD(15);
WriteS('');
WriteS(msg);
//SendToClientEx(Name);
SendToClient;
end;

procedure Init; //Вызывается при включении скрипта
begin
act := 0;
ObjectID := 0;
IsHidden := false;
SendMsg2('Снимите или оденьте пуху и сдвиньтесь с места');
end;

procedure Hide;
begin
buf := vp;
WriteD(X);
WriteD(Y);
if act=1 then
WriteD(Z - high)
else if act=2 then
WriteD(Z + high)
else
WriteD(Z);
WriteD(Heading);
WriteD(Data);
SendToServer;
pck := '';
if act=0 then
IsHidden := false
else
IsHidden := true;
end;

begin

// If got targeted
if FromServer and (pck[1]=ts) and (ReadD(6)=ObjectID) then
begin
if ReadD(2)<>ObjectID then
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
end;

// Get ObjectID from UserInfo packet
if FromServer and (pck[1]=ui) and (ObjectID=0) then
begin
ObjectID := ReadD($12);
SendMsg2('Запомнен ObjectID = '+IntToStr(ObjectID));
end
;
// New MoveBackwardToLocation
if FromClient and (pck[1]=mv) and (act>0) then
begin
// Reading values
ToX := ReadD(2);
ToY := ReadD(6);
ToZ := ReadD(10);
OriginX := ReadD(14);
OriginY := ReadD(18);
OriginZ := ReadD(22);
MoveMovement := ReadD(26);
// Making packet
buf := mv;
WriteD(ToX);
WriteD(ToY);
if act=1 then
WriteD(ToZ - high)
else if act=2 then
WriteD(ToZ + high)
else
WriteD(ToZ);
WriteD(OriginX);
WriteD(OriginY);
if act=1 then
WriteD(OriginZ - high)
else if act=2 then
WriteD(OriginZ + high)
else
WriteD(OriginZ);
WriteD(MoveMovement);
//SendToServerEx(Name);
SendToServer;
pck := '';
end;

// New ValidatePosition
if FromClient and (pck[1]=vp) then
begin
// Always keep coordinates
X := ReadD(2);
Y := ReadD(6);
Z := ReadD(10);
Heading := ReadD(14);
Data := ReadD(18);
if act>0 then
begin
Hide;
end;
end;

// Block ValidateLocation
if FromServer and (pck[1]=vl) then
begin
pck := '';
end;

// Social action check
if FromClient and (pck[1]=sa) then
begin
case pck[2] of
#$02:
begin
act := 0;
SendMsg2('OFF');
if IsHidden then Hide;
end;
#$03:
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
#$04:
begin
act := 2;
SendMsg2('Air ON');
Hide;
end;
end;
pck := '';
end;

end.
[свернуть]

Похожие темы (5)