public: virtual int __thiscall UNetworkHandler::RequestAuthLogin(unsigned short *,unsigned short *,int);
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 например или рядом раскрывающийся список с кнопкой. ?
MessageBox(NULL, L"Попытка входа в игру!", L"", MB_OK);
RequestAuthLogin(Login, Password, authType);
Может authtype нужен другой? По идее клиент бы написал сообщение, пароль не правильный как минимум или зашел на сервер. ?Забыл написать в шапке темы - При инжекте выводится сообщениеЭто значит что dll нашлась и функция тожеC++:MessageBox(NULL, L"Попытка входа в игру!", L"", MB_OK);
Но при выполнение ее ничего не происходитC++:RequestAuthLogin(Login, Password, authType);
Проверял вообще тишина никакой реакции(Может authtype нужен другой? По идее он бы написал сообщение, пароль не правильный как минимум или зашел на сервер. ?
Хорошо бы в ida посмотреть, что это и какие данные нужны. Может нативная форма подставляет данные с чем то еще, не просто текст.Проверял вообще тишина никакой реакции(
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);
}
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);
?InternalConstructor@UNetworkHandler@@SAXPAX@Z
Эти обрывки кода не помогут(Вот еще дополню для it:
Потому что указатель на UNetworkHandler не передается. Я начинал делать свою реализацию автологина на эпилоге, но пока забросил т.к. лень редактировать интерфейс и окна. Вот простенький пример как можно инициализировать и вызвать RequestAuthLogin:Но при выполнение ее ничего не происходит
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);
}
}
Спасибо но откуда взять?Потому что указатель на UNetworkHandler не передается. Я начинал делать свою реализацию автологина на эпилоге, но пока забросил т.к. лень редактировать интерфейс и окна. Вот простенький пример как можно инициализировать и вызвать RequestAuthLogin:
Найти ссылку в функциях-членах класса. Например:
// 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;
}
Оффсет можно и не искать вовсе, достаточно найти в экспортах того же engine global структуру которая светит в экспорт и где есть ссылка на UNetworkHandler. Сходу не скажу где, но знаю что точно есть такие.Надо будет auto dumper сделать по маске для получения оффсета от c1 до hf ?
Есть вроде такое:Оффсет можно и не искать вовсе, достаточно найти в экспортах того же engine global структуру которая светит в экспорт и где есть ссылка на UNetworkHandler. Сходу не скажу где, но знаю что точно есть такие.
?InternalConstructor@UNetworkHandler
0x3d5ac0 как смещение UNH выглядит сомнительным. В клиенте ил 746, который скачан у меня, смещение = 0x81F538.Попробовал на 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; }
#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;
}
Тоже верно. На самом деле есть несколько способов получить указатель. В моем случае мне было удобнее получать по конкретному смещениюОффсет можно и не искать вовсе, достаточно найти в экспортах того же engine global структуру которая светит в экспорт и где есть ссылка на UNetworkHandler. Сходу не скажу где, но знаю что точно есть такие.
В первом случае как вы написали ничего не происходит во втором игра начинает тормозить.0x3d5ac0 как смещение UNH выглядит сомнительным. В клиенте ил 746, который скачан у меня, смещение = 0x81F538.
И в DllMain я бы не стал сразу вызывать логин, половина клиента еще не загружена.
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?