PDA

Просмотр полной версии : Перехват engine


MickeyBlueEyes
03.11.2013, 21:42
Всем хай) Тема уже эта заеженая, но уже 2 дня втыкаю и немогу втыкнуть)
Перехватываю "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z"
сплайсингом, перехват удаёттся, а дальше либо крит при логине, либо ошибка в игре с первого же раза.
Пишу орыгинальные 5 байт в структуру и следом за этими 5 байтами jmp near на орыгинальную функцию + 6, jmp nearы вроде как вычеслены правильно, я хз уже волосы рву, может ктото со светлой головой подскажет, собсно код вот:

#include <windows.h>
BYTE old[5];

DWORD dwProtect;

BYTE * fptr;

size_t _CalculateDispacement(void* lpFirst, void* lpSecond)
{
return reinterpret_cast<char*>(lpSecond) - (reinterpret_cast<char*>(lpFirst) + 5);
}

#pragma pack(push, 1)
struct jmp_near
{
BYTE opcode;
BYTE * addr;
};
#pragma pack(pop)

#pragma pack(push, 1)
struct jmp_org
{
BYTE old[5];
struct jmp_near jmp;
}org;
#pragma pack(pop)



void splice()
{
//MessageBox(0, "Hello from splice", "OK", MB_OK);
BYTE * addr = (BYTE*)&org;
__asm
{
jmp addr
}
}

void Intercept(void)
{
struct jmp_near jmp;

MessageBox(0, "Ready!?", "OK", MB_OK);

fptr = (BYTE *)GetProcAddress(GetModuleHandle(TEXT("engine.dll")), "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z");

jmp.opcode = 0xE9;
jmp.addr = (BYTE*)_CalculateDispacement(fptr, splice);

VirtualProtect(fptr, 5, PAGE_EXECUTE_READWRITE, &dwProtect);
ReadProcessMemory(GetCurrentProcess(), (void*)fptr, (void*)&old[0], 5, 0);
WriteProcessMemory(GetCurrentProcess(), (void*)fptr, (void*)&jmp, 5, 0);

memcpy(org.old, old, 5);
org.jmp.opcode = 0xE9;
org.jmp.addr = (BYTE*)_CalculateDispacement(&org.jmp, (fptr + 6));

MessageBox(0, "The end", "OK", MB_OK);
}



BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{


switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Intercept, NULL, NULL, NULL);
}
break;

case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break;
}

return TRUE;
}


Добавлено через 23 часа 18 минут
Всё вышло.

SeregaZ
04.11.2013, 02:21
а значение параметров функции можно получить подобным образом?

MickeyBlueEyes
04.11.2013, 11:31
Ну я предполагал что можно, выталкиванием из стека. Написал нормальные прототипы и меняю 5 байт назад потом выполняю ф-цию, и ошибка была в +6, нужно было +5.