Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 29.09.2013, 03:34   #1
Местный
 
Аватар для goodvin1709
 
Регистрация: 13.02.2011
Сообщений: 506
Сказал Спасибо: 121
Имеет 100 спасибок в 83 сообщенях
goodvin1709 пока неопределено
По умолчанию

В каком это смысле?В параметре приходит L2ParamStack
Я от туда извлекаю то что мне нужно т.е данные.
потом создаю чистый L2ParamStack
Засовываю туда данные,и отправляю на сервер вызовом оригинальной функции.
Вот только данные вставить нормально не могу(
1.Создаю
Delphi Код:
procedure l2stackCreate(l2p: PL2ParamStack);  stdcall;  asm   mov   ecx,l2p;   push  ecx;   push  0Ah;   call [L2ParamStackCreate_Original];  end;
Вот тут создали стек.Все работает хорошо.
Потом очищаю стек.
Delphi Код:
procedure  L2StackClear(l2p: PL2ParamStack); stdcall;  asm   mov   ecx,l2p;   call  [L2ParamStackClear_Original];  end;
Тут все хорошо работает,вроде очистили.
Потом я в него вставляю что мне нужно:
Delphi Код:
procedure  L2StackPushBackInt(l2p: PL2ParamStack; cmd: Integer); stdcall;  asm   mov   ecx,cmd;   push  ecx;   mov   ecx,l2p;   call  [L2ParamStackPushBack_Original];  end;
Правда тут почему то ошибка,но по плану следующий шаг отправка.
Delphi Код:
procedure UseItem_Call(l2p: PL2ParamStack); stdcall; begin  asm   push l2p;   mov ecx, UNetworkHundler;   call [UseItem_Original];  end;
Но блин откуда взять
1.UnetworkHandler,нужен он вобще или нет?
2.Как правильно запихнуть данные и отправить?
__________________
---------------------------__--------__-----
---____- ___--____--- ___/'- /__ ___-(__)-____
--/-___-/-__-\/-__--\ /-__--'/--|-/--//---//--__--\
-/-/_/ -/-/_/--/-/_/--/-/_/--/|--|/--'//---//--/-/--/
-\___-/\____/\____/\____/-|____//__'//_'/-/__/
/_-__/
goodvin1709 вне форума   Ответить с цитированием
Старый 03.10.2013, 16:06   #2
Местный
 
Аватар для 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 вне форума   Ответить с цитированием
Старый 27.03.2015, 13:46   #3
Пользователь
 
Регистрация: 19.08.2014
Сообщений: 58
Сказал Спасибо: 12
Имеет 0 спасибок в 0 сообщенях
cvillian пока неопределено
По умолчанию

Цитата:
Сообщение от Elecktron Посмотреть сообщение
зачем пользоваться глючным стеком? оО
можно проще. например(с++):

перехват инита, для получения NetworkHandler - чистая магия, местами подогнанная по месту, так что приведена исключительно для осознания что и куда.

p.s.как-то пробовал сделать на делфи - могу поискать исходники, но они "портированы" с с++, так что по сути тоже самое
p.p.s. есть еще способ (если защита смотрит откуда сенд вызван)
Тема наверное уже мертва но всё равно попробую
Может кто-то напишет пример как на дельфях получить этот долбаный NetworkHandler
cvillian вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 19:54.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!