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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 17.04.2011, 14:50   #1
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
Стрелка [FASM] Хук DispatchNetworkQueue

И так всем привет!
Столкнулся с проблемой...
Если с сервер приходит пакет (например если на сервере сделать новый пакет, которого нету в клиенте по умолчанию) мы его анализируем и выполняем какой то код..
В общем что есть...
Структура 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
Что делать дальше?
Этот хук надо сплайсить с
Код:
szDispNetwork	db	'?DispatchNetworkQueue@UNetworkHandler@@UAEHPAPAUNetworkPacket@@@Z',0
...
..
	GetProcAddress([pEngine],szDispNetwork) 		; pDispNetwork:=GetProcAddress(pEngine,szDispNetwork);
	mov	dword [pDispNetwork], eax
Подскажите пожалуста алгоритм что за чем, и если можете примеры....
Заранее спасибо
__________________
Все относительно...

Последний раз редактировалось ALF, 17.04.2011 в 15:00.
ALF вне форума   Ответить с цитированием
Старый 18.04.2011, 20:10   #2
Местный
 
Аватар для Aries
 
Регистрация: 19.01.2011
Сообщений: 241
Сказал Спасибо: 7
Имеет 26 спасибок в 22 сообщенях
Aries пока неопределено
По умолчанию

Честно, не вникал в код, что ты там пытаешься сделать, но самый простейший способ перехватить метод - заменить его адрес в таблице вызова(хотя если дела касаются руоффа, то это наверно самый палевный способ)

В кратце логика подмены в таблице имен такая:
1) находим адрес объекта "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkP acket@@@Z"
2) находим адрес объекта "??_7UNetworkHandler@@6BUObject@@@"
3) начиная с адреса из пункта 2 организуем поиск ячейки со значением адреса (п.1)
4) затем заменяем там найденный адрес на адрес своей функции и радуемся жизни (и мб. ждем банан)))
Aries вне форума   Ответить с цитированием
За это сообщение Aries нажился спасибкой от:
Старый 19.04.2011, 00:36   #3
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
По умолчанию

Так это же тогда надо будет полностью писать функцию свою...
А как то же сплайсингом нельзя?
Просто в начале вызова ?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z
Поставить какой то call (E8) или же jmp (E9) на свою функцию а там Проверять какой id пакета.?

Вот я сделал отдельно функцию для сплайсинга
Код:
proc Splaising Adr,Hook
	mov eax, [Adr]
	mov	ebx, eax
	mov	edx, [Hook]
	add	ebx, 05h
	sub	edx, ebx									; calc (hook - (orig + 5))
	mov	byte [eax], 0E8h							; call
	mov	dword [eax+1], edx							; rel32
	ret
endp
__________________
Все относительно...

Последний раз редактировалось ALF, 19.04.2011 в 00:46.
ALF вне форума   Ответить с цитированием
Старый 19.04.2011, 01:24   #4
Местный
 
Аватар для Aries
 
Регистрация: 19.01.2011
Сообщений: 241
Сказал Спасибо: 7
Имеет 26 спасибок в 22 сообщенях
Aries пока неопределено
По умолчанию

Сплайсингом можно и даже лучше по сути)))
Про таблицу - просто проще (как мне кажется), если на начальном этапе)) Функцию свою надо будет писать ровно настолько, сколько тебе нужно выполнить в ней, а в конце уже вызывать реальную функцию AddNetworkQueue
Aries вне форума   Ответить с цитированием
Старый 19.04.2011, 01:53   #5
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
По умолчанию

То есть просто потом jmp [Original]?
А как тут получить параметр.. А именно айди пакета.
__________________
Все относительно...
ALF вне форума   Ответить с цитированием
Старый 19.04.2011, 03:31   #6
Рыцарь
 
Аватар для Morfik
 
Регистрация: 13.10.2009
Сообщений: 665
Сказал Спасибо: 38
Имеет 172 спасибок в 108 сообщенях
Morfik пока неопределено
По умолчанию

