Привет, ребята! Я пытаюсь разобраться, как работает исследование, и как я могу использовать функции из DLL в своей собственной DLL. В качестве примера я взял функцию RequestAutoShot.
Я начал с исследования функции RequestAutoSoulShot, И я нашел эти адреса в памяти:
С этим я думаю, что мне понадобится смещение uNetwork: 0x81F538 (я не уверен в этом утверждении).
Я нашел эту функцию, которая принимает networkHandler и l2ParamStack, и в итоге вызывает функцию FUN_10406880. Вот содержимое функции: FUN_10406880:
Мне показалось интересным, что он использует этот адрес: LAB_10880ab0.
но я ничего не нашел об этой функции, а потом пришел к выводу, что мне нужно смещение UNetworkHandler, и я не знаю, как я буду собирать L2ParamStack, я написал этот код на c++
Я не знаю, на правильном ли я пути, но мне кажется, что мне нужно понять, как я буду передавать идентификатор shoulshot в этот L2ParamStack, я до сих пор даже не знаю, какие методы и как Я использую его в своем коде, может ли кто-нибудь мне помочь?
Я начал с исследования функции RequestAutoSoulShot, И я нашел эти адреса в памяти:
С этим я думаю, что мне понадобится смещение uNetwork: 0x81F538 (я не уверен в этом утверждении).
Я нашел эту функцию, которая принимает networkHandler и l2ParamStack, и в итоге вызывает функцию FUN_10406880. Вот содержимое функции: FUN_10406880:
Мне показалось интересным, что он использует этот адрес: LAB_10880ab0.
но я ничего не нашел об этой функции, а потом пришел к выводу, что мне нужно смещение UNetworkHandler, и я не знаю, как я буду собирать L2ParamStack, я написал этот код на c++
Я не знаю, на правильном ли я пути, но мне кажется, что мне нужно понять, как я буду передавать идентификатор shoulshot в этот L2ParamStack, я до сих пор даже не знаю, какие методы и как Я использую его в своем коде, может ли кто-нибудь мне помочь?
C++:
#include "pch.h"
#include <windows.h>
#include <string>
extern "C" void __declspec(dllexport) __stdcall function1()
{
}
namespace {
enum L2ConsoleState {
Loading = 0,
Unknown = 1,
Login = 2,
CharCreate = 3,
CharSelect = 4,
InGame = 5
};
class UL2ConsoleWnd {};
UL2ConsoleWnd* UL2ConsoleWndPtr = nullptr;
uintptr_t consoleOffset = 0x3663bc;
}
class UNetworkHandler {};
typedef void(__fastcall* RequestAutoSoulShotFn)(UNetworkHandler*, L2ParamStack*);
const uintptr_t unetworkOffset = 0x81F538;
UNetworkHandler** unetwork = nullptr;
RequestAutoSoulShotFn requestAutoSoulShotFn = nullptr;
static void RequestAutoSoulShot(int soulShotId) {
if (!unetwork || !requestAutoSoulShotFn) {
MessageBoxW(NULL, L"Erro: UNetworkHandler not initialized!", L"Debug", MB_OK);
return;
}
// Instância de L2ParamStack
// Chamar a função RequestAutoSoulShotFn com os parâmetros apropriados
requestAutoSoulShotFn(*unetwork, ¶mStack);
MessageBoxW(NULL, L"RequestAutoSoulShot success!", L"Debug", MB_OK);
}
static void L2StatusLoad() {
HMODULE hNwindowModule = nullptr;
while (hNwindowModule == nullptr)
{
hNwindowModule = GetModuleHandleW(L"nwindow.dll");
Sleep(1000);
}
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::InGame:
MessageBoxW(NULL, L"InGame", L"L2ConsoleState", MB_OK);
RequestAutoSoulShot(3952);
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) {
MessageBoxW(NULL, L"DLL Loading", L"L2ConsoleState", MB_OK);
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
DisableThreadLibraryCalls(hModule);
MessageBoxW(NULL, L"DLL Loaded", L"L2ConsoleState", MB_OK);
HMODULE engineModule = GetModuleHandleW(L"engine.dll");
if (engineModule) {
unetwork = reinterpret_cast<UNetworkHandler**>(reinterpret_cast<uintptr_t>(engineModule) + unetworkOffset);
requestAutoSoulShotFn = (RequestAutoSoulShotFn)GetProcAddress(engineModule,"?RequestAutoSoulShot@UNetworkHandler@@UAEXAAVL2ParamStack@@@Z");
}
CreateThread(nullptr, 0, TestThread, nullptr, 0, nullptr);
}
return TRUE;
}