PDA

Просмотр полной версии : Обходим автобанчат в клиенте игры


Юля
18.10.2007, 13:36
Всем (а особенно барыгам) известен автоматический бан-чат на 1 минуту получаемый при частом написании сообшений в чат. И естественно это раздражает, особенно когда хочется что-нибудь эдакое большое написать. Приведу маленький кусочек из из своей программки (http://badgirl.hotmail.ru/l2chat/help.html (http://badgirl.hotmail.ru/l2chat/help.html)) который убирает этот дурацкий недостаток клиента :)

lib_NWindow := LoadLibrary('NWindow.dll');
...
lib := lib_NWindow + $563D0;
VirtualProtect(pointer(lib), 6, PAGE_EXECUTE_READWRITE, OldProtect);
p := pointer(lib);
byte(p^) := $e9;
byte(pointer(dword(p) + 1)^) := $eb;
byte(pointer(dword(p) + 2)^) := $00;
byte(pointer(dword(p) + 3)^) := $00;
byte(pointer(dword(p) + 4)^) := $00;
byte(pointer(dword(p) + 5)^) := $90;
VirtualProtect(pointer(lib), 6, PAGE_EXECUTE_READWRITE, OldProtect);


P.S.
код я сделала надеюсь максимально прозрачным, так что в комментариях думаю не нуждается; данный пример для С4, для Т0 - адрес будет 0x138895 (хотя можно динамически легко его определять под текушие хроники)

xkor
18.10.2007, 21:35
Юля, ты мне кстати в асе так и не ответила можно ли гдето твою чюдопрограммулинку достать), про сорци и спрашивать боюсь :oops:

StKolya
18.10.2007, 23:31
бу,ты нас всех заинтриговала,терь выложи,плиз exe или rar файлец с прогой,будем благодарны :wink:

Юля
19.10.2007, 05:21
к сожалению не дам, т.к. я продавала ее на своем сервере и люди ей до сих пор пользуются, распространять не имею права, хоть и бросила наконец-то играть :) но может как-нибудь напишу как пользоваться и управлять чатом в игре через nwindow.dll

xkor
19.10.2007, 12:02
ну вот и нафига было нам слюни тут пускать если прогу недостать?))), лучшеб и неговорила про неё)

Юля
19.10.2007, 14:14
ну вот и нафига было нам слюни тут пускать если прогу недостать?))), лучшеб и неговорила про неё)
блин, это было обьяснение почему я привожу код программы, а не рассказываю как пропатчить либу hex-редактором :(

StKolya
19.10.2007, 19:28
ёп,пагано :(

03.01.2008, 00:23
А не проще ли бан чата обходить через Хлапекс? Я например, если не хочу грузить бота хлапой торгую и бана не получаю!

23.01.2008, 14:33
Юля, а ты продаёш её?)

xkor
23.01.2008, 15:40
она тут с ноября не появлялась так что думаю спрашвать бесполезно...

23.01.2008, 19:55
А знаеш как с ней связаться?

xkor
23.01.2008, 22:05
А знаеш как с ней связаться?
нет.., асю она вернула брату а на мыльники неотвечает...

Ptica
21.04.2008, 18:50
Набрел случайно - http://ifolder.ru/6248383

Emocean
21.04.2008, 20:12
Ptica, я тоже находил =) Проблема в том, что там нет инструкции, как заставить работать эту прогу на интерлюдии...

ad01f
21.04.2008, 21:52
а чем пнх не нравится. поймать пакет say2 и повторять...

Emocean
21.04.2008, 22:43
а чем пнх не нравится. поймать пакет say2 и повторять...
Там удобный интерфейс и много функций. Над прогой хорошо поработали.

Grinch
04.05.2008, 09:23
эх на шоке пока прога работает :) протестил реально работает, но при большом желание можно это всё на l2phx сделать если кто нить работу с длл подправит

Flash
05.05.2008, 01:29
Супер прога! На ШОКе работает стабильно. Оказывает огромную помощ при торговле.

