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

если окно не в фокусе. после логина что происходит норм?
 

если окно не в фокусе. после логина что происходит норм?
Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".
 
Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".

это на каждое окно под разных чаров надо каждый раз вбивать логин и пароль?
 
На данный момент — да, но никто не мешает вам реализовать свои идеи в коде.
CommandLineManager.h
C++:
#pragma once

struct CommandLineConstants
{
    /** Auth login/password set from launcher params (Format: String - e.g. "-authdata login,password") */
    static constexpr wchar_t AuthData[] = L"authdata";
};

class CommandLineManager
{
    public:
        /**
        * No copying or copy assignment allowed for this class.
        */
        CommandLineManager(CommandLineManager const&) = delete;
        CommandLineManager& operator=(CommandLineManager const&) = delete;

        /**
        * Initialization using a string containing all params
        */
        void Init(const wchar_t* lp_cmd_line);

        /**
        * Initialization using a collection of params
        */
        void Init(const std::vector<std::wstring>& cmd_line_params);

        /**
        * Checks command line arguments for a matching param
        *
        * @param param - Parameter to look for in command line arguments
        *
        * @return True if param is found in command line arguments
        */
        bool HasParam(const std::wstring& param);

        /**
        * Retrieves value associated with given command line parameter
        *
        * @param param - Parameter to look for in command line arguments
        *
        * @return Value associated with command line parameter
        */
        std::wstring GetParamValue(const std::wstring& param);

        /**
        * Checks command line arguments for a matching flag param
        *
        * @param param - Parameter to look for in command line arguments
        *
        * @return True if param is found in command line arguments and it is a flag param value
        */
        bool HasFlagParam(const std::wstring& param);

        std::map<std::wstring, std::wstring> GetCommandLineArgs()
        {
            return command_line_args_;
        }

        /**
        * Singleton
        */
        static CommandLineManager& Get();

    private:
        CommandLineManager() = default;

        /** True if command line parser initialized */
        static bool IsInitialized;

        /** Gets a collection of sub-arguments from a string of one or two arguments */
        std::vector<std::wstring> GetSubArguments(const std::wstring& sub_arg_list);

        /** Add commandline params from a collection of arguments */
        void AddArguments(const std::vector<std::wstring>& arg_list);

        /**
         * Adds parameter name to collection of command line parameters
         *
         * @param param_name - Parameter name to add
         */
        void AddParam(const std::wstring& param_name);

        /** Collections of command line arguments */
        std::map<std::wstring, std::wstring> command_line_args_;
};

CommandLineManager.cpp
C++:
#include <pch.h>
#include "CommandLineManager.h"

namespace
{
    const std::wstring FlagParamValue = L"__FLAG__";
    const std::wstring UnusedParamValue = L"unused";
}

bool CommandLineManager::IsInitialized = false;

CommandLineManager& CommandLineManager::Get()
{
    static CommandLineManager command_line_manager;
    if(!IsInitialized)
    {
        // Support for DLL's
        int arg_count = 0;
        const LPWSTR *arg_list = CommandLineToArgvW(GetCommandLine(), &arg_count);
       
        std::vector<std::wstring> output;
        output.reserve(arg_count);
        for(int i = 0; i < arg_count; i++)
        {
            output.emplace_back(arg_list[i]);
        }
        command_line_manager.Init(output);
    }
    return command_line_manager;
}

void CommandLineManager::Init(const std::vector<std::wstring>& cmd_line_params)
{
    if (!IsInitialized)
    {
        std::vector<std::wstring> args;
        for (std::wstring cmd_line_param : cmd_line_params)
        {
            for (const std::wstring& arg : GetSubArguments(cmd_line_param))
            {
                args.push_back(arg);
            }
        }
       
        AddArguments(args);
        IsInitialized = true;
    }
}

