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