Цитата:
Сообщение от Zubastic
Собственно хочу сделать еще одну реинкарнацию пакетхака. На этот раз в виде длл, но возникла большая проблема:
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++