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

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

Ответ
Опции темы
Непрочитано 25.07.2016, 14:10   #1
Аватар для Zubastic
ZG troll squad

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

Собственно хочу сделать еще одну реинкарнацию пакетхака. На этот раз в виде длл, но возникла большая проблема:
// dllmain.cpp: определяет точку входа для приложения DLL.
#include <Windows.h>
 
__declspec(dllexport) void dllmain() {}
 
class UNetworkHandler {};
 
#pragma pack(push, 1)
struct NetworkPacket
{
    unsigned char id, _padding1, exid, _padding2;
    unsigned short size, _padding3;
    unsigned char* data;
};
struct ClientPacket
{
    unsigned char id, _padding1, exid, _padding2;
    unsigned short size, _padding3;
    unsigned char* data;
};
#pragma pack(pop)
 
int(__fastcall *UNetworkHandler_AddNetworkQueue)(UNetworkHandler*, int, NetworkPacket*);
typedef void(__cdecl *UNetworkHandler_OutgoingPacket)(unsigned int This, char *Format, ...);
UNetworkHandler_OutgoingPacket true_UNetworkHandler_OutgoingPacket;
 
void ParseClientPacket(ClientPacket* packet)
{
 
}
 
void ParseServerPacket(NetworkPacket* packet)
{
 
}
 
//Клиентские пакеты
int __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int This, char *Format, ...)
{
    true_UNetworkHandler_OutgoingPacket(This, Format, ...);
    return 0;
}
 
//Серверные пакеты
int __fastcall UNetworkHandler_IncommingPacket_hook(UNetworkHandler* This, int /*edx*/, NetworkPacket* packet)
{
    // Полезная нагрузка перехвата
    char buf[1024];
    wsprintfA(buf, "Server Packet id=0x%x, size=0x%x", packet->id, packet->size);
    OutputDebugStringA(buf);
    ParseServerPacket(packet);
    //-----------------------------------------
    return (*UNetworkHandler_AddNetworkQueue)(This, 0/*чтоугодно*/, packet);
}
 
DWORD WINAPI InitThread(LPVOID)
{
    HMODULE hEngine = LoadLibraryA("Engine.dll");
    (FARPROC&)UNetworkHandler_AddNetworkQueue = GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z");
    void** UNetworkHandler_vftable = (void**)GetProcAddress(hEngine, "??_7UNetworkHandler@@6BUObject@@@");
    void** addr = (void**)(UNetworkHandler_vftable - 0x7); //0x1C for 4 byte
    (FARPROC&)true_UNetworkHandler_OutgoingPacket = FARPROC(addr);
    *addr = (void*)UNetworkHandler_OutgoingPacket_hook;
    void** UNetworkHandler_vftableCheck = UNetworkHandler_vftable;
    while (*UNetworkHandler_vftableCheck != (void*)UNetworkHandler_AddNetworkQueue) ++UNetworkHandler_vftableCheck;
    *UNetworkHandler_vftableCheck = (void*)UNetworkHandler_IncommingPacket_hook;
    return 0;
}
 
BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
    if (DLL_PROCESS_ATTACH != ul_reason_for_call)
        return 1;
    DisableThreadLibraryCalls(hModule);
 
    CreateThread(0, 0, &InitThread, 0, 0, 0);
    return 1;
}
Code: C++
Собственно почему в одном случае все работает, а в другом ошибка?)
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 25.07.2016, 20:28   #2
Аватар для Awiion

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

Zubastic,
Почему вы так не используете?

Код:
BOOL InitThread(void)
{
	return 0;
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD hReason, LPVOID hReserved)
{
	DisableThreadLibraryCalls(hModule);
	if (hReason == DLL_PROCESS_ATTACH)
	{
		CreateThread(0, 0, (LPTHREAD_START_ROUTINE)InitThread, 0, 0, 0);
	}
	return TRUE;
}
Awiion вне форума Отправить сообщение для Awiion с помощью Skype™ Ответить с цитированием
Непрочитано 25.07.2016, 21:08   #3
Аватар для Zubastic
ZG troll squad

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

Мопед был найден на просторах интернета, да и для меня большой разницы не было как это реализовать.
Вопрос вот в этом:
int __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int This, char *Format, ...)
{
    true_UNetworkHandler_OutgoingPacket(This, Format, ...);
    return 0;
}
Code: C++
Тут эта байда отваливается, хотя я просто хочу пробросить функцию (ну и модифицировать чутка).
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 25.07.2016, 21:44   #4
Пользователь

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