std::vector<std::wstring> CommandLineManager::GetSubArguments(const std::wstring& sub_arg_list)
{
    std::vector<std::wstring> args;
    if (const std::wstring::size_type sub_arg_equals_pos = sub_arg_list.find_first_of(L'='); sub_arg_equals_pos != std::wstring::npos)
    {
        // Add both args
        args.push_back(sub_arg_list.substr(0, sub_arg_equals_pos));
        args.push_back(sub_arg_list.substr(sub_arg_equals_pos + 1, sub_arg_list.length() - 1));
    }
    else
    {
        // Add single arg
        args.push_back(sub_arg_list);
    }
    return args;
}

void CommandLineManager::AddArguments(const std::vector<std::wstring>& arg_list)
{
    if (!arg_list.empty())
    {
        const std::wstring delimiters(L"-,;\\");
        std::wstring param_name;
        bool bPrevWasParamName = false;

        const int num_args = static_cast<int>(arg_list.size());

        for (int i = 0; i < num_args; i++)
        {
            std::wstring command_line_arg = arg_list[i];

            // Do we have a param name
            if (const std::wstring::size_type pos = command_line_arg.find_first_not_of(delimiters); pos > 0 && pos != std::wstring::npos)
            {
                if (bPrevWasParamName)
                {
                    // We have another param name so previous was a flag (no param value)
                    // Add a value to signify we have a flag param
                    AddParam(param_name);
                }

                param_name = command_line_arg;

                // strip out first part so we're left with just the param name
                param_name.erase(0, pos);

                if (i == num_args - 1)
                {
                    // Add final flag param
                    AddParam(param_name);
                }

                bPrevWasParamName = true;
                continue;
            }
           
            bPrevWasParamName = false;

            // Make sure we're not adding a duplicate
            if (auto it = command_line_args_.find({ param_name }); it == command_line_args_.end())
            {
                if (command_line_arg.empty())
                {
                    // Treat empty param value as a flag
                    command_line_args_.insert({ param_name, FlagParamValue });
                }
                else
                {
                    command_line_args_.insert({ param_name, command_line_arg });
                }
            }

            // Clear for next param
            param_name.clear();
        }
    }
}

void CommandLineManager::AddParam(const std::wstring& param_name)
{
    // Make sure we're not adding a duplicate
    if (const auto it = command_line_args_.find({ param_name }); it == command_line_args_.end())
    {
        command_line_args_.insert({ param_name, FlagParamValue });
    }
}

bool CommandLineManager::HasParam(const std::wstring& param)
{
    if (const auto itr = command_line_args_.find({ param }); itr != command_line_args_.end())
    {
        if (itr->second != UnusedParamValue)
        {
            return true;
        }
    }

    return false;
}

std::wstring CommandLineManager::GetParamValue(const std::wstring& param)
{
    if (const auto itr = command_line_args_.find({ param }); itr != command_line_args_.end())
    {
        return itr->second;
    }

    return std::wstring();
}

bool CommandLineManager::HasFlagParam(const std::wstring& param)
{
    if (const auto itr = command_line_args_.find({ param }); itr != command_line_args_.end())
    {
        return itr->second == FlagParamValue;
    }

    return false;
}

Пример использования:
C++:
std::wstring AutoLogin_Login;
std::wstring AutoLogin_Password;
if (CommandLineManager::Get().HasParam(CommandLineConstants::AuthData))
{
     const std::wstring auth_string = CommandLineManager::Get().GetParamValue(CommandLineConstants::AuthData);
     if (std::vector<std::wstring> auth_data = StringUtils::Split(auth_string, ','); auth_data.size() >= 2)
     {
         AutoLogin_Login = auth_data[0];
         AutoLogin_Password = auth_data[1];
     }
}

Могут быть некоторые внешние зависимости, но я думаю вы там поймете что к чему.
 
если окно не в фокусе. после логина что происходит норм?
Я увидел твой пост в друг теме и понял о чем ты, но этот код для интерлюдии и HF подойдет, для выше хроник все можно сделать через интерфейс и UGX и будет работать стабильно.

 
есть ли способ импортировать функцию RequestLogin внутрь интерфейса, чтобы мы могли использовать ее там?
Таким образом, мы можем записывать/считывать файл автологина внутри интерфейса, и мы можем использовать его для нескольких учетных записей, а не только для одной.
 
