Показать сообщение отдельно
Непрочитано 27.07.2016, 00:57   #31
Пользователь

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

Цитата:
Сообщение от 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++
f1redark вне форума Ответить с цитированием
Сказали спасибо: