Показать сообщение отдельно
Старый 03.10.2013, 16:06   #23
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

Цитата:
Сообщение от 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. есть еще способ (если защита смотрит откуда сенд вызван)
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...

Последний раз редактировалось Elecktron, 03.10.2013 в 16:09.
Elecktron вне форума   Ответить с цитированием