Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   C++ перехват пакетов (https://forum.zone-game.info/showthread.php?t=41105)

Zubastic 25.07.2016 14:10

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++
Собственно почему в одном случае все работает, а в другом ошибка?)

Awiion 25.07.2016 20:28

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;
}


Zubastic 25.07.2016 21:08

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

flopix 25.07.2016 21:44

Re: C++ перехват пакетов
 
Какие хроники?

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

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

n3k0nation 25.07.2016 21:57

Re: C++ перехват пакетов
 
В true_* функциях пролог есть?

Zubastic 25.07.2016 22:03

Re: C++ перехват пакетов
 
Цитата:

Сообщение от n3k0nation (Сообщение 415661)
В true_* функциях пролог есть?

Шо це такое?
Чета вон вверху есть.

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

Сообщение от flopix (Сообщение 415658)
Какие хроники?

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

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

ХФ 273

n3k0nation 25.07.2016 22:13

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Zubastic (Сообщение 415662)
Шо це такое?
Чета вон вверху есть.

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

ХФ 273

like:
Код:

push ebp
mov ebp, esp
;далее твой джамп на функцию со смещением на 5 байт

И да. Корректно ли заменяются 5 байт на jmp near? Ибо пролога у функции может и не быть, что делает кучу гемороя, типа, написания дизассемблера длин и замена с помощью него + нопы, плюс учет стека, состояния регистров, бла-бла-бла

Zubastic 25.07.2016 23:02

Re: C++ перехват пакетов
 
Цитата:

Сообщение от n3k0nation (Сообщение 415665)
like:
Код:

push ebp
mov ebp, esp
;далее твой джамп на функцию со смещением на 5 байт

И да. Корректно ли заменяются 5 байт на jmp near? Ибо пролога у функции может и не быть, что делает кучу гемороя, типа, написания дизассемблера длин и замена с помощью него + нопы, плюс учет стека, состояния регистров, бла-бла-бла

Я же заменяю ссылку в vtable на метод. Зачем мне делать пролог?
Я понимаю если бы я экстил функцию в методе, тогда это имело смысл, а так какой смысл? Нет, конечно можно и так сделать, но это дополнительный геморрой, как ты описал.

flopix 25.07.2016 23:09

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;



Zubastic 25.07.2016 23:34

Re: C++ перехват пакетов
 
Хорошо, попробую.
Но у меня адрес находится верно в любом случае.

Zubastic 26.07.2016 00:09

Re: C++ перехват пакетов
 
Проверил, адреса совпадают.

flopix 26.07.2016 00:46

Re: C++ перехват пакетов
 
Если временно сделать так то отрабатывает без ошибок? понятно что пакеты не будут отправлены.

PHP код:

//Клиентские пакеты
int __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int Thischar *Format, ...)
{
    
//true_UNetworkHandler_OutgoingPacket(This, Format, ...);
    
return 0;



Zubastic 26.07.2016 00:50

Re: C++ перехват пакетов
 
Да, все нормально.

flopix 26.07.2016 14:01

Re: C++ перехват пакетов
 
И что такая конструкция прям так компилируется с троеточием в аргументах :eek:?
PHP код:

true_UNetworkHandler_OutgoingPacket(ThisFormat, ...); 

Функция sendPacket идет с переменным числом аргументов и есть нюансы. Попробуйте пока вызвать так:
PHP код:

//Клиентские пакеты
void __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int Thischar *Format, ...)
{
    
unsigned char buf[10240];
    
int size 0len;
    
wchar_t *wstr;

    
va_list args;
    
va_start(argsFormat);

    while (*
Format != 0)
    {
        switch (*
Format)
        {
            case 
'c':
                *(
unsigned char*) (buf size) = va_arg(argsunsigned char);
                
size++;
                break;
            case 
'h':
                *(
unsigned short int*) (buf size) = va_arg(argsunsigned short int);
                
size += 2;
                break;
            case 
'd':
                *(
unsigned int*) (buf size) = va_arg(argsunsigned int);
                
size += 4;
                break;
            case 
'Q':
                *(
unsigned __int64*) (buf size) = va_arg(argsunsigned __int64);
                
size += 8;
                break;
            case 
'b':
                
len va_arg(argsunsigned int);
                
memcpy(buf sizeva_arg(argsvoid*), len);
                
size += len;
                break;            
            case 
'S':
                
wstr va_arg(argswchar_t*);
                if (
wstr == 0)
                {
                    
len 2;
                    *(
unsigned short int*) (buf size) = 0;
                }
                else
                {
                    
len wcslen(wstr) * 2;
                    
memcpy(buf sizewstrlen);
                }
                
size += len;
                break;
        }
        
Format++;    
    }

    
va_end(args);

    
true_UNetworkHandler_OutgoingPacket(This"b"size, (int)buf);


Тем более для того что вы делаете это как раз понадобится. На выходе у вас готовый буфер с пакетом.

Zubastic 26.07.2016 14:58

Re: C++ перехват пакетов
 
Это псевдофункция. С тем, что у Вас - крит.

flopix 26.07.2016 15:05

Re: C++ перехват пакетов
 
А патч чистый или может с какой то защитой?

Persy 26.07.2016 15:22

Re: C++ перехват пакетов
 
а) Патч чистый.
б) Хватит копипастить код из шарных *Гвардов.

