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; }Собственно почему в одном случае все работает, а в другом ошибка?) |
Re: C++ перехват пакетов
Zubastic,
Почему вы так не используете? :) Код:
BOOL InitThread(void) |
Re: C++ перехват пакетов
Мопед был найден на просторах интернета, да и для меня большой разницы не было как это реализовать.
Вопрос вот в этом: int __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int This, char *Format, ...) { true_UNetworkHandler_OutgoingPacket(This, Format, ...); return 0; }Тут эта байда отваливается, хотя я просто хочу пробросить функцию (ну и модифицировать чутка). |
Re: C++ перехват пакетов
Какие хроники?
UNetworkHandler_AddNetworkQueue вызывается без ошибок? Возможно адрес true_UNetworkHandler_OutgoingPacket рассчитан неправильно. |
Re: C++ перехват пакетов
В true_* функциях пролог есть?
|
Re: C++ перехват пакетов
Цитата:
Чета вон вверху есть. Добавлено через 5 минут Цитата:
|
Re: C++ перехват пакетов
Цитата:
Код:
push ebp |
Re: C++ перехват пакетов
Цитата:
Я понимаю если бы я экстил функцию в методе, тогда это имело смысл, а так какой смысл? Нет, конечно можно и так сделать, но это дополнительный геморрой, как ты описал. |
Re: C++ перехват пакетов
Попробуйте добавить поиск адреса таким способом и сравнить полученные адреса.
Это рабочий вариант как раз для HF PHP код:
|
Re: C++ перехват пакетов
Хорошо, попробую.
Но у меня адрес находится верно в любом случае. |
Re: C++ перехват пакетов
Проверил, адреса совпадают.
|
Re: C++ перехват пакетов
Если временно сделать так то отрабатывает без ошибок? понятно что пакеты не будут отправлены.
PHP код:
|
Re: C++ перехват пакетов
Да, все нормально.
|
Re: C++ перехват пакетов
И что такая конструкция прям так компилируется с троеточием в аргументах :eek:?
PHP код:
PHP код:
|
Re: C++ перехват пакетов
Это псевдофункция. С тем, что у Вас - крит.
|
Re: C++ перехват пакетов
А патч чистый или может с какой то защитой?
|
Re: C++ перехват пакетов
а) Патч чистый.
б) Хватит копипастить код из шарных *Гвардов. |
Re: C++ перехват пакетов
Цитата:
|
Re: C++ перехват пакетов
Возможно проблема в дллке клаба, проверим ка и эту теорию...
Вообще мне код обработки пакетов не нравится, он какой-то ущербный... |
Re: C++ перехват пакетов
Не помогло. Используем 273 протокол, патч от рпг клаба без system.dll
|
Re: C++ перехват пакетов
Попробуйте пока что вместо вызова оригинальной функции выводить в лог ид пакета, строку Format, чтобы убедиться что вообще вызывается то что нужно с корректными данными.
|
Re: C++ перехват пакетов
Вроде как идет нормально. Вообще как написать нормально вывод?) А то я в плюсах не особо.
|
Re: C++ перехват пакетов
Например так:
PHP код:
|
Re: C++ перехват пакетов
Цитата:
|
Re: C++ перехват пакетов
Цитата:
Добавлено через 45 секунд Цитата:
|
Re: C++ перехват пакетов
Цитата:
То есть у вас проблема только в вызове оригинала. Как будто бы его адрес сохранен неверно. |
Re: C++ перехват пакетов
Так в чем тогда ошибка? Я так и не увидел, как ты вызываешь оригинал.
Добавлено через 17 минут Цитата:
|
Re: C++ перехват пакетов
Цитата:
Добавлено через 48 секунд Цитата:
Цитата:
|
Re: C++ перехват пакетов
Пробуйте с другим патчем. Возможно все таки тут не совсем он чистый и защите не нравится откуда вызывается функция true_UNetworkHandler_OutgoingPacket.
|
Re: C++ перехват пакетов
Цитата:
|
Re: C++ перехват пакетов
Цитата:
DWORD WINAPI InitThread(LPVOID) { ... true_UNetworkHandler_OutgoingPacket = (UNetworkHandler_OutgoingPacket)(*addr); ... } void __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int This, const char *Format, ...) { unsigned char buf[10240]; int size = 0, len; wchar_t *wstr; va_list args; va_start(args, Format); while (*Format != 0) { switch (*Format) { case 'c': *(unsigned char*)(buf + size) = va_arg(args, unsigned char); size++; break; case 'h': *(unsigned short int*) (buf + size) = va_arg(args, unsigned short int); size += 2; break; case 'd': *(unsigned int*)(buf + size) = va_arg(args, unsigned int); size += 4; break; case 'Q': *(unsigned __int64*)(buf + size) = va_arg(args, unsigned __int64); size += 8; break; case 'b': len = va_arg(args, unsigned int); memcpy(buf + size, va_arg(args, void*), len); size += len; break; case 'S': wstr = va_arg(args, wchar_t*); if (wstr == 0) { len = 2; *(unsigned short int*) (buf + size) = 0; } else { len = wcslen(wstr) * 2 + 2; memcpy(buf + size, wstr, len); } size += len; break; } Format++; } va_end(args); true_UNetworkHandler_OutgoingPacket(This, "b", size, (int)buf); } |
Re: C++ перехват пакетов
Спасибо, все работает. (Так и знал, что где-то маленькая ошибка, которая все руинила -_-). Есть еще пара вопросов, но публиковать их не хочется, если не трудно - скиньте контакты в личку. спасибо.
|
Re: C++ перехват пакетов
void** UNetworkHandler_AddNetworkQueue = (void**)(hEngine + CalcOffset(0x20554600)); // ?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z 0x20554600 - helios void** UNetworkHandler_vftable = (void**)(hEngine + CalcOffset(0x2072E94C)); // ??_7UNetworkHandler@@6BUObject@@@ 0x2072E94C - helios 0x72D74C void** UNetworkHandler_OutgoingPacket = (void**)(hEngine + CalcOffset(0x2072DF98)); // 0x2072DF98 - helios 0x72CD98 char buf[1024]; /* [29384] UNetworkHandler_AddNetworkQueue Offset=0x20554600 [29384] UNetworkHandler_vftable Offset=0x2072e94c [29384] UNetworkHandler_OutgoingPacket Offset=0x2072df98 */ wsprintfA(buf, "UNetworkHandler_AddNetworkQueue Offset=0x%x", UNetworkHandler_AddNetworkQueue); OutputDebugStringA(buf); wsprintfA(buf, "UNetworkHandler_vftable Offset=0x%x", UNetworkHandler_vftable); OutputDebugStringA(buf); wsprintfA(buf, "UNetworkHandler_OutgoingPacket Offset=0x%x", UNetworkHandler_OutgoingPacket); OutputDebugStringA(buf); (FARPROC&)true_UNetworkHandler_OutgoingPacket = FARPROC(*UNetworkHandler_OutgoingPacket); OutputDebugStringA("true_UNetworkHandler_OutgoingPacket!"); (FARPROC&)UNetworkHandler_OutgoingPacket = (FARPROC)*UNetworkHandler_OutgoingPacket_hook; OutputDebugStringA("UNetworkHandler_OutgoingPacket_hook!"); void** incomming = (UNetworkHandler_vftable + 0x22); (FARPROC&)(incomming) = (FARPROC)*UNetworkHandler_IncommingPacket_hook; OutputDebugStringA("UNetworkHandler_IncommingPacket_hook!");Вот еще одна проблемка, код выполняется, но никакого перехвата нет и в помине, однако если пытаюсь сделать так: void** incomming = (UNetworkHandler_vftable + 0x22); *incomming = (void*)UNetworkHandler_IncommingPacket_hook;Получаю зависание при старте и соответственно ничего не работает. Где ошибка не могу понять, при этом на хф код работает нормально такой. |
Re: C++ перехват пакетов
Цитата:
Не понятно, что значит на хф работает? А где не работает? Добавлено через 3 минуты Хелиос надо отдельно смотреть, нужна анпакнутая engine.dll, и т п |
Re: C++ перехват пакетов
Начиная с хроник InfinityOdissey в экспорте engine.dll нет функций класса UNetworkHandler.
|
Re: C++ перехват пакетов
Цитата:
Добавлено через 1 минуту Цитата:
|
Re: C++ перехват пакетов
Цитата:
|
Re: C++ перехват пакетов
Цитата:
|
Re: C++ перехват пакетов
А можно поинтересоваться почему вы так привязаны к внедрению в движок игры, для ловли пакетов ?
Можно же на более низком уровне ловить их, по TCP,UDP, раскодировать их тем же самым способом, и тогда не нужно быть привязанным к разным адресам хроник. |
Re: C++ перехват пакетов
luslighter, Зачем выдирать посылку из почтового вагона на ходу, когда проще получить ее в почтовом отделении в распакованном виде?)
Правда, в абстрактное почтовое отделение приходится пробираться через форточку подвала :redlol: |
Текущее время: 11:56. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot