-
Автор темы
- #1
В общем я хочу перехватить аргументы функции SendMessage() из ISteamGameCoordinator, но не получается поставить хук
вот код:
подозреваю что я как то не так получаю адрес функции
вот код:
C++:
DWORD GetModuleBaseAddr(DWORD PID, const TCHAR* szModuleName) {
DWORD dwModuleBaseAddr = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, PID);
if (hSnapshot != INVALID_HANDLE_VALUE) {
MODULEENTRY32 ModuleEntry32;
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32)) {
do {
if (strcmp(ModuleEntry32.szModule, szModuleName) == 0) {
dwModuleBaseAddr = (DWORD_PTR)ModuleEntry32.modBaseAddr;
break;
}
} while(Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddr;
}
inline void HookFunc(void* func, void* detour, void* original) {
MH_STATUS HookCreateStatus = MH_CreateHook(func, detour, (LPVOID*)original);
MH_STATUS HookEnableStatus = MH_EnableHook(func);
if (HookCreateStatus != MH_OK | HookEnableStatus != MH_OK) {
printf("hook error\n");
}
};
inline void __fastcall HKSendMessage(void* _this, uint32_t unMsgType, const void* pubData, uint32_t cubData) {
printf("called SendMessage\n");
printf("unMsgType: %d\n", unMsgType);
}
DWORD WINAPI runBot(LPVOID lpParam) {
if (AllocConsole())
{
FILE* file{};
freopen_s(&file, "CONOUT$", "w+", stdout);
}
DWORD PID = GetCurrentProcessId();
DWORD ClientBaseAddr = GetModuleBaseAddr(PID, "client.dll");
uintptr_t** vtable = (uintptr_t**)((DWORD)ClientBaseAddr + 0x18);
uintptr_t* pSendMessage = vtable[0];
printf("PID:\t\t%d\n", PID);
printf("ClientBaseAddr:\t%X\n", ClientBaseAddr);
MH_STATUS HookInitializeStatus = MH_Initialize();
if (HookInitializeStatus == MH_OK) {
HookFunc(&HKSendMessage, pSendMessage, NULL);
}
return 1;
}