flopix 26.07.2016 15:23

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Persy (Сообщение 415711)
а) Патч чистый.
б) Хватит копипастить код из шарных *Гвардов.

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

Zubastic 26.07.2016 15:34

Re: C++ перехват пакетов
 
Возможно проблема в дллке клаба, проверим ка и эту теорию...
Вообще мне код обработки пакетов не нравится, он какой-то ущербный...

Zubastic 26.07.2016 16:48

Re: C++ перехват пакетов
 
Не помогло. Используем 273 протокол, патч от рпг клаба без system.dll

flopix 26.07.2016 17:27

Re: C++ перехват пакетов
 
Попробуйте пока что вместо вызова оригинальной функции выводить в лог ид пакета, строку Format, чтобы убедиться что вообще вызывается то что нужно с корректными данными.

Zubastic 26.07.2016 20:20

Re: C++ перехват пакетов
 
Вроде как идет нормально. Вообще как написать нормально вывод?) А то я в плюсах не особо.

flopix 26.07.2016 20:32

Re: C++ перехват пакетов
 
Например так:
PHP код:

MessageBoxA(0Format"SendPacket"MB_OK); 


f1redark 26.07.2016 20:50

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Zubastic (Сообщение 415632)
Собственно хочу сделать еще одну реинкарнацию пакетхака. На этот раз в виде длл, но возникла большая проблема:
 
int __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int This, char *Format, ...)
{
    true_UNetworkHandler_OutgoingPacket(This, Format, ...);
    return 0;
}
 
Code: C++
Собственно почему в одном случае все работает, а в другом ошибка?)

Это кривизна, и я честно не понимаю, как это вообще может скомпилироваться.

Zubastic 26.07.2016 21:24

Re: C++ перехват пакетов
 
Цитата:

Сообщение от f1redark (Сообщение 415743)
Это кривизна, и я честно не понимаю, как это вообще может скомпилироваться.

Еще раз: это псевдофункция, она и не должна компилиться. Я просто показал, что хочу пробросить пакеты. Как именно это сделать я не знаю (не прибегая к тому способу из ргварда, который описали выше).

Добавлено через 45 секунд
Цитата:

Сообщение от flopix (Сообщение 415741)
Например так:
PHP код:

MessageBoxA(0Format"SendPacket"MB_OK); 


Format выдаст CCCC ну или что-то такое. Мне же содержимое нужно, верно?

flopix 26.07.2016 21:36

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Zubastic (Сообщение 415745)
Format выдаст CCCC ну или что-то такое. Мне же содержимое нужно, верно?

Этого достаточно чтобы понять что приходит то что нужно.
То есть у вас проблема только в вызове оригинала. Как будто бы его адрес сохранен неверно.

f1redark 26.07.2016 21:42

Re: C++ перехват пакетов
 
Так в чем тогда ошибка? Я так и не увидел, как ты вызываешь оригинал.

Добавлено через 17 минут
Цитата:

