C++ перехват пакетов - Страница 10 - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming

Программирование / Programming
Ищете помощи в написании программы, есть сложность в выполнении задания (в институте и т.д.), пожалуйста, спросите у нас в данном форуме и мы обязательно вам поможем.

Ответ
Опции темы
Непрочитано 03.08.2016, 21:28   #91
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: C++ перехват пакетов

Такой вопрос по поводу пакетов: судя по логике кода, если пакет удовлетворяет требованиям, то мы создаем новый экземпляр и добавляем его в список, но я не вижу удаления пакета. Только создание нового...
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 03.08.2016, 22:01   #92
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: C++ перехват пакетов

Цитата:
Сообщение от f1redark Посмотреть сообщение
Создание нового пакета - это самый чистый способ, тем более игровыми средствами. В этой точке можно: анализировать пакеты, удалять не желательные, модифицировать существующие, и добавлять свои, в общем, все, что нужно для счастья)
Запилил себе создание новых пакетов:
UNetworkPacket* CreatePacket(uint8_t packetId, uint32_t size)
{
	auto new_packet = reinterpret_cast<UNetworkPacket *>(gmalloc(sizeof(UNetworkPacket)));
	new_packet->id = packetId;
	new_packet->id2 = 0xFFFF;
	new_packet->size = size;
	new_packet->data = gmalloc(size);
	return new_packet;
}
Code: C++
Однако у меня разрыв шаблона в коде:
*packet = current_packet;
Code: C++
Забираем пакет из пула.
*packet = new_packet;
Code: C++
В итоге присваиваем новый пакет указателю.
packets.push(current_packet);
Code: C++
Посылаем текущий пакет в пул..., но у него такой же опкод, в итоге не будет ли рекурсии?)
Собственно вопрос: WTF?!
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 03.08.2016, 22:44   #93
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: C++ перехват пакетов

Вообще у меня dllmain отваливается на строке: *DispatchNetworkQueueVMT = DispatchNetworkQueue;
А если пытаюсь захукать, как UNetworkHandler_AddNetworkQueue то получаю крит связанный с Tick.
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 04.08.2016, 01:17   #94
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: C++ перехват пакетов

Вообщем хф хукается нормально, а с годом проблемы, хотя по идее все также -_-
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 04.08.2016, 05:00   #95
Пользователь

По умолчанию Re: C++ перехват пакетов

Цитата:
Сообщение от Zubastic Посмотреть сообщение
Вообщем хф хукается нормально, а с годом проблемы, хотя по идее все также -_-
Ну так это пример чисто под хф был, чтобы показать, как свои пакеты делать) как минимум, под год нужно по другому искать DispatchNetworkQueue, ибо в примере хардкод ее смещения в вмт, нужно динамически искать, а с каких то хроник вообще в экспорте не будет UNetworkHandler::*

Какие конкретно хроники? Всякие хелиосы?

Последний раз редактировалось f1redark; 04.08.2016 в 07:35.
f1redark вне форума Ответить с цитированием
Непрочитано 04.08.2016, 06:04   #96
Аватар для Persy
Пользователь

По умолчанию Re: C++ перехват пакетов

f1redark, агась, хелиос. Да, там нет экспорта UNetworkHandler::*, но эту проблему решили еще на ранних этапах.
Цитата:
[0:40:58] Zubastic: при попытке записи в vmt
[0:41:00] Zubastic: сразу крит
Зуб ответит точнее.
Persy вне форума Отправить сообщение для Persy с помощью Skype™ Ответить с цитированием
Непрочитано 04.08.2016, 07:08   #97
Пользователь

По умолчанию Re: C++ перехват пакетов

Цитата:
Сообщение от Persy Посмотреть сообщение
f1redark, агась, хелиос. Да, там нет экспорта UNetworkHandler::*, но эту проблему решили еще на ранних этапах.


Зуб ответит точнее.
Как решили то, если не секрет?) Можно в общих словах, у меня руки еще не дошли до этих хроник, я все хф ковырял) Судя по его сообщению на форуме, и по времени поста, на хф таки все взлетело в итоге, а вот на руофе там хз, вполне и Фрост может сразу критовать, если обнаружит изменение вмт.

Добавлено через 16 минут
Цитата:
Сообщение от Zubastic Посмотреть сообщение
Запилил себе создание новых пакетов:
UNetworkPacket* CreatePacket(uint8_t packetId, uint32_t size)
{
	auto new_packet = reinterpret_cast<UNetworkPacket *>(gmalloc(sizeof(UNetworkPacket)));
	new_packet->id = packetId;
	new_packet->id2 = 0xFFFF;
	new_packet->size = size;
	new_packet->data = gmalloc(size);
	return new_packet;
}
Code: C++
Однако у меня разрыв шаблона в коде:
*packet = current_packet;
Code: C++
Забираем пакет из пула.
*packet = new_packet;
Code: C++
В итоге присваиваем новый пакет указателю.
packets.push(current_packet);
Code: C++
Посылаем текущий пакет в пул..., но у него такой же опкод, в итоге не будет ли рекурсии?)
Собственно вопрос: WTF?!
На самом деле все проще:

 
	if (!packets.empty())
	{
		*packet = packets.front();
		packets.pop();
 
		result = 1;
	}
 
