Mam pewną aplikację, której to pakiety podsłuchuje poprzez hooka (MS Detours na recv()). Pakiety nie są niczym szyfrowane.
Niestety przychodzi strasznie dużo syfu, który trzeba filtrować (czasem pakiety się powtarzają, a czasem przychodzą z takimi dziwnymi wartościami, że szok), nie zawsze sie da, więc moja aplikacja która czyta te pakiety czasem posiada pewne przekłamania.
Nie rozumiem dlaczego tak się dzieje zresztą, ale wpadłem na genialny pomysł, żeby napisać proxy server, który będzie pośredniczył w całym połączeniu klient<->serwer i na proxym odbiore jakieś pakiety.

Aby zmusić aplikacje do łączenia z moim proxy, a nie serwerem bezpośrednio założyłem hooka na WSAConnect() w tej aplikacji i zmieniłem adres serwera na 127.0.0.1.
Napisałem proxy server, który to pośredniczy w transmisji pomiędzy klientem, a serwerem.

Ku mojemu zdziwieniu to co serwer proxy otrzymuje od sewera aplikacji jest różne od tego co aplikacja odbiera, a w zasadzie to co ja widzę na MS Detour hooku na recv().

Pierwsze dwa bajty są takie same na proxy i hooku, jest to rozmiar pakietu typu DWORD.

Trzeci bajt to nagłówek pakietu, a pozostałe to już sam pakiet. Niestety one są już różne.

Czyli jeszcze raz. Proxy otrzymuje pewne dane od serwera, odbiera je metodą recv(), następnie zapisuje je do pliku i w tym samym jeszcze wątku wysyła do aplikacji metodą send().
Aplikacja odbiera dane metodą recv() na którą założony jest hook.
Moja podmieniona funkcja zapisuje również pakiet do pliku.
I tak jak wyżej napisałem, pakiety są różne.

Kilka sekund aplikacji wygenerowało 195KB plik ze zrzutu z hooka recv().
Przy zrzutu pakietów z proxy plik zajmuje 17KB.

Zrzut pierwszych dziesięciu pakietów z hooka:

Recv - 57002ac48e3e340c7b5e724b956d734b61f6f7070004000080010000011202331828311c98be95b8839d9c9aae89ae83a3b39eabbc938296a2f6d0c2fbedf3fbf2c0e7fdc0cdddf0f0d2fdf3eccc83a898dbf632110100
Recv - 57002ac48e3e340c7b5e724b956d734b61f6f7070004000080010000011202331828311c98be95b8839d9c9aae89ae83a3b39eabbc938296a2f6d0c2fbedf3fbf2c0e7fdc0cdddf0f0d2fdf3eccc83a898dbf632110100
Recv - 03001e
Recv - 03001e
Recv - 04002b01
Recv - 04002b01
Recv - 2b018e3e340c7b5e724b956d734b61f6f7070004000080010000011202331828311c98be95b8839d9c9aae89ae83a3b39eabbc938296a2f6d0c2fbedf3fbf2c0e7fdc0cdddf0f0d2fdf3eccc83a898dbf63211010000...
Recv - 9501034a38ad4e6271d32d3f4870116e15f62ffb51eebb95efc1eb1ed00c495f16e457fedcba987654321000000000000000000000000000000000000000000000...
Recv - 9501034a38ad4e6271d32d3f4870116e15f62ffb51eebb95efc1eb1ed00c495f16e457fedcba98765432100000000000000000000000000000000000000000000000000...
Recv - 9501034a38ad4e6271d32d3f4870116e15f62ffb51eebb95efc1eb1ed00c495f16e457fedcba98765432100000000000000000000000000000....

Zrzut pierwszych dziesięciu pakietów z proxy:

Recv - 57005a4905be0d64aad23a089ec00108d78d248e91d99191650c91910c48e1d1a1ff44c897149e6fe8a91cb3a66ea6e82f525ed89da4c1ba428d9f663c7eec3caf15bcf71589c62929e3f7ec6dade8e797028d36000c91
Recv - 030068
Recv - 04003601
Recv - 95018c636b69401e4a62c837dffc23339af92f1dfcf7318e1b40bd2591315efa725aa860ac52e6ea66637f897e3b353316218f739b16ce806c8f46d3c217aa8ff45681739b...
Recv - 2a00f9085998f1a58e3858877e4cb899b6fc127613368d5455f30c395d8b847d62a7c9794f593f2b1d77
Recv - 04002263
Recv - 0800ecce30dcfddf
Recv - 64005867e7895db56e83799d96a3f46b184af950bc4b45a0123c6b8054abf725a69c1ade71d5638d6bda83f2c98f71cc2fd0f61b71cd9f15ed21ae8b78c3d91af283ffe294327d6b688cd028ce19ad30b2944811729c61e8da4a6d6449277571c4bc1563
Recv - 64005867e7895db56e83799d96a3f46b184af950bc4b45a0123c6b8054abf725a69c1ade71d5638d6bda83f2c98f71cc2fd0f61b71cd9f15ed21ae8b78c3d91af283ffe294327d6b688cd028ce19ad30b2944811729c61e8da4a6d6449277571c4bc1563
Recv - 440007f47f03adcb5fd7a21692f6e704436a7484a802de77ad6cd0b64b14f02cfcbf69bda350db57782880aaf7fb48293d5373275b5e72959ee79f674f90665a10a2f063

Pierwszy pakiet tzw. welcome packet w przypadku hooka tam gdzie ma bajty 0x00 to na zrzucie z proxy ma 0x91. I to zawsze za każdym uruchomieniem aplikacji. Nie zmienia się to.
To tyle co byłem w stanie opisać, a teraz proszę was pomóżcie bo zgłupiałem.
poza tym jak widać, hook odbiera dwa takie welcome pakiety i już na początku widać, że pakiety tutaj i tutaj troche inaczej wyglądają.

  1. Dlaczego hook generuje więcej pakietów niż przez sam proxy przechodzi? Moja oddzielna aplikacja analizując te pakiety musi stosować wiele instrukcji warunkowych, żeby wykluczyć wadliwe pakiety, a i tak czasem znajdzie się wadliwy pakiet, który przejdzie przez mój filtr.
    Oczywiście próbowałem też założyć hooka nie przez MS Detours, a ASM. Wynik był ten sam, wadliwe pakiety.

  2. Dlaczego pakiety z jednej trasy, tylko odczytane w dwóch różnych bliskich sobie miejscach są różne?

EDIT:
Przyciąłem troche pakiety, bo temat się bardzo mocno rozjeżdżał.

EDIT2:
Wychodzi na to, że recv() recvovi() nie jest równy.
Faktycznie na proxy są szyfrowane gdzie na tym drugim nie.
Szyfr rozgryzłem.