Grinch
06.05.2008, 19:17
народ поподробней об пропатчивании NWindow.dll ручками или статью, как узнать какой байт исправить нужно что б допустим снять блокирование чата или снять ограничение сисволов?

Drin
06.07.2008, 21:45
чуть элегантнее и для CT1, стилистику кода такую же как у авторши оставил для понятности:

lib_NWindow := LoadLibrary('NWindow.dll');
lib := lib_NWindow + $132060;
VirtualProtect(pointer(lib), 3, PAGE_EXECUTE_READWRITE, OldProtect);
p := pointer(lib);
byte(p^) := $c2;
byte(pointer(dword(p) + 1)^) := $08;
byte(pointer(dword(p) + 2)^) := $00;
VirtualProtect(pointer(lib), 3, PAGE_EXECUTE_READWRITE, OldProtect);

clyr
07.07.2008, 00:02
Вот вам скриптик....

l2phx

const
MaxMessages = 1000;
var
m: TMemo;
frm:TForm;
penel: TPanel;
etext: tedit;
button: tbutton;
box : TCheckBox;
every : TEdit;
_Name : TEdit;
i: Integer;
tm:TTimer;
Message, Name: String;

procedure SendMs(Sender: TObject);
var
Msg, Nm: String;
dd: integer;
begin
if etext.text<>'' then begin
buf:=#$38;
case etext.text[1] of
'!': begin
Msg:=Copy(etext.text,2,1000);
dd:=1;
nm:='';
end;
'$': begin
Msg:=Copy(etext.text,2,1000);
dd:=9;
nm:='';
end;
'+': begin
Msg:=Copy(etext.text,2,1000);
dd:=8;
nm:='';
end;
'"': begin
dd:=pos(' ', etext.text);
Msg:=Copy(etext.text,dd+1,1000);
nm:=Copy(etext.text,2,dd-3);
dd:=2;
end;
'#': begin
Msg:=Copy(etext.text,2,1000);
dd:=3;
nm:='';
end;
'@': begin
Msg:=Copy(etext.text,2,1000);
dd:=4;
nm:='';
end;
else begin
Msg:=etext.text;
dd:=0;
nm:='';
end;
end;
WriteS(Msg);
WriteD(dd);
if nm<>'' then WriteS(Nm);
SendToServerEx(_Name.Text);
end;
end;
procedure onNewCommand(obj:TObject;key:string);
var i:integer;
var symbol:Variant;
var after:string;
begin
if (key[1]=#$0D) then begin
SendMs(obj);
symbol := etext.Text[1];
after := '';
if symbol = '#' then after := '#';
if symbol = '!' then after := '!';
if symbol = '@' then after := '@';
if symbol = '$' then after := '$';
etext.Text := after;
end;
end;
procedure onTimer(Sender:TObject);
begin
tm.Interval := StrToInt(every.Text);
if box.checked = true then SendMs(Sender);
end;
procedure Init;
begin
frm := TForm.Create(nil);
frm.Caption := 'Chat';
frm.BorderStyle := bsSizeable;
frm.Position := poDesigned ;
frm.Width:=400;
frm.Height:=600;
m:=TMemo.Create(frm);
m.parent:=frm;
m.align:=alClient;
m.ReadOnly:=true;
m.ScrollBars:=ssBoth;
penel:=TPanel.Create(frm);
penel.parent:=frm;
penel.align:=alBottom;
penel.height:=48;
etext:=tedit.Create(penel);
etext.parent:=penel;
etext.align:=alTop;
button:=tbutton.Create(penel);
button.parent:=penel;
button.top := etext.height;
button.caption:='Send';
button.onClick:=@SendMs;
box := TCheckBox.Create(penel);
box.parent := penel;
box.Top := etext.height + 2;
box.Left := button.width + button.left +2;
box.Caption := 'Шторм через: ';
every:=tedit.Create(penel);
every.parent:=penel;
every.Left := box.Left + box.Width;
every.Top := button.top;
every.Text := IntToStr(3000);
tm := TTimer.Create(frm);
tm.Interval := 1000;
tm.Enabled := true;
tm.OnTimer := @OnTimer;
etext.OnKeyPress := @onNewCommand;
_Name:=tedit.Create(frm);
_Name.parent:=frm;
_Name.align := alTop;
_Name.Text := '';
frm.Show;
end;

procedure SaveToFile(prefix:string);
var name:string;
begin
name := prefix+'.'+ConnectName+'.'+DateToStr(Date)+'.'+Tim eToStr(Time)+'.txt';
while Pos(':',name) <> 0 do begin
name[Pos(':',name)] := '-';
end;
m.Lines.SaveToFile(name);
end;

procedure Free;
begin
SaveToFile('ChatLog');
box.Free;
every.Free;
tm.Free;
etext.Free;
button.Free;
penel.Free;
m.Free;
frm.Free;
end;



var tp:integer;
var ct:string;
var MessageCounter:integer;
begin
if _Name.Text = '' then _Name.Text := ConnectName;
if FromServer and (ConnectName = _Name.Text) and (pck[1]=#$4a) then
begin
i:=10;
name:=ReadS(i);
message:=ReadS(i);
tp := ReadD(6);
ct := '???';
if tp = 0 then ct := 'GNR';
if tp = 8 then ct := 'TRD';
if tp = 3 then ct := 'PRT';
if tp = 4 then ct := 'CLN';
if tp = 9 then ct := 'ALY';

ct := DateToStr(Date) + ' '+ TimeToStr(Time) + ', '+ ct;

if name='' then name:='Объявление: ';
m.Lines.Add('['+ct+'] '+Name+': '+message);

if MessageCounter > MaxMessages then begin
SaveToFile('Backup');
//m.Lines.Add('BACKUPED');
MessageCounter := 0;
end;
MessageCounter := MessageCounter+1;
end;
end.




Добавлено через 1 минуту
Основа:
Chat.txt из поставки l2phx 320

Возможности:

1. Отдельное окно чата.
2. "Автоспам": одна строчка раз в Х секунд
3. Длинный текст: отправка многострочного сообщения
4. Лог чата.

turamart
07.07.2008, 00:12
Юля, ты мне кстати в асе так и не ответила можно ли гдето твою чюдопрограммулинку достать), про сорци и спрашивать боюсь :oops:

Я вылаживал эту прогу (LineAge 2 Chat) недели месяц назад но тему удалили. Не справедливо...

xkor
07.07.2008, 00:22
turamart, да не, гдето эту темку видел и из неё качал, врятли её потом кто удалил, наверно просто затерялась среди моря флуда...

Vimmer
16.09.2010, 15:07
чуть элегантнее и для CT1, стилистику кода такую же как у авторши оставил для понятности:

lib_NWindow := LoadLibrary('NWindow.dll');
lib := lib_NWindow + $132060;
VirtualProtect(pointer(lib), 3, PAGE_EXECUTE_READWRITE, OldProtect);
p := pointer(lib);
byte(p^) := $c2;
byte(pointer(dword(p) + 1)^) := $08;
byte(pointer(dword(p) + 2)^) := $00;
VirtualProtect(pointer(lib), 3, PAGE_EXECUTE_READWRITE, OldProtect);

мб нубский вопрос, а зачем в конце вызывается VirtualProtect еще 1 раз?
с теми же параметрами..?

QaK
16.09.2010, 19:57
Vimmer, некропостер

xkor
16.09.2010, 21:46
Vimmer, по логике опечатка, должна вызваться как то так:
VirtualProtect(pointer(lib), 3, OldProtect, OldProtect);
дабы восстановить что было...

dyh9l
16.09.2010, 22:05
Vimmer, некропостер

хм.., а смысл от постов, тут веть хайдов нету вроде?)

