Цитата:
Сообщение от goodvin1709
В каком это смысле?В параметре приходит L2ParamStack
Я от туда извлекаю то что мне нужно т.е данные.
потом создаю чистый L2ParamStack
Засовываю туда данные,и отправляю на сервер вызовом оригинальной функции.
Вот только данные вставить нормально не могу(
...
Но блин откуда взять
1.UnetworkHandler,нужен он вобще или нет?
2.Как правильно запихнуть данные и отправить?
|
зачем пользоваться глючным стеком? оО
можно проще. например(с++):
Код:
void __cdecl ReqvMagicSkillUse(int Skill,int Ctrl,int Shift)
{
char *mask = "cddc";
asm
{
mov ECX,[UNetHandler] //UnetworkHandler
mov EDI,ECX
mov ECX,DWORD PTR DS:[EDI+0x48]
mov EDX,DWORD PTR DS:[ECX]
push Shift
push Ctrl
push Skill
push 0x39
push mask
push ECX
CALL [EDX+0x6c]
add esp,0x18
}
}
CALL [EDX+0x6c] - по сути вызов сенда в engine.dll - и его можно заменить на хардкод.
UnetworkHandler - нужен!
получить его несложно.
Код:
void __cdecl UNetworkHandlerInit_hook()
{
asm
{
mov dword [UNetHandler],ecx //он лежит в ecx, копируем
MOV EAX,DWORD PTR FS:[0] //
jmp DWORD PTR initUH_orig
}
}
Код:
HMODULE hEngine = LoadLibraryA("Engine.dll");
(FARPROC&) initUH_addr = GetProcAddress(hEngine, "?Init@UNetworkHandler@@UAEXHPAVUGameEngine@@@Z");
initUH_orig = initUH_addr + 6;
DWORD buf = (DWORD)&UNetworkHandlerInit_hook + 3;
DWORD op;
short comm =0xe9;
VirtualProtect((void*)(initUH_addr),5,PAGE_READWRITE, &op);
DWORD offset = (DWORD) buf - (DWORD) initUH_addr - 5;
WriteProcessMemory(GetCurrentProcess(), (void*)(initUH_addr),(void*)&comm,1,NULL);
WriteProcessMemory(GetCurrentProcess(), (void*)(initUH_addr+0x01),(void*)&offset,4,NULL);
VirtualProtect((void*)(initUH_addr),5,op, &op);
перехват инита, для получения NetworkHandler - чистая магия, местами подогнанная по месту, так что приведена исключительно для осознания что и куда.
p.s.как-то пробовал сделать на делфи - могу поискать исходники, но они "портированы" с с++, так что по сути тоже самое
p.p.s. есть еще способ (если защита смотрит откуда сенд вызван)