Code: C++
Логика тут такая, у нашей очереди packets специально сделан приоритет выше, чем у игровой. Таким образом, если у нас в нашей очереди есть пакет, мы сразу отдаем его клиенту, а DispatchNetworkQueue оригинальный вообще не вызываем, т.е. настоящие пакеты от сервера начнут обрабатываться только тогда, когда клиент разгребет пакеты из нашей очереди.

 
result = (*DispatchNetworkQueueOrig)(This, 0, &current_packet);
 
		if (result)
		{
			*packet = current_packet;
 
Code: C++
Здесь дергаем оригинал, если он вернул в result что то, отличное от нуля, то так как мы этот result потом возвращем клиенту, мы обязаны заполнить переданный нам в функцию UNetworkPacket **packet указателем на валидный пакет, я делаю это сразу, чтобы потом не оказалось, что вернули result != 0, а *packet не заполнили, и ловим крит, т.е. это как значение по умолчанию, я сразу задаю *packet как значение, которое вернула оригинальная DispatchNetworkQueue, а ниже его перезатираю, если возникает такая необходимость.

*packet = new_packet;
Code: C++
Собственно, возникла эта самая необходимость, мы хотим, чтобы наш пакет клиент обработал раньше, чем настоящий от сервера, поэтому перезаписываем *packet.

packets.push(current_packet);
Code: C++
Тут мы в нашу очередь записываем настоящий пакет от сервера, чтобы он не потерялся, и когда клиент в очередной раз дернет нашу DispatchNetworkQueue, сработает код:

 
	if (!packets.empty())
	{
		*packet = packets.front();
		packets.pop();
 
		result = 1;
	}
 
Code: C++
который отдаст клиенту оригинальный пакет. Если оригинальный не нужно передавать, его можно прямо тут грохнуть:

 
        gfree(current_packet->data);
        gfree(current_packet);
 
Code: C++
Добавлено через 19 минут
Цитата:
Сообщение от Zubastic Посмотреть сообщение
Такой вопрос по поводу пакетов: судя по логике кода, если пакет удовлетворяет требованиям, то мы создаем новый экземпляр и добавляем его в список, но я не вижу удаления пакета. Только создание нового...
Все, чем ты заполнишь выходной формальный параметр UNetworkHandler **packet, удалит сам клиент, после того, как дернет хендлер для обработки пакета, так что тут все хорошо.

Последний раз редактировалось f1redark; 04.08.2016 в 07:34. Причина: Добавлено сообщение
f1redark вне форума Ответить с цитированием
Непрочитано 04.08.2016, 07:55   #98
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: C++ перехват пакетов

Цитата:
Сообщение от f1redark Посмотреть сообщение
Ну так это пример чисто под хф был, чтобы показать, как свои пакеты делать) как минимум, под год нужно по другому искать DispatchNetworkQueue, ибо в примере хардкод ее смещения в вмт, нужно динамически искать, а с каких то хроник вообще в экспорте не будет UNetworkHandler::*

Какие конкретно хроники? Всякие хелиосы?
Хелиосы. ГГ вырублен. При попытке пропатчить память клиент просто зависает. (даже не крит). Если патчить так, как я это делал для других смещений, то ловим крит

Да что там искать то
	HMODULE hEngine = LoadLibraryA("Engine.dll");
		UNetworkHandler_AddNetworkQueue = (UNetworkHandler_AddNetworkQueueType)(hEngine + CalcOffset(0x20554600)); // ?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z 0x20554600 - helios
		void** UNetworkHandler_vftable = (void**)(hEngine + CalcOffset(0x2072E94C));		 // ??_7UNetworkHandler@@6BUObject@@@ 0x2072E94C - helios 0x72D74C
		void** dispatch = (UNetworkHandler_vftable + 0x21); // 0x84 for 4 byte
		DispatchNetworkQueueOrig = *(DispatchNetworkQueueType)dispatch;
		HookFunction(dispatch, DispatchNetworkQueue);
 
Code: C++
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 04.08.2016, 07:56   #99
Аватар для Persy
Пользователь

По умолчанию Re: C++ перехват пакетов

Цитата:
Сообщение от f1redark Посмотреть сообщение
вот на руофе там хз, вполне и Фрост может сразу критовать, если обнаружит изменение вмт
Боже упаси, никаких ру-офов, фростов и прочих геймГвардов. Но вот мысль здравая. Надо изучить "NProtect", который там появился, возможно корейцы пошалили с защитами. Хотя у локализаторов он отключен обычно.
Persy вне форума Отправить сообщение для Persy с помощью Skype™ Ответить с цитированием
Непрочитано 04.08.2016, 08:12   #100
Пользователь

По умолчанию Re: C++ перехват пакетов

Цитата:
Сообщение от Persy Посмотреть сообщение
Боже упаси, никаких ру-офов, фростов и прочих геймГвардов. Но вот мысль здравая. Надо изучить "NProtect", который там появился, возможно корейцы пошалили с защитами. Хотя у локализаторов он отключен обычно.
А где вы тестируете?
f1redark вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват и подмена пакетов Smiler ArcheAge 27 13.01.2023 04:12
Шифровка пакетов SiriusED Blade & Soul 8 23.07.2015 00:21
Подмен пакетов katanasmil Программирование / Programming 4 16.06.2014 19:24
Отправка пакетов(C#) Tezarius ArcheAge 6 13.03.2014 01:28
Перехват пакетов конкретного приложения под win32 Redvain Курилка / Yak floor 0 28.05.2009 12:46


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 13:34. Часовой пояс GMT +3.

Вверх