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

  • Автор темы Автор темы BIT_hack
  • Дата начала Дата начала

BIT_hack

Знающий
Участник
Сообщения
273
Розыгрыши
0
Решения
5
Репутация
82
Реакции
177
Баллы
485
  1. В интернете я нашёл информацию о том, что нужно использовать функцию для автологина из Engine.dll. Вот как она выглядит в интерлюдии.
    C++:
    public: virtual int __thiscall UNetworkHandler::RequestAuthLogin(unsigned short *,unsigned short *,int);

  2. Этот код на c++я инжектю в игру
    C++:
    void Start() {
        HMODULE hModule = GetModuleHandleA("engine.dll"); // Получаем дескриптор загруженной DLL
    
        if (hModule != NULL) {
            FARPROC requestAuthLoginAddr = GetProcAddress(hModule, "?RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z");
    
            if (requestAuthLoginAddr != NULL) {
                MessageBox(NULL, L"Попытка входа в игру!", L"", MB_OK);  
                typedef int(__thiscall* RequestAuthLoginFunc)(unsigned short*, unsigned short*, int);
                RequestAuthLoginFunc RequestAuthLogin = (RequestAuthLoginFunc)requestAuthLoginAddr;
                unsigned short Login[] = { 'a', 'd', 'm', 'i', 'n', 0 };
                unsigned short Password[] = { 'a', 'd', 'm', 'i', 'n', 0 };
                int authType = 7;
    
                RequestAuthLogin(Login, Password, authType);
            }
    
        }
    }
    
    BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved){
        switch (ul_reason_for_call)
        {
    
        case DLL_PROCESS_ATTACH:
            Start();
            break;
        }
        return TRUE;
    }
Возможно, я не совсем верно подхожу к реализации этой идеи?
 
По идее все правильно, можно еще с тех полей сохранить данные и потом в списке выбирать на какой аккаунт заходить в окошке html например или рядом раскрывающийся список с кнопкой. ?
 
Забыл написать в шапке темы - При инжекте выводится сообщение
C++:
MessageBox(NULL, L"Попытка входа в игру!", L"", MB_OK);
Это значит что dll нашлась и функция тоже
C++:
RequestAuthLogin(Login, Password, authType);
Но при выполнение ее ничего не происходит
 
Может authtype нужен другой? По идее клиент бы написал сообщение, пароль не правильный как минимум или зашел на сервер. ?
 
