через батник вроде l2.exe account=admin password=adminну ладно, чёто не хотит
мне вот интересно то что для автологина он используется библиотеку енти.длл т.е. как бы есть команда автозаполнения формы логин пароль
я вот делал батникно не работает в таком виде, мб есть вариант впихнуть сюда что то другое что бы акк и пароль уже были заполнены но не нажата кнопка логинКод:l2 -login:<admin> -password:<0000>
не, чёто не иле не зашлочерез батник вроде l2.exe account=admin password=admin
и в l2.ini поле
[Auth]
CmdLineLogin=true
@echo off
start l2.exe
timeout /t 2 /nobreak > nul
powershell -command "$wshell = New-Object -ComObject wscript.shell; $wshell.AppActivate('l2'); Start-Sleep -Milliseconds 500; $wshell.SendKeys('LOGIN'); Start-Sleep -Milliseconds 500; $wshell.SendKeys('{TAB}'); Start-Sleep -Milliseconds 500; $wshell.SendKeys('PASSWORD')"
После этого можешь еще enter в клиент напихать чтобы тыкал до входа в игру))вообщем нашел вариант альтернативного 5 строчного кода автологина
Код:@echo off start l2.exe timeout /t 2 /nobreak > nul powershell -command "$wshell = New-Object -ComObject wscript.shell; $wshell.AppActivate('l2'); Start-Sleep -Milliseconds 500; $wshell.SendKeys('LOGIN'); Start-Sleep -Milliseconds 500; $wshell.SendKeys('{TAB}'); Start-Sleep -Milliseconds 500; $wshell.SendKeys('PASSWORD')"
запуск из бат файла
мне не нужен был вход, мне нужен был только автоввод логин парольПосле этого можешь еще enter в клиент напихать чтобы тыкал до входа в игру))
наверно иза....ставлю вот так
Код:[AutoLogin] Login=admin Password=0000
и всё-поломка)
ага, там не так просто как хотелось бы)наверно иза....
Here's the autologin code for interlude, which needs work but already works, especially thanks to Charmant
The login and password are taken from the AutoLogin.ini file, which should be next to the dll in your system folder.
AutoLogin.ini with the following content:
C++ Visual Studio 2022 codeКод:[AutoLogin] Login=admin Password=admin
C++:#include "pch.h" #include <windows.h> #include <string> extern "C" void __declspec(dllexport) __stdcall function1() { Stub for exporting L2.exe (From customer crits!) } namespace { enum L2ConsoleState { Loading = 0, Unknown = 1, Login = 2, CharCreate = 3, CharSelect = 4, InGame = 5 }; class UL2ConsoleWnd {}; UL2ConsoleWnd* UL2ConsoleWndPtr = nullptr; uintptr_t consoleOffset = 0x3663bc; for IL client } Defining the UNetworkHandler class class UNetworkHandler {}; Function type: RequestAuthLogin typedef int(__fastcall* RequestAuthLoginFn)(UNetworkHandler*, int, const wchar_t*, const wchar_t*, int); Offset for UNetworkHandler in engine.dll const uintptr_t unetworkOffset = 0x81F538; Global variables for storing pointers UNetworkHandler** unetwork = nullptr; RequestAuthLoginFn requestAuthLoginFn = nullptr; Function for authorization static void RequestLogin(const std::wstring& login, const std::wstring& password) { Verifying pointer initialization if (!unetwork || !requestAuthLoginFn) { return; } Calling the Authorization Function from the Game requestAuthLoginFn(*unetwork, 0, login.c_str(), password.c_str(), 0); } A function to read a string from an INI file static void ReadIniString() { std::wstring login; std::wstring password; wchar_t buffer[256] = { 0 }; Reading the login and password from the ini file GetPrivateProfileStringW(L"AutoLogin", L"Login", L"", buffer, _countof(buffer), L".\\AutoLogin.ini"); login = buffer; Reading the login and password from the ini file GetPrivateProfileStringW(L"AutoLogin", L"Login", L"", buffer, _countof(buffer), L".\\AutoLogin.ini"); password = buffer; Calling the Authorization Function RequestLogin(login, password); } static void L2StatusLoad() { HMODULE hNwindowModule = nullptr; while (hNwindowModule == nullptr) { hNwindowModule = GetModuleHandleW(L"nwindow.dll"); Sleep(1000); } Getting a valid pointer to the UL2ConsoleWnd uintptr_t pUL2ConsoleWnd = (reinterpret_cast<uintptr_t>(hNwindowModule)) + consoleOffset; while (UL2ConsoleWndPtr == nullptr) { UL2ConsoleWndPtr = *reinterpret_cast<UL2ConsoleWnd**>(pUL2ConsoleWnd); Sleep(300); } Get the address where the current state is recorded L2ConsoleState* statePtr = reinterpret_cast<L2ConsoleState*>(UL2ConsoleWndPtr + 0x38); while (true) { L2ConsoleState currentState = *statePtr; switch (currentState) { case L2ConsoleState::Loading: MessageBoxW(NULL, L"load", L"L2ConsoleState", MB_OK); ReadIniString(); exit; break; case L2ConsoleState::Login: MessageBoxW(NULL, L"lobby", L"L2ConsoleState", MB_OK); break; case L2ConsoleState::CharCreate: MessageBoxW(NULL, L"Creation of Enchantment", L"L2ConsoleState", MB_OK); break; case L2ConsoleState::CharSelect: MessageBoxW(NULL, L"char selection", L"L2ConsoleState", MB_OK); break; case L2ConsoleState::InGame: MessageBoxW(NULL, L"in-game", L"L2ConsoleState", MB_OK); break; } Sleep(5000); } } Flow for authorization static DWORD WINAPI TestThread(LPVOID lpParameter) { L2StatusLoad(); return 0; } DLL Entry Point extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { Disable Library Function Call Tracking DisableThreadLibraryCalls(hModule); Getting the engine.dll Module HMODULE engineModule = GetModuleHandleW(L"engine.dll"); if (engineModule) { Getting the UNetworkHandler Address unetwork = reinterpret_cast<UNetworkHandler**>(reinterpret_cast<uintptr_t>(engineModule) + unetworkOffset); Getting the address of the RequestAuthLogin function requestAuthLoginFn = (RequestAuthLoginFn)GetProcAddress(engineModule, "? RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z"); } Create a flow for authorization CreateThread(nullptr, 0, TestThread, nullptr, 0, nullptr); } return TRUE; }
And here are the ready-made files for those who want to set up autologin (*Login window only*): just unzip the archive to the interlude system folder of the game and don't forget to change the login and password in the AutoLogin.ini file.
probably IDA pro or some other debugger, decompilerThis code works, but how do you find these offsets like `consoleOffset` and `unetworkOffset`? What tool do you use?
Yea I think that's the next level of debugging. Do you have any tutorials or guides anywhere that explain this topic? I was trying to find that offset manually using IDA Pro, but without any luck.probably IDA pro or some other debugger, decompiler
Find constructor first , manuals are on stackoverflow echange , ida pro forums and on googleYea I think that's the next level of debugging. Do you have any tutorials or guides anywhere that explain this topic? I was trying to find that offset manually using IDA Pro, but without any luck.
well thats because its only first part , then u have to find where it is used, in debugger mode.I have found it, in IDA, but the addresses does not tell me anything, the offset specified in topic is `0x81F538`. The starting address of engine.dll seems to be `10301005`
Посмотреть вложение 82962
0x81F538 - это RVA (Relative Virtual Address)but the addresses does not tell me anything, the offset specified in topic is `0x81F538`.
Since the function RequestAuthLogin exported from dll with __thiscall the more correct code will beКод на с++ Visual Studio 2022
C++:// Тип функции RequestAuthLogin typedef int(__fastcall* RequestAuthLoginFn)(UNetworkHandler*, int, const wchar_t*, const wchar_t*, int); ......... // Вызов функции авторизации из игры requestAuthLoginFn(*unetwork, 0, login.c_str(), password.c_str(), 0);
typedef int(__thiscall* RequestAuthLoginFn)(UNetworkHandler*, const wchar_t*, const wchar_t*, int);
requestAuthLoginFn(*unetwork, login.c_str(), password.c_str(), 0);
C моими познаниями с++ Ctrl+C и Ctrl+V тут предостаточно инфы.хотелось бы полноценный гайд для новичков ибо из обрывков кода без навыка кодинга ничего не сделать
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?