Просмотр полной версии : автоматический вход
controller
21.06.2015, 11:49
люди добрые, подсказку дайте, как реализовать это в л2. Пробывал искать классы поля ввода логина и пароля, но все объекты клиента, представляют собой один класс....как L2WindowW.... следовательно сюда ничего не передается. Есть вариант через запись в память, адреса логина и пароля вроде как не меняются. И они не динамичные. Но есть проблемы с передачей текста в память. И нажатие кнопки войти... Может есть у кого какие идеи?
Вызвать апи функцию клиента
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 в памяти. Как это сделать не перехватив не одного пакета я хз.
а редактирование l2.ini не поможет?
[AutoLogOn]
IsL2AutoLogOn=Ture
L2ID=zodiac
L2Passwd=zodiac
L2Slot=7
там Ture вместо True - что будет если поправить и вписать свой логин и пароль?
controller
21.06.2015, 14:49
на счет вызова апи клиента, думаю самый хороший вариант, но я с этим не справлюсь..... На счет редактирования л2 ини не знал. Попробую... других вариантов нет? есть же программы авто входа, Как вот они работают
редактирование не помогло...
вот тут интересная тема: https://forum.zone-game.info/showthread.php?p=369791
в моем случае - С4 - таких параметров и вовсе нет в л2.ини :)
зато в моем случае на клиенте нет никакой защиты - думаю обычными винапями можно обойтись. даже есть алгоритм на том-же форуме:
GetWindow на окно приложения
SetWindowText логин
потом кеу на таб
SetWindowText пасс
key на интер кажеться три раза на вход агрии с правилами и вход сервер
controller
21.06.2015, 18:39
SetWindowText логин
потом кеу на таб
SetWindowText пасс вот тут малость не понятно
ведь функция SetWindowText изменяет заголовок окна. Зачем это вообще? Не пойму
я сижу сейчас с телефона. Ты сказал там где то алгоритм есть, можно код его сюда? Или ссылку
SetWindowText логин
потом кеу на таб
SetWindowText пасс вот тут малость не понятно
ведь функция SetWindowText изменяет заголовок окна. Зачем это вообще? Не пойму
я сижу сейчас с телефона. Ты сказал там где то алгоритм есть, можно код его сюда? Или ссылку
На каком зяыке программирования пишешь код?
эм... за что купил - зато продал :) там видимо не сетвиндовстекст, а сенд подразумевался. типа посылать окну нажатые клавиши. то есть принцип как банальные кликеры работают, только вместо всяких F1 - ввод логина и пароля. когда окно ладвы загружается - там автоматом фокус ввода на логине, при нажатии таб - перепрыгивает на пароль. и ентыром происходит вход, потом окно соглашения...
controller
21.06.2015, 21:27
а ну это мы проходили, не очень удобно. Все равно спасибо за советы.
Добавлено через 9 минут
На каком зяыке программирования пишишь код?
делфи
Пример вставки текста в окно л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);
Вызвать апи функцию клиента
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"
Конструктор вызывается уже при старте игрового клиента.
Подниму свой некропост.
Получить UNH оказалось просто.
Нужно перехватить конструктор, для IL: "?InternalConstructor@UNetworkHandler@@SAXPAX@Z"
Конструктор вызывается уже при старте игрового клиента.
Если память моя меня не подводит (методом тыка я хукал функции конструктора UNH), итог был один = Critical Error с ошибкой UGameEngine::Init (может быть что-то в этом роде возникать на серверах с защитой), не знаю в чем суть, но подозреваю что защита пытается проверять наличие хука.
Кстати какой-то параметр не понятный там передавался. Не стал лезть в детали и продолжать экспериментировать с конструктором.
Хроники Interlude / Протокол 746
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot