Сообщений: 78
Тем: 0
Зарегистрирован: May 2015
Репутация:
577
Zubastic Написал:Собственно хочу сделать еще одну реинкарнацию пакетхака. На этот раз в виде длл, но возникла большая проблема:
[SRC="c++"]
DWORD WINAPI InitThread(LPVOID)
{
...
(FARPROC&)true_UNetworkHandler_OutgoingPacket = FARPROC(addr);
...
}
[/SRC]
Собственно почему в одном случае все работает, а в другом ошибка?)
В общем, отдебажил так, адрес был левый, забыл ты разыменовать указатель из VMT, строка выше должна быть такой, тогда все нормально работает, даже с куском кода из rGuard.
[SRC="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);
}
[/SRC]
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Спасибо, все работает. (Так и знал, что где-то маленькая ошибка, которая все руинила -_-). Есть еще пара вопросов, но публиковать их не хочется, если не трудно - скиньте контакты в личку. спасибо.
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
[SRC="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!");[/SRC]
Вот еще одна проблемка, код выполняется, но никакого перехвата нет и в помине, однако если пытаюсь сделать так:
[SRC="c++"] void** incomming = (UNetworkHandler_vftable + 0x22);
*incomming = (void*)UNetworkHandler_IncommingPacket_hook;[/SRC]
Получаю зависание при старте и соответственно ничего не работает. Где ошибка не могу понять, при этом на хф код работает нормально такой.
Сообщений: 78
Тем: 0
Зарегистрирован: May 2015
Репутация:
577
07-31-2016, 10:47 AM
(Сообщение последний раз редактировалось: 07-31-2016, 10:51 AM f1redark.)
Zubastic Написал:[SRC="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!");[/SRC]
Вот еще одна проблемка, код выполняется, но никакого перехвата нет и в помине, однако если пытаюсь сделать так:
[SRC="c++"] void** incomming = (UNetworkHandler_vftable + 0x22);
*incomming = (void*)UNetworkHandler_IncommingPacket_hook;[/SRC]
Получаю зависание при старте и соответственно ничего не работает. Где ошибка не могу понять, при этом на хф код работает нормально такой.
Не понятно, что значит на хф работает? А где не работает?
Добавлено через 3 минуты
Хелиос надо отдельно смотреть, нужна анпакнутая engine.dll, и т п
Сообщений: 561
Тем: 44
Зарегистрирован: Sep 2011
Репутация:
412
Начиная с хроник InfinityOdissey в экспорте engine.dll нет функций класса UNetworkHandler.
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
07-31-2016, 11:37 AM
(Сообщение последний раз редактировалось: 07-31-2016, 11:38 AM Zubastic.)
f1redark Написал:Не понятно, что значит на хф работает? А где не работает?
Добавлено через 3 минуты
Хелиос надо отдельно смотреть, нужна анпакнутая engine.dll, и т п Есть клиент рпг клаба, на котором я тренировался. Захукал отправку и прием. Все перехватывается, можно пилить. Сейчас сделал тоже самое для хелиоса, однако клиент просто виснет.
Добавлено через 1 минуту
flopix Написал:Начиная с хроник InfinityOdissey в экспорте engine.dll нет функций класса UNetworkHandler. Это понятно, поэтому я просто ищу по смещению. engine.dll анпакнута. Сравнивал оффсеты моей функции и той, что я получаю вычислением - адреса совпадают. Т.е. я получаю именно то, что мне нужно. Но при попытке записи туда - зависание.
Сообщений: 561
Тем: 44
Зарегистрирован: Sep 2011
Репутация:
412
Zubastic;416094 Написал:поэтому я просто ищу по смещению. engine.dll а где гарантия что смещения в HF и в новых хрониках совпадают. В класс UNetworkHandler в любом случае были добавлены новые методы.
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
flopix Написал:а где гарантия что смещения в HF и в новых хрониках совпадают. В класс UNetworkHandler в любом случае были добавлены новые методы. Я их вычислил самостоятельно. Все совпадает
Сообщений: 57
Тем: 0
Зарегистрирован: May 2016
А можно поинтересоваться почему вы так привязаны к внедрению в движок игры, для ловли пакетов ?
Можно же на более низком уровне ловить их, по TCP,UDP, раскодировать их тем же самым способом, и тогда не нужно быть привязанным к разным адресам хроник.
Сообщений: 185
Тем: 4
Зарегистрирован: Sep 2012
Репутация:
1,372
luslighter, Зачем выдирать посылку из почтового вагона на ходу, когда проще получить ее в почтовом отделении в распакованном виде?)
Правда, в абстрактное почтовое отделение приходится пробираться через форточку подвала :redlol:
|