есть ли способ импортировать функцию RequestLogin внутрь интерфейса, чтобы мы могли использовать ее там?
Таким образом, мы можем записывать/считывать файл автологина внутри интерфейса, и мы можем использовать его для нескольких учетных записей, а не только для одной.
Возможно, в будущем я планирую заниматься этим только под заказ. Или же, если кто-то из ребят захочет помочь, они могут это сделать, но не бесплатно.

Поскольку код уже опубликован, каждый желающий может попробовать самостоятельно разобраться, как это сделать. Я думаю, что в интернете нет более подробной информации по этому вопросу.

Пример для High Five, а также можно и для Interlude : Дизайн окон можно сделать любой!

 
Я немного поработал над интерфейсом, и вот что у меня получилось!
 
Вот код автологина для interlude, который требует доработки, но уже работает, особенно благодаря Charmant

Логин и пароль берется из файла AutoLogin.ini который должен лежать рядом с dll в вашей папке system игры.

AutoLogin.ini с таким содержимым:
Код:
[AutoLogin]
Login=admin
Password=admin
Код на с++ Visual Studio 2022
C++:
#include "pch.h"
#include <windows.h>
#include <string>

extern "C" void __declspec(dllexport) __stdcall function1()
{
    //Заглушка для экспорта L2.exe (От крита клиента!)
}

namespace {
    enum L2ConsoleState {
        Loading = 0,
        Unknown = 1,
        Login = 2,
        CharCreate = 3,
        CharSelect = 4,
        InGame = 5
    };

    class UL2ConsoleWnd {};
    UL2ConsoleWnd* UL2ConsoleWndPtr = nullptr;
    uintptr_t consoleOffset = 0x3663bc; // для IL клиента
}

// Определение класса UNetworkHandler
class UNetworkHandler {};

// Тип функции RequestAuthLogin
typedef int(__fastcall* RequestAuthLoginFn)(UNetworkHandler*, int, const wchar_t*, const wchar_t*, int);

// Смещение для UNetworkHandler в engine.dll
const uintptr_t unetworkOffset = 0x81F538;

// Глобальные переменные для хранения указателей
UNetworkHandler** unetwork = nullptr;
RequestAuthLoginFn requestAuthLoginFn = nullptr;

// Функция для авторизации
static void RequestLogin(const std::wstring& login, const std::wstring& password) {
    // Проверка инициализации указателей
    if (!unetwork || !requestAuthLoginFn) {
        return;
    }
    // Вызов функции авторизации из игры
    requestAuthLoginFn(*unetwork, 0, login.c_str(), password.c_str(), 0);
}

// Функция для чтения строки из INI-файла
static void ReadIniString() {
    std::wstring login;
    std::wstring password;
    wchar_t buffer[256] = { 0 };
    // Чтение логина и пароля из ini-файла
    GetPrivateProfileStringW(L"AutoLogin", L"Login", L"", buffer, _countof(buffer), L".\\AutoLogin.ini");
    login = buffer;
    // Чтение логина и пароля из ini-файла
    GetPrivateProfileStringW(L"AutoLogin", L"Login", L"", buffer, _countof(buffer), L".\\AutoLogin.ini");
    password = buffer;

    // Вызов функции авторизации
    RequestLogin(login, password);
}