xkor
16.09.2010, 23:38
dyh9l, в чем связь хайдов и воскрешения тем пролежавших в забвении пару лет?

spoil99
16.09.2010, 23:40
некрофилов сжечь!

Vimmer
17.09.2010, 05:05
Vimmer, по логике опечатка, должна вызваться как то так:
VirtualProtect(pointer(lib), 3, OldProtect, OldProtect);
дабы восстановить что было...

Спасибо, тоже подумалось что должна быть ошибка, но решил уточнить, а малоли какой хитрый выкрутас :D

Denever
01.05.2012, 20:27
library okda;
uses SysUtils, Classes, Windows, advApiHook;

var lib_NWindow:THandle;
lib:integer; p:pointer;
OldPageProtection: Cardinal;

begin
lib_NWindow := LoadLibrary('NWindow.dll');
lib := lib_NWindow + $138895;
VirtualProtect(pointer(lib), 6, PAGE_EXECUTE_READWRITE, OldPageProtection);
p := pointer(lib);
byte(p^) := $e9;
byte(pointer(dword(p) + 1)^) := $eb;
byte(pointer(dword(p) + 2)^) := $00;
byte(pointer(dword(p) + 3)^) := $00;
byte(pointer(dword(p) + 4)^) := $00;
byte(pointer(dword(p) + 5)^) := $90;
VirtualProtect(pointer(lib), 6, OldPageProtection, OldPageProtection);
end.
Захожу на сервер[Interlude] делаю инжект.
Ввожу сообщение нажимаю ENTER получаю:
General protection fault!
History: NCChatMark::UpdateMark <- NCChatWnd::ProcessNonCommandChatString <- NCChatWnd::ProcessChatLine <- UUIScript::execProcessChatMessage <- UObject::ProcessEvent <- (ChatWnd Transient.ChatWnd0, Function Interface.ChatWnd.OnCompleteEditBox) <- NCEditBox::OnKeyDown <- NCVirtualWndMain::PassToFocusedWindow <- NCVirtualWndMain::PassToFocusedWindow <- NCVirtualWndMain::PassToFocusedWindow <- NCVirtualWndMain::DispatchWndMsg <- NConsoleWnd::DispatchWndMsgX <- NConsoleWnd::DispatchWndMsg <- UWindowsViewport::ViewportWndProc <- WWindow::StaticProc <- DispatchMessage <- 002D11A8 256 <- MessagePump <- MainLoop

Denever
05.11.2012, 01:45
up

Добавлено через 18 часов 31 минуту
library okda;
uses
SysUtils,
Classes,
Windows;

var lib_NWindow:THandle;
lib:integer; p:pointer;
OldPageProtection: Cardinal;

begin
lib_NWindow := LoadLibrary('NWindow.dll');
lib := lib_NWindow + $563D0;
VirtualProtect(pointer(lib), 2, PAGE_EXECUTE_READWRITE, OldPageProtection);
p := pointer(lib);
byte(p^) := $e9;
byte(pointer(dword(p) + 1)^) := $eb;
byte(pointer(dword(p) + 2)^) := $90;
VirtualProtect(pointer(lib), 2, OldPageProtection, OldPageProtection);
end.
Крита нет. но Не Работает. Нужна помошь.

Zergatul
05.11.2012, 12:13
скорее всего там другая NWindow.dll и это значит что строка
lib := lib_NWindow + $563D0;
работает не так, как задумывалось. Нужно найти другое смещение. За тебя его никто не будет искать.

Denever
05.11.2012, 16:24
скорее всего там другая NWindow.dll и это значит что строка
lib := lib_NWindow + $563D0;
работает не так, как задумывалось. Нужно найти другое смещение. За тебя его никто не будет искать.
Как написала тс что это для c4. Для interlude 0x138895 - lib := lib_NWindow + $138895; - крит.
Как мне найти смещение?

Zergatul
05.11.2012, 17:03
Откуда я знаю) Я не дизассемблировал эту длл, я не знаю что байты там изменяют.
Как вариант, можешь найти оригинальные длл, для которых автор находила эти смещения. Потом по асм-коду рядом с этим смещением искать их в своей длл, и находить смещение для твоей длл.

Denever
22.11.2012, 07:03
Прикрепил файл с функциями..