Сообщение от flopix (Сообщение 415707)
И что такая конструкция прям так компилируется с троеточием в аргументах :eek:?
PHP код:

true_UNetworkHandler_OutgoingPacket(ThisFormat, ...); 

Функция sendPacket идет с переменным числом аргументов и есть нюансы. Попробуйте пока вызвать так:
PHP код:

//Клиентские пакеты
void __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int Thischar *Format, ...)
{
    
unsigned char buf[10240];
    
int size 0len;
    
wchar_t *wstr;

    
va_list args;
    
va_start(argsFormat);

    while (*
Format != 0)
    {
        switch (*
Format)
        {
            case 
'c':
                *(
unsigned char*) (buf size) = va_arg(argsunsigned char);
                
size++;
                break;
            case 
'h':
                *(
unsigned short int*) (buf size) = va_arg(argsunsigned short int);
                
size += 2;
                break;
            case 
'd':
                *(
unsigned int*) (buf size) = va_arg(argsunsigned int);
                
size += 4;
                break;
            case 
'Q':
                *(
unsigned __int64*) (buf size) = va_arg(argsunsigned __int64);
                
size += 8;
                break;
            case 
'b':
                
len va_arg(argsunsigned int);
                
memcpy(buf sizeva_arg(argsvoid*), len);
                
size += len;
                break;            
            case 
'S':
                
wstr va_arg(argswchar_t*);
                if (
wstr == 0)
                {
                    
len 2;
                    *(
unsigned short int*) (buf size) = 0;
                }
                else
                {
                    
len wcslen(wstr) * 2;
                    
memcpy(buf sizewstrlen);
                }
                
size += len;
                break;
        }
        
Format++;    
    }

    
va_end(args);

    
true_UNetworkHandler_OutgoingPacket(This"b"size, (int)buf);


Тем более для того что вы делаете это как раз понадобится. На выходе у вас готовый буфер с пакетом.

Этот код рабочий, если с ним не работает, берешь отладчик, ставишь бряк на свою функцию, и смотришь, как вызывается true функция, какие параметры, и что со стеком, ну и где падает конкретно, потому что иначе это гадание все.

Zubastic 26.07.2016 22:04

Re: C++ перехват пакетов
 
Цитата:

Сообщение от flopix (Сообщение 415747)
Этого достаточно чтобы понять что приходит то что нужно.
То есть у вас проблема только в вызове оригинала. Как будто бы его адрес сохранен неверно.

Там приходит все нормально...

Добавлено через 48 секунд
Цитата:

Сообщение от f1redark (Сообщение 415748)
Так в чем тогда ошибка? Я так и не увидел, как ты вызываешь оригинал.

Так и вызываю. Код и ргварда, в итоге крит с ошибкой ревив пакета.
Цитата:

Сообщение от f1redark (Сообщение 415748)
Этот код рабочий, если с ним не работает, берешь отладчик, ставишь бряк на свою функцию, и смотришь, как вызывается true функция, какие параметры, и что со стеком, ну и где падает конкретно, потому что иначе это гадание все.

Отлаживал длл, ничего интересного не получалось. Просто захожу в функцию и крит.

flopix 26.07.2016 22:11

Re: C++ перехват пакетов
 
Пробуйте с другим патчем. Возможно все таки тут не совсем он чистый и защите не нравится откуда вызывается функция true_UNetworkHandler_OutgoingPacket.

f1redark 26.07.2016 22:11

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Zubastic (Сообщение 415750)
Там приходит все нормально...

Добавлено через 48 секунд

Так и вызываю. Код и ргварда, в итоге крит с ошибкой ревив пакета.

Отлаживал длл, ничего интересного не получалось. Просто захожу в функцию и крит.

Как длл в процесс грузишь? В общем, скомпиль и кинь сюда, я гляну.

f1redark 27.07.2016 00:57

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Zubastic (Сообщение 415632)
Собственно хочу сделать еще одну реинкарнацию пакетхака. На этот раз в виде длл, но возникла большая проблема:
 
DWORD WINAPI InitThread(LPVOID)
{
...
    (FARPROC&)true_UNetworkHandler_OutgoingPacket = FARPROC(addr);
...
}
 
Code: C++
Собственно почему в одном случае все работает, а в другом ошибка?)

