Winsock Hook na recv()

0

Witam,
Próbuje założyć hooka na funkcje recv() w grze, chce otrzymać pakiety jakie ta gra otrzymuje z serwera. Od razu mówie, nie jest moim zamiarem kraść czyjeś hasła, ID itd. zresztą jak, jeżeli to jest podsłuch na recv() nie send.
Wcześniej działał taki sposób:

#define INST_JMP 0xe9
DWORD RecvMain = 0x0050F010; // adres funkcji gdzie jest wywołanie recv()
DWORD RecvBack = RecvMain + 0x19; // adres gdzie parametry są przekazywane dalej w callu


DWORD Intercept(int instruction, DWORD lpSource, DWORD lpDest, int len)
{
	DWORD realtarget;
	LPBYTE buffer = new BYTE[len];

	memset(buffer,0x90,len); 

	if (instruction != INST_NOP && len >= 5)
	{
		buffer[(len-5)] = instruction;
		DWORD dwJMP = (DWORD)lpDest - (lpSource + 5 + (len-5));
		memcpy(&realtarget,(void*)(lpSource+1),4);
		realtarget = realtarget+lpSource+5;
		memcpy(buffer + 1 + (len-5),&dwJMP,4);
	}
	if (instruction == SHORT_JZ)
	{
		buffer[0]=instruction;
		buffer[1]=(BYTE)lpDest;
	}
	if (instruction == INST_BYTE)
	{
		buffer[0]=(BYTE)lpDest;
	}
	MemcpyEx(lpSource, (DWORD) buffer, len);
	delete[] buffer;
	return realtarget;
}

int WINAPI GetPackets(char* packet)
{
	// tutaj można sobie zapisać pakiety np. do pliku	
}


void Naked RecvHook()
{  //sub_50F010
	__asm
	{
		push	ebp
		mov		ebp, esp
		sub		esp, 8
		
		mov		[ebp-8],ecx
		mov		eax,[ebp+0x14]
		push	eax
		
		mov		ecx,[ebp+0x10]
		push	ecx
		
		mov		edx,[ebp+0xC]
		mov		buf2,edx
		push	edx

		
		mov     eax,[ebp+8]
		push    eax

		push eax
		push ecx
		push edx
		

	}
	GetPackets(buf2);
	__asm 
	{
		pop edx
		pop ecx
		pop	eax	
		jmp RecvBack
	}
}

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
	if (reason == DLL_PROCESS_ATTACH)
	{
		// podmiana kodu funkcji na recvhook
		Intercept(INST_JMP,RecvMain,(DWORD)&RecvHook,5);
	}

}

Jednak teraz jest on wykrywany przez aplikacje chroniącą gre zwaną HackShield.

Otrzymałem wskazówki, że trzeba zrobić hooka przez WS2_32.dll.

sub_50F010 proc near

var_8= dword ptr -8
var_4= dword ptr -4
arg_0= dword ptr  8
arg_4= dword ptr  0Ch
arg_8= dword ptr  10h
arg_C= dword ptr  14h

push    ebp
mov     ebp, esp
sub     esp, 8
mov     [ebp+var_8], ecx
mov     eax, [ebp+arg_C]
push    eax
mov     ecx, [ebp+arg_8]
push    ecx
mov     edx, [ebp+arg_4]
push    edx
mov     eax, [ebp+arg_0]
push    eax
call    ds:dword_6A245C
mov     [ebp+var_4], eax
cmp     [ebp+var_4], 0FFFFFFFFh
jnz     short loc_50F05D

Chciałbym, żeby przed:
call ds:dword_6A245C
moja funkcja otrzymała dane, jakie są wysyłane do tego calla, czyli 4 parametry.

Zrobiłem taki myk, że podmieniłem pointer wywoływanej funkcji 0x006A245C (ds:dword_6A245C) moją funkcją.
Otrzymam zawsze jeden pakiet, a potem komunikat: "Connection lost with server".
Nic dziwnego, bo oryginalnie dane szły do funkcji pod pointerem 0x006A245C, a ten pointer wskazywał na jeszcze jeden, prawdopodobnie od programu HackShield, wiec zawsze raz otrzymywałem pakiet, a potem gra się krzaczyła.

Macie jakieś pomysły jak pakiet przekazać do mojej funkcji i sprawić by został dalej obsłużony czyli:

call    ds:dword_6A245C
mov     [ebp+var_4], eax
cmp     [ebp+var_4], 0FFFFFFFFh
jnz     short loc_50F05D

Wrzucam rozkapowany (a był spakowany Armadillem) silnik gry.
IDA bardzo dobrze współpracuje z nim ;)
http://rapidshare.com/files/270832305/engine.zip.html

0

Czy ktoś jest w stanie pomóc?

0

2 strony dalej jest taki sam temat....

1 użytkowników online, w tym zalogowanych: 0, gości: 1