Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
C++ перехват пакетов
#91
Такой вопрос по поводу пакетов: судя по логике кода, если пакет удовлетворяет требованиям, то мы создаем новый экземпляр и добавляем его в список, но я не вижу удаления пакета. Только создание нового...
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#92
f1redark Написал:Создание нового пакета - это самый чистый способ, тем более игровыми средствами. В этой точке можно: анализировать пакеты, удалять не желательные, модифицировать существующие, и добавлять свои, в общем, все, что нужно для счастья)
Запилил себе создание новых пакетов:
[SRC="c++"]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;
}[/SRC]

Однако у меня разрыв шаблона в коде:
[SRC="c++"]*packet = current_packet;[/SRC]
Забираем пакет из пула.
[SRC="c++"]*packet = new_packet;[/SRC]
В итоге присваиваем новый пакет указателю.
[SRC="c++"]packets.push(current_packet);[/SRC]
Посылаем текущий пакет в пул..., но у него такой же опкод, в итоге не будет ли рекурсии?) Smile
Собственно вопрос: WTF?! Smile
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#93
Вообще у меня dllmain отваливается на строке: *DispatchNetworkQueueVMT = DispatchNetworkQueue;
А если пытаюсь захукать, как UNetworkHandler_AddNetworkQueue то получаю крит связанный с Tick.
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#94
Вообщем хф хукается нормально, а с годом проблемы, хотя по идее все также -_-
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#95
Zubastic Написал:Вообщем хф хукается нормально, а с годом проблемы, хотя по идее все также -_-

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

Какие конкретно хроники? Всякие хелиосы?
Ответ
#96
f1redark, агась, хелиос. Да, там нет экспорта UNetworkHandler::*, но эту проблему решили еще на ранних этапах.
Цитата:[0:40:58] Zubastic: при попытке записи в vmt
[0:41:00] Zubastic: сразу крит

Зуб ответит точнее.
Ответ
#97
Persy Написал:f1redark, агась, хелиос. Да, там нет экспорта UNetworkHandler::*, но эту проблему решили еще на ранних этапах.


Зуб ответит точнее.

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

Добавлено через 16 минут
Zubastic Написал:Запилил себе создание новых пакетов:
[SRC="c++"]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;
}[/SRC]

Однако у меня разрыв шаблона в коде:
[SRC="c++"]*packet = current_packet;[/SRC]
Забираем пакет из пула.
[SRC="c++"]*packet = new_packet;[/SRC]
В итоге присваиваем новый пакет указателю.
[SRC="c++"]packets.push(current_packet);[/SRC]
Посылаем текущий пакет в пул..., но у него такой же опкод, в итоге не будет ли рекурсии?) Smile
Собственно вопрос: WTF?! Smile

На самом деле все проще:

[SRC="c++"]
if (!packets.empty())
{
*packet = packets.front();
packets.pop();

result = 1;
}
[/SRC]

Логика тут такая, у нашей очереди packets специально сделан приоритет выше, чем у игровой. Таким образом, если у нас в нашей очереди есть пакет, мы сразу отдаем его клиенту, а DispatchNetworkQueue оригинальный вообще не вызываем, т.е. настоящие пакеты от сервера начнут обрабатываться только тогда, когда клиент разгребет пакеты из нашей очереди.

[SRC="c++"]
result = (*DispatchNetworkQueueOrig)(This, 0, &current_packet);

if (result)
{
*packet = current_packet;
[/SRC]

Здесь дергаем оригинал, если он вернул в result что то, отличное от нуля, то так как мы этот result потом возвращем клиенту, мы обязаны заполнить переданный нам в функцию UNetworkPacket **packet указателем на валидный пакет, я делаю это сразу, чтобы потом не оказалось, что вернули result != 0, а *packet не заполнили, и ловим крит, т.е. это как значение по умолчанию, я сразу задаю *packet как значение, которое вернула оригинальная DispatchNetworkQueue, а ниже его перезатираю, если возникает такая необходимость.

[SRC="c++"]*packet = new_packet;[/SRC]

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

[SRC="c++"]packets.push(current_packet);[/SRC]

Тут мы в нашу очередь записываем настоящий пакет от сервера, чтобы он не потерялся, и когда клиент в очередной раз дернет нашу DispatchNetworkQueue, сработает код:

[SRC="c++"]
if (!packets.empty())
{
*packet = packets.front();
packets.pop();

result = 1;
}
[/SRC]

который отдаст клиенту оригинальный пакет. Если оригинальный не нужно передавать, его можно прямо тут грохнуть:

[SRC="c++"]
gfree(current_packet->data);
gfree(current_packet);
[/SRC]

Добавлено через 19 минут
Zubastic Написал:Такой вопрос по поводу пакетов: судя по логике кода, если пакет удовлетворяет требованиям, то мы создаем новый экземпляр и добавляем его в список, но я не вижу удаления пакета. Только создание нового...

Все, чем ты заполнишь выходной формальный параметр UNetworkHandler **packet, удалит сам клиент, после того, как дернет хендлер для обработки пакета, так что тут все хорошо.
Ответ
#98
f1redark Написал:Ну так это пример чисто под хф был, чтобы показать, как свои пакеты делать) как минимум, под год нужно по другому искать DispatchNetworkQueue, ибо в примере хардкод ее смещения в вмт, нужно динамически искать, а с каких то хроник вообще в экспорте не будет UNetworkHandler::*

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

Да что там искать то Smile
[SRC="c++"] 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);
[/SRC]
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#99
f1redark;416414 Написал:вот на руофе там хз, вполне и Фрост может сразу критовать, если обнаружит изменение вмт
Боже упаси, никаких ру-офов, фростов и прочих геймГвардов. Но вот мысль здравая. Надо изучить "NProtect", который там появился, возможно корейцы пошалили с защитами. Хотя у локализаторов он отключен обычно.
Ответ
Persy Написал:Боже упаси, никаких ру-офов, фростов и прочих геймГвардов. Но вот мысль здравая. Надо изучить "NProtect", который там появился, возможно корейцы пошалили с защитами. Хотя у локализаторов он отключен обычно.

А где вы тестируете?
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Свой сниффер и редактор пакетов SiriusED 0 880 03-22-2024, 03:28 AM
Последний пост: SiriusED
  Реконструкция пакетов из WSARecv\WSASend ANZO 3 2,782 04-17-2016, 08:34 PM
Последний пост: Necroz-Team
  Подмен пакетов katanasmil 4 3,413 06-16-2014, 07:24 PM
Последний пост: PROGRAMMATOR
  Опкоды пакетов при хуке Mifesto 3 2,691 07-09-2013, 04:18 PM
Последний пост: Mifesto

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)