И так всем привет!
Столкнулся с проблемой...
Если с сервер приходит пакет (например если на сервере сделать новый пакет, которого нету в клиенте по умолчанию) мы его анализируем и выполняем какой то код..
В общем что есть...
Структура NetworkPacket
по идеи так. (не знаю правильно или нет, так как до этого только рисованием в клиенте занимался)
Код:
struct NetworkPacket
union
id db ?
align_ dd ?
ends
cb dd ?
data db ?
ends
Так же по каком то примере от GoldFish на С++ был какой то хук
Я его попытался переделать в ФАСМ
Код:
proc DispatchNetworkQueueHook
push esp+04h
call [pDispNetwork]
test eax,eax
jz skip_
mov edx,[esp+4]
push eax
push edx
stdcall DrawPackets
pop eax
skip_:
ret 4
endp
Честно, не вникал в код, что ты там пытаешься сделать, но самый простейший способ перехватить метод - заменить его адрес в таблице вызова(хотя если дела касаются руоффа, то это наверно самый палевный способ)
В кратце логика подмены в таблице имен такая:
1) находим адрес объекта "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkP acket@@@Z"
2) находим адрес объекта "??_7UNetworkHandler@@6BUObject@@@"
3) начиная с адреса из пункта 2 организуем поиск ячейки со значением адреса (п.1)
4) затем заменяем там найденный адрес на адрес своей функции и радуемся жизни (и мб. ждем банан)))
Так это же тогда надо будет полностью писать функцию свою...
А как то же сплайсингом нельзя?
Просто в начале вызова ?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z
Поставить какой то call (E8) или же jmp (E9) на свою функцию а там Проверять какой id пакета.?
Сплайсингом можно и даже лучше по сути)))
Про таблицу - просто проще (как мне кажется), если на начальном этапе)) Функцию свою надо будет писать ровно настолько, сколько тебе нужно выполнить в ней, а в конце уже вызывать реальную функцию AddNetworkQueue
То есть просто потом jmp [Original]?
А как тут получить параметр.. А именно айди пакета.
1) jmp на функцию, объявленную так же как и перехватываемая (у которой будет один параметр - указатель на пакет)
2) в своей функции надо сразу сохранить содержимое ecx
3) перед вызовом оригинала восстановить переписанные 5 байт (джамп) запихнуть с ecx то что оттуда сохраняли, и уже теперь вызывать оригинал
4) снова поставить хук (так как для вызова мы его снимали)
зы: тут нету волшебных 5 байт в начале ф-ии которые можено переписать без последствий
По поводу id пакета и т.п. дам тебе тот же совет, что когда-то дали мне, берешь пакетхак и там есть инишники с описанием большинства (мб и всех, хотя врядли) пакетов))
ЗЫ Сначала хотел сказать, что Морфик наркоман, потом выпил кофе проснулся, и понял что похоже на правду)))
ЗЫЫ Морфик, ты сейчас кстати полностью извне работаешь с клиентом или все-таки инжетишься и юзаешь экспортируемые функции без перехвата?
По поводу id пакета и т.п. дам тебе тот же совет, что когда-то дали мне, берешь пакетхак и там есть инишники с описанием большинства (мб и всех, хотя врядли) пакетов))
ЗЫ Сначала хотел сказать, что Морфик наркоман, потом выпил кофе проснулся, и понял что похоже на правду)))
ЗЫЫ Морфик, ты сейчас кстати полностью извне работаешь с клиентом или все-таки инжетишься и юзаешь экспортируемые функции без перехвата?
полностью из вне работать никак не выйдет, если канешна не знаешь алгоритмов фроста =) ингжект и работа без перехватов - возможностей мало, но зато максимум безопасности
полностью из вне работать никак не выйдет, если канешна не знаешь алгоритмов фроста =) ингжект и работа без перехватов - возможностей мало, но зато максимум безопасности
ок, спс)) А то я стал уже голову ломать, зачем тебе нужен был РидПроцессМемори) уж думал, что ты полностью извне с памятью линейки работаешь))
Добавлено через 22 минуты
Цитата:
Сообщение от ALF
В общем суть такова
Сервер на клиент отправляет пакет
(айди допустим 0x99, структура cSSSSS)
в 5 строк.... Имена чаров)
Потом методами клиента рисуем эти ники (топ пвп которые в игре)
Ну рисовалку я уже знаю как сделать)
А вот с пакетиками (клиент часть) пока что туговато)
Добавлено через 1 час 1 минуту
P.S. А как именно определить, какой айди приходит?
Вот при вызове UNetworkHandler:ispatchNetworkQueue функции передается в аргумент пакет (DispatchNetworkQueue(np:NetworkPacket)
Структура NetworkPacket выглядит както так
Код:
struct NetworkPacket
union
id db ?
align_ dd ?
ends
cb dd ?
data db ?
ends
Зная __thiscall аргументы передаются по стеку.
Очевидно что можно оттуда достать и сам пакет и проанализировать его... Только вот как.....
Ну структура пакета рабочая вот: (на АСМе хз как оно)
struct NetworkPacket
{
unsigned char id, _padding1, exid, _padding2;
unsigned short size, _padding3;
unsigned char* data;
};
Соответственно первый параметр и есть id пакета.
Теперь про то как это выдернуть...
Смотри, если ты vmt хукаешь (про что говорил я), тогда как раз эта структура и передается твоей функции (точнее указатель), поэтому ничего выдергивать не надо...
Если Сплайсом(как Морфик говорил), тогда дергаешь из стека адрес, и по этому адресу уже лежит структура...
Последний раз редактировалось Aries, 19.04.2011 в 23:45.
Причина: Добавлено сообщение
Сплайс неочень хорошая идея так как востанавливать и перезаписывать функцию не лушее решение. Защита хукающая вмт тоже наивное решение. Дестр имхо твою защиту там перехукает быстрее чем ты это реализуеш) нада гдето из сокета брать пакет желательно юзая другую шифрацию недоводя даже до адднетворка и покрыть код фимой. Правда хз как такой пакет будет слать сервер и в каком виде у тя серверная часть защиты.