PDA

Просмотр полной версии : [C++] перехват AddNetworkQueue


GoldFinch
12.04.2010, 21:39
Перехват UNetworkHandler::AddNetworkQueue, для фришек
#include <Windows.h>

class UNetworkHandler {};

#pragma pack(push, 1)
struct NetworkPacket
{
unsigned char id, _padding1, exid, _padding2;
unsigned short size, _padding3;
unsigned char* data;
};
#pragma pack(pop)

int (__fastcall *UNetworkHandler_AddNetworkQueue)(UNetworkHandler* , int, NetworkPacket*);

int __fastcall UNetworkHandler_AddNetworkQueue_hook(UNetworkHandl er* This, int /*edx*/, NetworkPacket* packet)
{
// Полезная нагрузка перехвата
char buf[1024];
wsprintfA(buf, "Packet id=0x%x, size=0x%x", packet->id, packet->size);
OutputDebugStringA(buf);
//-----------------------------------------
return (*UNetworkHandler_AddNetworkQueue)(This, 0/*чтоугодно*/, packet);
}

DWORD WINAPI InitThread(LPVOID)
{
HMODULE hEngine = LoadLibraryA("Engine.dll");
(FARPROC&) UNetworkHandler_AddNetworkQueue = GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z");
void** UNetworkHandler_vftable = (void**)GetProcAddress(hEngine, "??_7UNetworkHandler@@6BUObject@@@");
while(*UNetworkHandler_vftable != (void*)UNetworkHandler_AddNetworkQueue)
++UNetworkHandler_vftable;
*UNetworkHandler_vftable = (void*)UNetworkHandler_AddNetworkQueue_hook;
return 0;
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
if (DLL_PROCESS_ATTACH != ul_reason_for_call)
return 1;
DisableThreadLibraryCalls(hModule);

CreateThread(0, 0, &InitThread, 0, 0, 0);
return 1;
}


Спасибо Demion за идею использовать __fastcall вместо __thiscall.

xkor
13.04.2010, 01:18
Спасибо Demion за идею использовать __fastcall вместо __thiscallда, идея отличная, избавляет от враперов)
ток думаю надо следить чтоб edx в функции не испортился а то он в вызывающей может использоваться потом...

GoldFinch
13.04.2010, 19:20
xkor, функции с соглашением __thiscall (а также stdcall и cdecl) могут портить edx (а также eax и ecx)

xkor
13.04.2010, 23:29
GoldFinch, во заразы...)

tgl
14.04.2010, 11:24
а откуда инфа про формат struct NetworkPacket ?

xkor
14.04.2010, 15:25
tgl, в функции вызывающей AddNetworkQueue хорошо видно что туда посылается)

GoldFinch
14.04.2010, 18:23
tgl, если в отладчике поставить клиент на паузу и немного подождать, то в очереди пакетов скопится сразу несколько, и так как они хранятся в массиве, то в дампе очереди пакетов будет хорошо видно их структуру.

tgl
14.04.2010, 18:58
понятно, значит-с мне надо еще покурить дебагер )