08-03-2016, 09:28 PM
Такой вопрос по поводу пакетов: судя по логике кода, если пакет удовлетворяет требованиям, то мы создаем новый экземпляр и добавляем его в список, но я не вижу удаления пакета. Только создание нового...
![[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]](http://klikr.org/4e38c909fcd08c5fcdf363b54a62.png)
C++ перехват пакетов
|
08-03-2016, 09:28 PM
Такой вопрос по поводу пакетов: судя по логике кода, если пакет удовлетворяет требованиям, то мы создаем новый экземпляр и добавляем его в список, но я не вижу удаления пакета. Только создание нового...
![]()
08-03-2016, 10:01 PM
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] Посылаем текущий пакет в пул..., но у него такой же опкод, в итоге не будет ли рекурсии?) ![]() Собственно вопрос: WTF?! ![]() ![]()
08-03-2016, 10:44 PM
Вообще у меня dllmain отваливается на строке: *DispatchNetworkQueueVMT = DispatchNetworkQueue;
А если пытаюсь захукать, как UNetworkHandler_AddNetworkQueue то получаю крит связанный с Tick. ![]()
08-04-2016, 01:17 AM
Вообщем хф хукается нормально, а с годом проблемы, хотя по идее все также -_-
![]() Zubastic Написал:Вообщем хф хукается нормально, а с годом проблемы, хотя по идее все также -_- Ну так это пример чисто под хф был, чтобы показать, как свои пакеты делать) как минимум, под год нужно по другому искать DispatchNetworkQueue, ибо в примере хардкод ее смещения в вмт, нужно динамически искать, а с каких то хроник вообще в экспорте не будет UNetworkHandler::* Какие конкретно хроники? Всякие хелиосы?
08-04-2016, 06:04 AM
f1redark, агась, хелиос. Да, там нет экспорта UNetworkHandler::*, но эту проблему решили еще на ранних этапах.
Цитата:[0:40:58] Zubastic: при попытке записи в vmt Зуб ответит точнее. Persy Написал:f1redark, агась, хелиос. Да, там нет экспорта UNetworkHandler::*, но эту проблему решили еще на ранних этапах. Как решили то, если не секрет?) Можно в общих словах, у меня руки еще не дошли до этих хроник, я все хф ковырял) Судя по его сообщению на форуме, и по времени поста, на хф таки все взлетело в итоге, а вот на руофе там хз, вполне и Фрост может сразу критовать, если обнаружит изменение вмт. Добавлено через 16 минут Zubastic Написал:Запилил себе создание новых пакетов: На самом деле все проще: [SRC="c++"] if (!packets.empty()) { *packet = packets.front(); packets.pop(); result = 1; } [/SRC] Логика тут такая, у нашей очереди packets специально сделан приоритет выше, чем у игровой. Таким образом, если у нас в нашей очереди есть пакет, мы сразу отдаем его клиенту, а DispatchNetworkQueue оригинальный вообще не вызываем, т.е. настоящие пакеты от сервера начнут обрабатываться только тогда, когда клиент разгребет пакеты из нашей очереди. [SRC="c++"] result = (*DispatchNetworkQueueOrig)(This, 0, ¤t_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, удалит сам клиент, после того, как дернет хендлер для обработки пакета, так что тут все хорошо.
08-04-2016, 07:55 AM
f1redark Написал:Ну так это пример чисто под хф был, чтобы показать, как свои пакеты делать) как минимум, под год нужно по другому искать DispatchNetworkQueue, ибо в примере хардкод ее смещения в вмт, нужно динамически искать, а с каких то хроник вообще в экспорте не будет UNetworkHandler::*Хелиосы. ГГ вырублен. При попытке пропатчить память клиент просто зависает. (даже не крит). Если патчить так, как я это делал для других смещений, то ловим крит ![]() Да что там искать то ![]() [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] ![]()
08-04-2016, 07:56 AM
f1redark;416414 Написал:вот на руофе там хз, вполне и Фрост может сразу критовать, если обнаружит изменение вмтБоже упаси, никаких ру-офов, фростов и прочих геймГвардов. Но вот мысль здравая. Надо изучить "NProtect", который там появился, возможно корейцы пошалили с защитами. Хотя у локализаторов он отключен обычно.
08-04-2016, 08:12 AM
Persy Написал:Боже упаси, никаких ру-офов, фростов и прочих геймГвардов. Но вот мысль здравая. Надо изучить "NProtect", который там появился, возможно корейцы пошалили с защитами. Хотя у локализаторов он отключен обычно. А где вы тестируете? |
« Предыдущая | Следующая »
|
Возможно похожие темы ... | |||||
Тема | Автор | Ответы | Просмотры | Последний пост | |
Свой сниффер и редактор пакетов | 0 | 880 |
03-22-2024, 03:28 AM Последний пост: SiriusED |
||
Реконструкция пакетов из WSARecv\WSASend | 3 | 2,782 |
04-17-2016, 08:34 PM Последний пост: Necroz-Team |
||
Подмен пакетов | 4 | 3,413 |
06-16-2014, 07:24 PM Последний пост: PROGRAMMATOR |
||
Опкоды пакетов при хуке | 3 | 2,691 |
07-09-2013, 04:18 PM Последний пост: Mifesto |