Какие хроники?

UNetworkHandler_AddNetworkQueue вызывается без ошибок?

Возможно адрес true_UNetworkHandler_OutgoingPacket рассчитан неправильно.
flopix вне форума Ответить с цитированием
Непрочитано 25.07.2016, 21:57   #5
Аватар для n3k0nation
Antihero

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

В true_* функциях пролог есть?
__________________
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
n3k0nation вне форума Ответить с цитированием
Непрочитано 25.07.2016, 22:03   #6
Аватар для Zubastic
ZG troll squad

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

Цитата:
Сообщение от n3k0nation Посмотреть сообщение
В true_* функциях пролог есть?
Шо це такое?
Чета вон вверху есть.

Добавлено через 5 минут
Цитата:
Сообщение от flopix Посмотреть сообщение
Какие хроники?

UNetworkHandler_AddNetworkQueue вызывается без ошибок?

Возможно адрес true_UNetworkHandler_OutgoingPacket рассчитан неправильно.
ХФ 273
__________________

Последний раз редактировалось Zubastic; 25.07.2016 в 22:08. Причина: Добавлено сообщение
Zubastic вне форума Ответить с цитированием
Непрочитано 25.07.2016, 22:13   #7
Аватар для n3k0nation
Antihero

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

Цитата:
Сообщение от Zubastic Посмотреть сообщение
Шо це такое?
Чета вон вверху есть.

Добавлено через 5 минут

ХФ 273
like:
Код:
push ebp
mov ebp, esp
;далее твой джамп на функцию со смещением на 5 байт
И да. Корректно ли заменяются 5 байт на jmp near? Ибо пролога у функции может и не быть, что делает кучу гемороя, типа, написания дизассемблера длин и замена с помощью него + нопы, плюс учет стека, состояния регистров, бла-бла-бла
__________________
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
n3k0nation вне форума Ответить с цитированием
Непрочитано 25.07.2016, 23:02   #8
Аватар для Zubastic
ZG troll squad

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

Цитата:
Сообщение от n3k0nation Посмотреть сообщение
like:
Код:
push ebp
mov ebp, esp
;далее твой джамп на функцию со смещением на 5 байт
И да. Корректно ли заменяются 5 байт на jmp near? Ибо пролога у функции может и не быть, что делает кучу гемороя, типа, написания дизассемблера длин и замена с помощью него + нопы, плюс учет стека, состояния регистров, бла-бла-бла
Я же заменяю ссылку в vtable на метод. Зачем мне делать пролог?
Я понимаю если бы я экстил функцию в методе, тогда это имело смысл, а так какой смысл? Нет, конечно можно и так сделать, но это дополнительный геморрой, как ты описал.
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 25.07.2016, 23:09   #9
Пользователь

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

Попробуйте добавить поиск адреса таким способом и сравнить полученные адреса.
Это рабочий вариант как раз для HF

PHP код:
unsigned int GetSendPacketAddress(void)
{
    
HMODULE hEngine LoadLibraryA("engine.dll");

    
unsigned int startVMT = (unsigned intGetProcAddress(hEngine"??_7UNetworkHandler@@6BUObject@@@");
    
//sprintf_s(outSt, "startVMT: %u\n", startVMT);
    //PrintOnConsole(outSt);

    
unsigned int AddNetworkQueue = (unsigned intGetProcAddress(hEngine"?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z");
    
unsigned int currVMT startVMT;

    if (
AddNetworkQueue == 0)
    {
        
PrintOnConsole("GetSendPacketAddress: AddNetworkQueue == 0\n");
        return 
0;
    }

    while (
true)
    {
        if (*(
unsigned int*) currVMT == AddNetworkQueue)
        {
            return *(
unsigned int*) (currVMT 0xA4);
        }

        
currVMT++;
        if (
currVMT startVMT 10000)
        {
            
PrintOnConsole("GetSendPacketAddress: currVMT - startVMT > 10000\n");
            return 
0;
        }
    }

    
PrintOnConsole("GetSendPacketAddress: not find\n");
    return 
0;

flopix вне форума Ответить с цитированием
Непрочитано 25.07.2016, 23:34   #10
Аватар для Zubastic
ZG troll squad

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

Хорошо, попробую.
Но у меня адрес находится верно в любом случае.
__________________
Zubastic вне форума Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват и подмена пакетов Smiler ArcheAge 25 04.01.2019 21:08
Шифровка пакетов 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–2020 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 08:41. Часовой пояс GMT +3.

Вверх