static void L2StatusLoad() {

    HMODULE hNwindowModule = nullptr;
    while (hNwindowModule == nullptr)
    {
        hNwindowModule = GetModuleHandleW(L"nwindow.dll");
        Sleep(1000);
    }

    // получение валидного указателя на UL2ConsoleWnd
    uintptr_t pUL2ConsoleWnd = (reinterpret_cast<uintptr_t>(hNwindowModule)) + consoleOffset;

    while (UL2ConsoleWndPtr == nullptr)
    {
        UL2ConsoleWndPtr = *reinterpret_cast<UL2ConsoleWnd**>(pUL2ConsoleWnd);
        Sleep(300);
    }

    // получение адреса по которому записывается текущее состояние
    L2ConsoleState* statePtr = reinterpret_cast<L2ConsoleState*>(UL2ConsoleWndPtr + 0x38);

    while (true)
    {
        L2ConsoleState currentState = *statePtr;
        switch (currentState)
        {
        case L2ConsoleState::Loading:
            //    MessageBoxW(NULL, L"загрузка", L"L2ConsoleState", MB_OK);
            ReadIniString();
            exit;
            break;
        case L2ConsoleState::Login:
            //MessageBoxW(NULL, L"лобби", L"L2ConsoleState", MB_OK);
            break;
        case L2ConsoleState::CharCreate:
            //MessageBoxW(NULL, L"cоздание чара", L"L2ConsoleState", MB_OK);
            break;
        case L2ConsoleState::CharSelect:
            //MessageBoxW(NULL, L"выбор чара", L"L2ConsoleState", MB_OK);
            break;
        case L2ConsoleState::InGame:
            //    MessageBoxW(NULL, L"в игре", L"L2ConsoleState", MB_OK);
            break;
        }
        Sleep(5000);
    }
}

// Поток для авторизации
static DWORD WINAPI TestThread(LPVOID lpParameter) {
    L2StatusLoad();
    return 0;
}


// Точка входа DLL
extern "C" __declspec(dllexport)
 BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        // Отключение отслеживания вызовов функций библиотеки
        DisableThreadLibraryCalls(hModule);

        // Получение модуля engine.dll
        HMODULE engineModule = GetModuleHandleW(L"engine.dll");
        if (engineModule) {
            // Получение адреса UNetworkHandler
            unetwork = reinterpret_cast<UNetworkHandler**>(reinterpret_cast<uintptr_t>(engineModule) + unetworkOffset);

            // Получение адреса функции RequestAuthLogin
            requestAuthLoginFn = (RequestAuthLoginFn)GetProcAddress(engineModule, "?RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z");
        }

        // Создание потока для авторизации
        CreateThread(nullptr, 0, TestThread, nullptr, 0, nullptr);
    }
    return TRUE;
}

И вот готовые файлы для тех, кто хочет настроить автологин (*Только вход в окно логина*): просто распакуйте архив в системную папку игры interlude и не забудьте изменить логин и пароль в файле AutoLogin.ini.
решил попробовать - но не работает, вроде как бы и пишет что пароль не подходит, но акк и пароль я точно вписал верно))
мб длинна пароля 4 нуля ему не подходит?
1731023247649.png
 
решил попробовать - но не работает, вроде как бы и пишет что пароль не подходит, но акк и пароль я точно вписал верно))
мб длинна пароля 4 нуля ему не подходит?
Я проверил: ввёл логин из четырёх нулей и пароль — и успешно вошёл в систему.
 

В файле AutoLogin.ini должно быть указано следующее: если ваш логин и пароль — 0000, то введите их именно так, а если нет, то укажите свои данные.
Код:
[AutoLogin]
Login=0000
Password=0000
 
В файле AutoLogin.ini должно быть указано следующее: если ваш логин и пароль — 0000, то введите их именно так, а если нет, то укажите свои данные.
Код:
[AutoLogin]
Login=0000
Password=0000
 
ага, значит когда я его отредачил он загнулся

вот без редактирования
1731056378045.png
 
В файле AutoLogin.ini должно быть указано следующее: если ваш логин и пароль — 0000, то введите их именно так, а если нет, то укажите свои данные.
Код:
[AutoLogin]
Login=0000
Password=0000
незнаю почему но при любом редактировании хоть нотпадом хоть чем - ломается он, какая там кодировка символов?
 
незнаю почему но при любом редактировании хоть нотпадом хоть чем - ломается он, какая там кодировка символов?
ставлю вот так
Код:
[AutoLogin]

Login=admin

Password=0000

и всё-поломка)
 
Последнее редактирование:
ну ладно, чёто не хотит

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


я вот делал батник
Код:
l2 -login:<admin> -password:<0000>
но не работает в таком виде, мб есть вариант впихнуть сюда что то другое что бы акк и пароль уже были заполнены но не нажата кнопка логин
 
Назад
Сверху Снизу