Как сделать Автологин Интерлюдия?

  • Автор темы Автор темы BIT_hack
  • Дата начала Дата начала
ну ладно, чёто не хотит

мне вот интересно то что для автологина он используется библиотеку енти.длл т.е. как бы есть команда автозаполнения формы логин пароль


я вот делал батник
Код:
l2 -login:<admin> -password:<0000>
но не работает в таком виде, мб есть вариант впихнуть сюда что то другое что бы акк и пароль уже были заполнены но не нажата кнопка логин
через батник вроде l2.exe account=admin password=admin
и в l2.ini поле
[Auth]
CmdLineLogin=true
 

вообщем нашел вариант альтернативного 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')"

запуск из бат файла
 
вообщем нашел вариант альтернативного 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 в клиент напихать чтобы тыкал до входа в игру))
 
После этого можешь еще enter в клиент напихать чтобы тыкал до входа в игру))
мне не нужен был вход, мне нужен был только автоввод логин пароль
я хочу полюбоваться шикарными логин скринами, а потом уже заходить в игру в 2 клика
 
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:
Код:
[AutoLogin]
Login=admin
Password=admin
C++ Visual Studio 2022 code
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.

This 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.
Find constructor first , manuals are on stackoverflow echange , ida pro forums and on google
 
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`

ida-engine.dll.webp
 
but the addresses does not tell me anything, the offset specified in topic is `0x81F538`.
0x81F538 - это RVA (Relative Virtual Address)
0x10300000 - base image address
0x10b1f538 - это VA (Virtual Address)

Для использования в коде нужен именно RVA offset:
1735627580334.webp
DAT_10b1f538 - это VA для UNetworkHandler

1735627669641.webp
Для получения RVA нужно вычесть из VA базовый адрес (RVA = VA - image base)
1735627764695.webp
UNetworkOffset: 0x10b1f538 - 0x10300000 = 0x81F538.

Точно так же можно получить RVA для любой другой константы или функции.
 
Назад
Сверху Снизу