Проверял вообще тишина никакой реакции(
Хорошо бы в ida посмотреть, что это и какие данные нужны. Может нативная форма подставляет данные с чем то еще, не просто текст.

Вот например с одного форума, может как подсказка из fasm:
Код:
proc RequestAuthLogin uses esi, pLogin:DWORD,pPassword:DWORD,Param:DWORD
 
Наверное так может:
Код:
wchar_t Login[] = L"admin"; // Логин в формате UTF-16
wchar_t Password[] = L"admin"; // Пароль в формате UTF-16
int authType = 7;

int result = RequestAuthLogin((unsigned short*)Login, (unsigned short*)Password, authType);
if (result != 0) {
   MessageBoxA(NULL, L"Ошибка входа!", L"", MB_OK);
}
 
Вот еще дополню для it:
Вызываем api функцию клиента.
Код:
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 и вызывает на старте клиента.

Код:
?InternalConstructor@UNetworkHandler@@SAXPAX@Z
 
Реакции: Luan
Но при выполнение ее ничего не происходит
Потому что указатель на UNetworkHandler не передается. Я начинал делать свою реализацию автологина на эпилоге, но пока забросил т.к. лень редактировать интерфейс и окна. Вот простенький пример как можно инициализировать и вызвать RequestAuthLogin:
C++:
class UNetworkHandler {};
typedef int(__fastcall* RequestAuthLogin_fn)(UNetworkHandler*, int, const wchar_t*, const wchar_t*, int);

namespace {
    uintptr_t UNetworkOffset = 0x71d274; // для ИЛ клиента смещение будет другим
    UNetworkHandler* UNetwork = nullptr;
    RequestAuthLogin_fn fRequestAuthLogin = nullptr;
}

void Init()
{
    HMODULE hEngineModule = GetModuleHandleW(L"engine.dll");
    if (hEngineModule != nullptr)
    {
        uintptr_t UNetworkAddress = (reinterpret_cast<uintptr_t>(hEngineModule)) + UNetworkOffset;
        UNetwork = *reinterpret_cast<UNetworkHandler**>(UNetworkAddress);
        
        fRequestAuthLogin = (RequestAuthLogin_fn)GetProcAddress(hEngineModule, "?RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z");
    }
}

void RequestLogin(const wchar_t* login, const wchar_t* password)
{
    if (UNetwork != nullptr && fRequestAuthLogin != nullptr)
    {
        fRequestAuthLogin(UNetwork, 0, login, password, 0);
    }
}
 
Спасибо но откуда вытащить
Спасибо но откуда взять?
uintptr_t UNetworkOffset = 0x71d274; // для ИЛ клиента смещение будет другим
 
Надо будет auto dumper сделать по маске для получения оффсета от c1 до hf ?
 
Последнее редактирование:
Учтите что UNetworkHandler при аттаче библиотеки может не существовать вовсе. Запрашивать RequestAuthLogin нужно после того как клиент загрузился (окно логин-пароль): проще всего перехватывать первый вызов UNetworkHandler::Tick() (?Tick@UNetworkHandler@@UAEXM@Z)
 
Найти ссылку в функциях-членах класса. Например:

Попробовал на IT и HF не сработало хотя все функции отработали. UNetworkOffset = менял под каждый клиент
C++:
// dllmain.cpp : Определяет точку входа для приложения DLL.
#include "pch.h"
#include "string"

class UNetworkHandler {};
typedef int(__fastcall* RequestAuthLogin_fn)(UNetworkHandler*, int, const wchar_t*, const wchar_t*, int);
// Объявление функции RequestLogin
void RequestLogin(const wchar_t* login, const wchar_t* password);

namespace {
    uintptr_t UNetworkOffset = 0x3d5ac0; // для ИЛ клиента смещение будет другим
    UNetworkHandler* UNetwork = nullptr;
    RequestAuthLogin_fn fRequestAuthLogin = nullptr;
}


void Init()
{
    HMODULE hEngineModule = GetModuleHandleW(L"engine.dll");
    if (hEngineModule != nullptr)
    {
        uintptr_t UNetworkAddress = (reinterpret_cast<uintptr_t>(hEngineModule)) + UNetworkOffset;
        UNetwork = *reinterpret_cast<UNetworkHandler**>(UNetworkAddress);

        MessageBox(NULL, L"Все данные собраны вход!!!!!", L"", MB_OK);

        fRequestAuthLogin = (RequestAuthLogin_fn)GetProcAddress(hEngineModule, "?RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z");

        RequestLogin(L"admin", L"admin");
    }

}

void RequestLogin(const wchar_t* login, const wchar_t* password)
{

    MessageBox(NULL, L"Попытка входа в игру!", L"", MB_OK);

    if (UNetwork != nullptr && fRequestAuthLogin != nullptr)
    {
        fRequestAuthLogin(UNetwork, 0, login, password, 0);
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call)
    {

    case DLL_PROCESS_ATTACH:
        Init();
        break;
    }
    return TRUE;
}
 
Надо будет auto dumper сделать по маске для получения оффсета от c1 до hf ?
Оффсет можно и не искать вовсе, достаточно найти в экспортах того же engine global структуру которая светит в экспорт и где есть ссылка на UNetworkHandler. Сходу не скажу где, но знаю что точно есть такие.
 
Есть вроде такое:
Код:
?InternalConstructor@UNetworkHandler
Через это наверное можно сделать. ?
 
0x3d5ac0 как смещение UNH выглядит сомнительным. В клиенте ил 746, который скачан у меня, смещение = 0x81F538.
И в DllMain я бы не стал сразу вызывать логин, половина клиента еще не загружена.

C++:
#include "pch.h"
#include "string"

class UNetworkHandler {};
typedef int(__fastcall* RequestAuthLogin_fn)(UNetworkHandler*, int, const wchar_t*, const wchar_t*, int);
// Объявление функции RequestLogin
void RequestLogin(const wchar_t* login, const wchar_t* password);

namespace {
    uintptr_t UNetworkOffset = 0x81F538; // для ИЛ клиента смещение будет другим
    UNetworkHandler* UNetwork = nullptr;
    RequestAuthLogin_fn fRequestAuthLogin = nullptr;
}


void Init()
{
    HMODULE hEngineModule = GetModuleHandleW(L"engine.dll");
    if (hEngineModule != nullptr)
    {
        uintptr_t UNetworkAddress = (reinterpret_cast<uintptr_t>(hEngineModule)) + UNetworkOffset;
        UNetwork = *reinterpret_cast<UNetworkHandler**>(UNetworkAddress);

        MessageBox(NULL, L"Все данные собраны вход!!!!!", L"", MB_OK);

        fRequestAuthLogin = (RequestAuthLogin_fn)GetProcAddress(hEngineModule, "?RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z");

        RequestLogin(L"admin", L"admin");
    }

}

void RequestLogin(const wchar_t* login, const wchar_t* password)
{
    if (UNetwork != nullptr && fRequestAuthLogin != nullptr)
    {
        MessageBox(NULL, L"Попытка входа в игру!", L"", MB_OK);
        fRequestAuthLogin(UNetwork, 0, login, password, 0);
    }
}

DWORD WINAPI test(LPVOID lpParameter)
{
    Sleep(7000);
    Init();
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call)
    {

    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        {
            HANDLE hThread = CreateThread(NULL, 0, test, NULL, 0, NULL);
            if (hThread != NULL)
            {
                CloseHandle(hThread);
            }
        }
        break;
    }
    return TRUE;
}

Тоже верно. На самом деле есть несколько способов получить указатель. В моем случае мне было удобнее получать по конкретному смещению
 
В первом случае как вы написали ничего не происходит во втором игра начинает тормозить.
Насчет dll я ее инжектю когда игра уже запущена.
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…