В общем, отдебажил так, адрес был левый, забыл ты разыменовать указатель из VMT, строка выше должна быть такой, тогда все нормально работает, даже с куском кода из rGuard.

 
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);
}
 
Code: C++

Zubastic 27.07.2016 02:01

Re: C++ перехват пакетов
 
Спасибо, все работает. (Так и знал, что где-то маленькая ошибка, которая все руинила -_-). Есть еще пара вопросов, но публиковать их не хочется, если не трудно - скиньте контакты в личку. спасибо.

Zubastic 31.07.2016 03:36

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!");
Code: C++
Вот еще одна проблемка, код выполняется, но никакого перехвата нет и в помине, однако если пытаюсь сделать так:
		void** incomming = (UNetworkHandler_vftable + 0x22);
		*incomming = (void*)UNetworkHandler_IncommingPacket_hook;
Code: C++
Получаю зависание при старте и соответственно ничего не работает. Где ошибка не могу понять, при этом на хф код работает нормально такой.

f1redark 31.07.2016 10:47

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Zubastic (Сообщение 416081)
		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!");
Code: C++
Вот еще одна проблемка, код выполняется, но никакого перехвата нет и в помине, однако если пытаюсь сделать так:
		void** incomming = (UNetworkHandler_vftable + 0x22);
		*incomming = (void*)UNetworkHandler_IncommingPacket_hook;
Code: C++
Получаю зависание при старте и соответственно ничего не работает. Где ошибка не могу понять, при этом на хф код работает нормально такой.



Не понятно, что значит на хф работает? А где не работает?

Добавлено через 3 минуты
Хелиос надо отдельно смотреть, нужна анпакнутая engine.dll, и т п

flopix 31.07.2016 11:25

Re: C++ перехват пакетов
 
Начиная с хроник InfinityOdissey в экспорте engine.dll нет функций класса UNetworkHandler.

Zubastic 31.07.2016 11:37

Re: C++ перехват пакетов
 
Цитата:

Сообщение от f1redark (Сообщение 416091)
Не понятно, что значит на хф работает? А где не работает?

Добавлено через 3 минуты
Хелиос надо отдельно смотреть, нужна анпакнутая engine.dll, и т п

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

Добавлено через 1 минуту
Цитата:

Сообщение от flopix (Сообщение 416093)
Начиная с хроник InfinityOdissey в экспорте engine.dll нет функций класса UNetworkHandler.

Это понятно, поэтому я просто ищу по смещению. engine.dll анпакнута. Сравнивал оффсеты моей функции и той, что я получаю вычислением - адреса совпадают. Т.е. я получаю именно то, что мне нужно. Но при попытке записи туда - зависание.

flopix 31.07.2016 12:00

Re: C++ перехват пакетов
 
Цитата:

Сообщение от Zubastic (Сообщение 416094)
поэтому я просто ищу по смещению. engine.dll

а где гарантия что смещения в HF и в новых хрониках совпадают. В класс UNetworkHandler в любом случае были добавлены новые методы.

Zubastic 31.07.2016 13:14

Re: C++ перехват пакетов
 
Цитата:

Сообщение от flopix (Сообщение 416096)
а где гарантия что смещения в HF и в новых хрониках совпадают. В класс UNetworkHandler в любом случае были добавлены новые методы.

Я их вычислил самостоятельно. Все совпадает :)

luslighter 31.07.2016 13:49

Re: C++ перехват пакетов
 
А можно поинтересоваться почему вы так привязаны к внедрению в движок игры, для ловли пакетов ?

Можно же на более низком уровне ловить их, по TCP,UDP, раскодировать их тем же самым способом, и тогда не нужно быть привязанным к разным адресам хроник.

Persy 31.07.2016 13:56

Re: C++ перехват пакетов
 
luslighter, Зачем выдирать посылку из почтового вагона на ходу, когда проще получить ее в почтовом отделении в распакованном виде?)

Правда, в абстрактное почтовое отделение приходится пробираться через форточку подвала :redlol:


Текущее время: 11:56. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot