#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;
}