PDA

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


controller
21.06.2015, 11:49
люди добрые, подсказку дайте, как реализовать это в л2. Пробывал искать классы поля ввода логина и пароля, но все объекты клиента, представляют собой один класс....как L2WindowW.... следовательно сюда ничего не передается. Есть вариант через запись в память, адреса логина и пароля вроде как не меняются. И они не динамичные. Но есть проблемы с передачей текста в память. И нажатие кнопки войти... Может есть у кого какие идеи?

Yegor
21.06.2015, 12:13
Вызвать апи функцию клиента


int (__fastcall *UNetworkHandler_RequestAuthLogin)(UNetworkHandler *, int, wchar_t const * login, wchar_t const * password,int param) = 0;
....
(FARPROC&) UNetworkHandler_RequestAuthLogin = GetProcAddress(hEngine, "?RequestAuthLogin@UNetworkHandler@@UAEHPB_W0H@Z");
....
(*UNetworkHandler_RequestAuthLogin)(UNH, 0/*что угодно*/, login, password, 0);


Только вот надо изначально получить UNH, это указатель на объект UNetworkHandler в памяти. Как это сделать не перехватив не одного пакета я хз.

SeregaZ
21.06.2015, 12:25
а редактирование l2.ini не поможет?
[AutoLogOn]
IsL2AutoLogOn=Ture
L2ID=zodiac
L2Passwd=zodiac
L2Slot=7
там Ture вместо True - что будет если поправить и вписать свой логин и пароль?

controller
21.06.2015, 14:49
на счет вызова апи клиента, думаю самый хороший вариант, но я с этим не справлюсь..... На счет редактирования л2 ини не знал. Попробую... других вариантов нет? есть же программы авто входа, Как вот они работают

SeregaZ
21.06.2015, 16:50
редактирование не помогло...

вот тут интересная тема: https://forum.zone-game.info/showthread.php?p=369791
в моем случае - С4 - таких параметров и вовсе нет в л2.ини :)

зато в моем случае на клиенте нет никакой защиты - думаю обычными винапями можно обойтись. даже есть алгоритм на том-же форуме:
GetWindow на окно приложения
SetWindowText логин
потом кеу на таб
SetWindowText пасс
key на интер кажеться три раза на вход агрии с правилами и вход сервер

controller
21.06.2015, 18:39
SetWindowText логин
потом кеу на таб
SetWindowText пасс вот тут малость не понятно
ведь функция SetWindowText изменяет заголовок окна. Зачем это вообще? Не пойму
я сижу сейчас с телефона. Ты сказал там где то алгоритм есть, можно код его сюда? Или ссылку

Yegor
21.06.2015, 19:58
SetWindowText логин
потом кеу на таб
SetWindowText пасс вот тут малость не понятно
ведь функция SetWindowText изменяет заголовок окна. Зачем это вообще? Не пойму
я сижу сейчас с телефона. Ты сказал там где то алгоритм есть, можно код его сюда? Или ссылку

На каком зяыке программирования пишешь код?

SeregaZ
21.06.2015, 20:15
эм... за что купил - зато продал :) там видимо не сетвиндовстекст, а сенд подразумевался. типа посылать окну нажатые клавиши. то есть принцип как банальные кликеры работают, только вместо всяких F1 - ввод логина и пароля. когда окно ладвы загружается - там автоматом фокус ввода на логине, при нажатии таб - перепрыгивает на пароль. и ентыром происходит вход, потом окно соглашения...

controller
21.06.2015, 21:27
а ну это мы проходили, не очень удобно. Все равно спасибо за советы.

Добавлено через 9 минут
На каком зяыке программирования пишишь код?

делфи

Yegor
21.06.2015, 22:32
Пример вставки текста в окно л2:


procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState; specialkey: Boolean);
{************************************************* ***********
* Procedure PostKeyEx
*
* Parameters:
* hWindow: target window to be send the keystroke
* key : virtual keycode of the key to send. For printable
* keys this is simply the ANSI code (Ord(character)).
* shift : state of the modifier keys. This is a set, so you
* can set several of these keys (shift, control, alt,
* mouse buttons) in tandem. The TShiftState type is
* declared in the Classes Unit.
* specialkey: normally this should be False. Set it to True to
* specify a key on the numeric keypad, for example.
* If this parameter is true, bit 24 of the lparam for
* the posted WM_KEY* messages will be set.
* Description:
* This procedure sets up Windows key state array to correctly
* reflect the requested pattern of modifier keys and then posts
* a WM_KEYDOWN/WM_KEYUP message pair to the target window. Then
* Application.ProcessMessages is called to process the messages
* before the keyboard state is restored.
* Error Conditions:
* May fail due to lack of memory for the two key state buffers.
* Will raise an exception in this case.
* NOTE:
* Setting the keyboard state will not work across applications
* running in different memory spaces on Win32 unless AttachThreadInput
* is used to connect to the target thread first.
*Created: 02/21/96 16:39:00 by P. Below
************************************************** **********}

