Pakete in detoured WSASend blocken?
-
Hi!
Also ich habe WSASend mit detours gehooked und kann es natürlich callen um die funktion normal laufen zu lassen. Nun möchte ich allerdings einige pakete, nach bestimmten kriterien, nicht senden sondern "blocken".WSASend returned 0 wenn alles glatt gelaufen ist, ironischer weise wartet der aufrufende code anscheinend auf irgendetwas wenn ich 0 returne und verzögert damit alle verbindungen bis sie schließlich geschlossen werden. Das passiert auch wenn ich -1 oder sonst irgend einen fehlercode von WSASend returne ..
code:
int WINAPI myWSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) { if(lpBuffers->buf[2] == 0x66 && lpBuffers->buf[3] == 0x78) { FILE *fp = fopen("party_sploit.txt", "a"); fprintf(fp, "0x7866 catched! len: %lu\n", lpBuffers->len); for (unsigned int i = 0; i < lpBuffers->len-8; i = i + 8) { fprintf(fp, "%02X %02X %02X %02X %02X %02X %02X %02X" "\t\t%c %c %c %c %c %c %c %c\n", static_cast<unsigned char>(lpBuffers->buf[i]), static_cast<unsigned char>(lpBuffers->buf[i+1]), static_cast<unsigned char>(lpBuffers->buf[i+2]), static_cast<unsigned char>(lpBuffers->buf[i+3]), static_cast<unsigned char>(lpBuffers->buf[i+4]), static_cast<unsigned char>(lpBuffers->buf[i+5]), static_cast<unsigned char>(lpBuffers->buf[i+6]), static_cast<unsigned char>(lpBuffers->buf[i+7]), (drawable(lpBuffers->buf[i])) ? static_cast<unsigned char>(lpBuffers->buf[i]) : '.', (drawable(lpBuffers->buf[i+1])) ? static_cast<unsigned char>(lpBuffers->buf[i+1]) : '.', (drawable(lpBuffers->buf[i+2])) ? static_cast<unsigned char>(lpBuffers->buf[i+2]) : '.', (drawable(lpBuffers->buf[i+3])) ? static_cast<unsigned char>(lpBuffers->buf[i+3]) : '.', (drawable(lpBuffers->buf[i+4])) ? static_cast<unsigned char>(lpBuffers->buf[i+4]) : '.', (drawable(lpBuffers->buf[i+5])) ? static_cast<unsigned char>(lpBuffers->buf[i+5]) : '.', (drawable(lpBuffers->buf[i+6])) ? static_cast<unsigned char>(lpBuffers->buf[i+6]) : '.', (drawable(lpBuffers->buf[i+7])) ? static_cast<unsigned char>(lpBuffers->buf[i+7]) : '.' ); } fprintf(fp, "\n-------------------------------------------------------------------\n"); fclose(fp); if(lpBuffers->len < 26) { lpNumberOfBytesSent = (LPDWORD)lpBuffers->len; return 0; } else { return (oWSASend)(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine); } } else { //No filtered packet recieved, proceed return (oWSASend)(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine); } }
danke im voraus für alle antworten
greetz
-
Wo ist hier eine Frage zu C++?
-
Wenn du einen Exploit blockieren willst, müsstest du doch eigentlich WSARecv blockieren und nicht WSASend?!?
-
@detected:
der gameserver läuft über mehrere server module die untereinander mit WSASend kommunizieren, der angreifer schickt sein exploit paket (welches ich leider nicht rausfinden kann) an die "Agentserver.exe", diese wiederum schickt ein internes paket an die "Gameserver.exe" die "Gameserver.exe" führt daraufhin eine abfrage in der datenbank aus und schickt ein update paket an die "Shardmanager.exe" dieses update paket hat den opcode 0x7866.
Das Paket 7866 ist ein paket, was normalerweise für sog. party invites benutzt wird und enthält den namen des Party Leaders und den namen desjenigen der in die party eingeladen wurde, und ausserdem deren ids und die Gildennamen. Alles zusammen kommt bei einem normalen paket auf mindestens 35 Bytes. Das 0x7866 Paket des exploits allerdings enthält keine dieser angaben und kommt damit auf weniger als 26 bytes. (Warum genau das so ist weiß ich leider selbst nicht.. habe den source der gameserver module leider nicht sonst bräuchte ich keinen hook ^^) Die "Shardmanager.exe" bemerkt dass mit dem paket was nicht stimmt und schließt (übertriebener weise) alle offenen verbindungen.Um dieses verhalten also zu verhindern möchte ich verhindern dass die "Gameserver.exe" das paket 0x7866 mit einer länge von weniger als 26 bytes an die "Shardmanager.exe" schickt.
Aber woher weißt du, dass es sich um einen exploit handelt? ^^
@manni66:
habe keine bessere Sektion gefunden, eine sektion zu Winsock programmierung gibts ja leider nicht.. wo würde es denn besser hin passen?
-
Windows API
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
oh, das WinAPI forum hab ich garnich gesehen
sorry mein fehler hab mich schon gewundert wo das abgeblieben is ... also zurück zur frage, weiß jemand rat?
-
Karlson schrieb:
Aber woher weißt du, dass es sich um einen exploit handelt? ^^
party_sploit.txt
-
ah, ja klingt plausiebel .. also weiß nun jemand wie man das paket blocken kann oder nich?
-
Hmm, hab sowas irgendwann mal gemacht.
Wenn du auf den Buffer zugreifst (lpBuffers->buf[2]), solltest du vorher die Länge checken.
Wenn die Funktion aufgerufen wird: Welcher Parameter ist Null, lpNumberOfBytesSent oder lpOverlapped?
Wenn lpOverlapped, dann versuchs mal mit:
*lpNumberOfBytesSent = bufSize; // als wäre nix passiert...
return 0;
-
Abgesehen dass hier ein Sternderl (und eine if-not-null Abfrage) fehlt:
if(lpBuffers->len < 26) {// v------ hier lpNumberOfBytesSent = (LPDWORD)lpBuffers->len; return 0; }
machst du das schon richtig.
Ich vermute das Problem wird sein, dass der Prozess der diese Nachricht abschickt dann auf ne Antwort wartet. Die er natürlich nie bekommt, weil du die Nachricht ja blockiert hast.ps: Der Socket könnte das WSA_FLAG_OVERLAPPED Flag gesetzt haben. In dem Fall wird alles etwas komplizierter. Da kann ich dir auch nicht auswenig sagen was du machen müsstest um dem Programm vorzumachen dass die Operation erfolgreich abgeschlossen wurde.
-
dereferenzierung .... crap das is ja ein pointer <.< das wars danke ich war blind
-
BTW: Eigentlich hat dir der Compiler schon gesagt dass hier was nicht passt. Indem er die Zuweisung verweigert hat.
Statt zu gucken warum der Compiler rummosert hast du halt einfach nen Cast hingeschrieben.
=> Gewöhn dir ab einfach so Casts irgendwo hin zu schreiben. Man muss in C++ nämlich überraschend selten Casten. Lieber gucken warum der Compiler da meckert - dann merkt man in so einem Fall auch schnell dass man was vergessen hat.