Цитата:
Сообщение от ALF Посмотреть сообщение
То есть просто потом jmp [Original]?
А как тут получить параметр.. А именно айди пакета.
1) jmp на функцию, объявленную так же как и перехватываемая (у которой будет один параметр - указатель на пакет)
2) в своей функции надо сразу сохранить содержимое ecx
3) перед вызовом оригинала восстановить переписанные 5 байт (джамп) запихнуть с ecx то что оттуда сохраняли, и уже теперь вызывать оригинал
4) снова поставить хук (так как для вызова мы его снимали)

зы: тут нету волшебных 5 байт в начале ф-ии которые можено переписать без последствий
Morfik вне форума   Ответить с цитированием
Старый 19.04.2011, 10:19   #7
Местный
 
Аватар для Aries
 
Регистрация: 19.01.2011
Сообщений: 241
Сказал Спасибо: 7
Имеет 26 спасибок в 22 сообщенях
Aries пока неопределено
По умолчанию

По поводу id пакета и т.п. дам тебе тот же совет, что когда-то дали мне, берешь пакетхак и там есть инишники с описанием большинства (мб и всех, хотя врядли) пакетов))


ЗЫ Сначала хотел сказать, что Морфик наркоман, потом выпил кофе проснулся, и понял что похоже на правду)))
ЗЫЫ Морфик, ты сейчас кстати полностью извне работаешь с клиентом или все-таки инжетишься и юзаешь экспортируемые функции без перехвата?
Aries вне форума   Ответить с цитированием
Старый 19.04.2011, 20:26   #8
Рыцарь
 
Аватар для Morfik
 
Регистрация: 13.10.2009
Сообщений: 665
Сказал Спасибо: 38
Имеет 172 спасибок в 108 сообщенях
Morfik пока неопределено
По умолчанию

Цитата:
Сообщение от Aries Посмотреть сообщение
По поводу id пакета и т.п. дам тебе тот же совет, что когда-то дали мне, берешь пакетхак и там есть инишники с описанием большинства (мб и всех, хотя врядли) пакетов))


ЗЫ Сначала хотел сказать, что Морфик наркоман, потом выпил кофе проснулся, и понял что похоже на правду)))
ЗЫЫ Морфик, ты сейчас кстати полностью извне работаешь с клиентом или все-таки инжетишься и юзаешь экспортируемые функции без перехвата?
полностью из вне работать никак не выйдет, если канешна не знаешь алгоритмов фроста =) ингжект и работа без перехватов - возможностей мало, но зато максимум безопасности
Morfik вне форума   Ответить с цитированием
За это сообщение Morfik нажился спасибкой от:
Старый 19.04.2011, 23:45   #9
Местный
 
Аватар для Aries
 
Регистрация: 19.01.2011
Сообщений: 241
Сказал Спасибо: 7
Имеет 26 спасибок в 22 сообщенях
Aries пока неопределено
По умолчанию

Цитата:
Сообщение от Morfik Посмотреть сообщение
полностью из вне работать никак не выйдет, если канешна не знаешь алгоритмов фроста =) ингжект и работа без перехватов - возможностей мало, но зато максимум безопасности
ок, спс)) А то я стал уже голову ломать, зачем тебе нужен был РидПроцессМемори) уж думал, что ты полностью извне с памятью линейки работаешь))

Добавлено через 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. Причина: Добавлено сообщение
Aries вне форума   Ответить с цитированием
За это сообщение Aries нажился спасибкой от:
Старый 19.04.2011, 11:17   #10
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

Сплайс неочень хорошая идея так как востанавливать и перезаписывать функцию не лушее решение. Защита хукающая вмт тоже наивное решение. Дестр имхо твою защиту там перехукает быстрее чем ты это реализуеш) нада гдето из сокета брать пакет желательно юзая другую шифрацию недоводя даже до адднетворка и покрыть код фимой. Правда хз как такой пакет будет слать сервер и в каком виде у тя серверная часть защиты.
__________________
читернуть бы ништяг
mira вне форума   Ответить с цитированием
Ответ

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



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

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


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

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

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