type
TBuffers = array [0..1] of TKeyboardState;
var
pKeyBuffers: ^TBuffers;
lParam: LongInt;
begin
(* check if the target window exists *)
if IsWindow(hWindow) then
begin
(* set local variables to default values *)
//pKeyBuffers := nil;
lParam := MakeLong(0, MapVirtualKey(key, 0));

(* modify lparam if special key requested *)
if specialkey then
lParam := lParam or $1000000;

(* allocate space for the key state buffers *)
New(pKeyBuffers);
try
(* Fill buffer 1 with current state so we can later restore it.
Null out buffer 0 to get a "no key pressed" state. *)
GetKeyboardState(pKeyBuffers^[1]);
FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);

(* set the requested modifier keys to "down" state in the buffer*)
if ssShift in shift then
pKeyBuffers^[0][VK_SHIFT] := $80;
if ssAlt in shift then
begin
(* Alt needs special treatment since a bit in lparam needs also be set *)
pKeyBuffers^[0][VK_MENU] := $80;
lParam := lParam or $20000000;
end;
if ssCtrl in shift then
pKeyBuffers^[0][VK_CONTROL] := $80;
if ssLeft in shift then
pKeyBuffers^[0][VK_LBUTTON] := $80;
if ssRight in shift then
pKeyBuffers^[0][VK_RBUTTON] := $80;
if ssMiddle in shift then
pKeyBuffers^[0][VK_MBUTTON] := $80;

(* make out new key state array the active key state map *)
SetKeyboardState(pKeyBuffers^[0]);
(* post the key messages *)
if ssAlt in Shift then
begin
PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);
PostMessage(hWindow, WM_SYSKEYUP, key, lParam or integer($C0000000));
end
else
begin
PostMessage(hWindow, WM_KEYDOWN, key, lParam);
PostMessage(hWindow, WM_KEYUP, key, lParam or integer($C0000000));
end;
(* process the messages *)
//ad.ToLogFile('Before ProcessMessages PostKeyExHWND');
Application.ProcessMessages;

(* restore the old key state map *)
SetKeyboardState(pKeyBuffers^[1]);
finally
(* free the memory for the key state buffers *)
if pKeyBuffers <> nil then
Dispose(pKeyBuffers);
end; { If }
end;
end; { PostKeyEx }

function InsertText(text: string; winHandle: HWND): boolean;
var
i: word;
ThreadID, my: cardinal;
hFocusedWnd: HWND;
ch: integer;
begin
ThreadID:= GetWindowThreadProcessId(winHandle, nil);
my:= GetCurrentThreadId;
AttachThreadInput(ThreadID, my, true);
hFocusedWnd:= GetFocus;

for i:= 1 to Length(text) do
begin
ch:= ord(text[i]);
PostMessage(hFocusedWnd, WM_CHAR, ch, 1);
end;
AttachThreadInput(ThreadID, my, false);
Result:= true;
Sleep(300);
end;



....
var
clientHWND: HWND;
....
clientHWND:= FindWindow('l2UnrealWWindowsViewportWindow', nil);

InsertText(Login, clientHWND);
Sleep(2000);
PostKeyExHWND(clientHWND, VK_TAB, [], false);
Sleep(1000);
InsertText(Password, clientHWND);
Sleep(2000);
PostKeyExHWND(clientHWND, VK_RETURN, [], false);

Yegor
10.10.2020, 14:39
Вызвать апи функцию клиента


int (__fastcall *UNetworkHandler_RequestAuthLogin)(UNetworkHandler *, int, wchar_t const * login, wchar_t const * password,int param) = 0;
....
(FARPROC&) UNetworkHandler_RequestAuthLogin = GetProcAddress(hEngine, "?RequestAuthLogin@UNetworkHandler@@UAEHPB_W0H@Z");
....
(*UNetworkHandler_RequestAuthLogin)(UNH, 0/*что угодно*/, login, password, 0);


Только вот надо изначально получить UNH, это указатель на объект UNetworkHandler в памяти. Как это сделать не перехватив не одного пакета я хз.

Подниму свой некропост.
Получить UNH оказалось просто.
Нужно перехватить конструктор, для IL: "?InternalConstructor@UNetworkHandler@@SAXPAX@Z"
Конструктор вызывается уже при старте игрового клиента.

0day
25.10.2020, 21:23
Подниму свой некропост.
Получить UNH оказалось просто.
Нужно перехватить конструктор, для IL: "?InternalConstructor@UNetworkHandler@@SAXPAX@Z"
Конструктор вызывается уже при старте игрового клиента.

Если память моя меня не подводит (методом тыка я хукал функции конструктора UNH), итог был один = Critical Error с ошибкой UGameEngine::Init (может быть что-то в этом роде возникать на серверах с защитой), не знаю в чем суть, но подозреваю что защита пытается проверять наличие хука.

Кстати какой-то параметр не понятный там передавался. Не стал лезть в детали и продолжать экспериментировать с конструктором.
Хроники Interlude / Протокол 746