Winsock Hook na recv()

Odpowiedz Nowy wątek
2009-08-24 11:19
0

Witam,
Próbuje założyć hooka na funkcje recv() w grze, chce otrzymać pakiety jakie ta gra otrzymuje z serwera. Odrazu 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


www.pcmod.pl - Forum o tematyce komputerowej. Diagnostyka, naprawa, overclocking, software.

Pozostało 580 znaków

2009-08-26 16:30
0

Czy ktoś jest w stanie pomóc?


www.pcmod.pl - Forum o tematyce komputerowej. Diagnostyka, naprawa, overclocking, software.

Pozostało 580 znaków

2009-08-27 18:22
_pejotr
0

2 strony dalej jest taki sam temat....

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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