buffer von gehookter send funktion auslesen??



  • Hallo.
    Ich habe in einem Programm send mit detours gehookt und möchte nun überprüfen ob im buffer überprüfen ob ein bestimmtes packet gesendet wird. Und wenn dem so is, soll erstmal nichts gemacht werden, wenn nicht soll alles normal laufen...

    die packets werden in einem char array gesendet.
    habe dazu folgenden code:

    #include <WinSock2.h>
    #include <windows.h>
    #include <detours.h>
    
    #pragma comment(lib, "detours.lib")
    #pragma comment(lib, "Ws2_32.lib")
    
    typedef int (WINAPI * tSend)(SOCKET s, char *buf, int len, int flags);
    tSend oSend = NULL;
    
    int WINAPI mySend(SOCKET s, char *buf, int len, int flags)
    {
    	if ( buf[9] == 0xD0 &&
    		 buf[10] == 0x8B &&
    		 buf[11] == 0x9A &&
    		 buf[12] == 0x93 &&
    		 buf[13] == 0x9A &&
    		 buf[14] == 0x97 &&
    		 buf[15] == 0x9E &&
    		 buf[16] == 0x9C &&
    		 buf[17] == 0x94 ) {
    		return NULL;
    	} else {
    		return (*oSend)(s, buf, len, flags);
    	}
    }
    
    BOOL WINAPI DllMain(HANDLE HDllHandle, DWORD reason, LPVOID Reserved)
    {
    	if(DLL_PROCESS_ATTACH == reason)
    	{
    		oSend = reinterpret_cast<tSend>(DetourFunction((PBYTE)&send, (PBYTE)&mySend));
    	}
    	return TRUE;
    }
    

    das problem ist nun dass wenn dieses bestimmte packet gesendet wird, das nich erkannt wird ... der compiler sagt nix und an den stellen im array liegts auch nich... weiss jemand rat??

    danke im voraus



    1. Du solltest die Länge prüfen, bevor du hier munter "buf" dereferenzierst.
    2. send() ist nicht die einzige Funktion zum senden, da gibt's noch einige andere.
    3. Du solltest vielleicht nicht gerade NULL zurückgeben (wieso überhaupt NULL, ist ja kein Zeiger...?), denn damit rechnet normalerweise kein Programm (ausser len ist null).

    Davon abgesehen helfen Trace-Messages oft recht gut, wenn's mit Debugger anhängen aus irgendeinem Grund nicht klappt.



  • zu 1) was?
    zu 2) es wird in dem programm ausschlieslich mit send() und recv() gearbeitet .. SendTo(), RecvFrom(), WSASend(), WSASendTo(), WSARecv() und WSARecvFrom werden nicht benutzt
    zu 3) mit NULL wird das senden des packets nicht ausgeführt .. wenn ich statt dem textinhalt nach dem OP Code des packets suche funktioniert es .. wenn dann ein text im chat geschrieben wird, wird es nicht gesendet aber dann is es egal welcher test .. es soll aber nur ein bestimmter text nicht gesendet werden ..



  • ad 1) "buf" muss nicht auf einen Speicherbereich zeigen, wo auch wirklich 18 oder mehr Byte liegen. Wenn du, ohne "len" vorher zu prüfen, einfach auf Byte #9 bis #17 zugreifst, dann könnte es knallen (Access Violation).

    ad 2) aha

    ad 3) wenn du dem Programm vortäuschen willst, dass alles gesendet wurde, dann solltest du "len" zurückgeben, und nicht 0. 0 ist Unfug. send() kann niemals 0 zurückliefern, ausser wenn "len" als 0 übergeben wurde.

    int WINAPI mySend(SOCKET s, char *buf, int len, int flags)
    {
        if (len > 17 &&
            buf[9] == 0xD0 &&
            buf[10] == 0x8B &&
            buf[11] == 0x9A &&
            buf[12] == 0x93 &&
            buf[13] == 0x9A &&
            buf[14] == 0x97 &&
            buf[15] == 0x9E &&
            buf[16] == 0x9C &&
            buf[17] == 0x94)
        {
            return len;
        }
        else
            return (*oSend)(s, buf, len, flags);
    }
    

    wenn ich statt dem textinhalt nach dem OP Code des packets suche funktioniert es .. wenn dann ein text im chat geschrieben wird, wird es nicht gesendet aber dann is es egal welcher test

    Was für ein OP Code? Huch?
    Naja, egal. Was soll das überhaupt für ein Text sein? 0x8B, 0x9A, ... lauter Sonderzeichen. Oder was für ein Encoding wird da verwendet?



  • es kommt aber nicht zu einer Acces Violation .. es wird einfach trotzdem gesendet..

    hab ich vergessen ^^ jedes byte ausser die länge des packets (Byte 1 und 2) und der OP Code (Byte 3 und 4) werden mit Xor FF verschlüsselt ..

    der OP code steht in dem code nich drin weil ich da nich nach suche .. ich habs jetzt mal anders probiert .. das selbe problem:

    int WINAPI mySend(SOCKET s, char *buf, int len, int flags)
    {
    	if ( buf[2] == 0x09 && buf[3] == 0x0A ) { //wenn es ein chat packet is
    		if ( buf[9] == 0xD0 && buf[10] == 0x9E ) { //überprüfe ob "/a" drin steht
    			return NULL; /*wenn ja dann nicht senden*/  } else { 
    				return (*oSend)(s, buf, len, flags); } //ansonsten sende es
    	} else {
    		return (*oSend)(s, buf, len, flags); //wenn es kein chat packet is, sende es trotzdem
    	}
    }
    

    buf[2] == 0x09 && buf[3] == 0x0A <-- OP Code

    es wird aber trotzdem alles gesendet .. auch wenn ich "/a" in den chat schreibe ...



  • achja .. da das packet ja in einem char array gesendet wird, entspricht Byte 3 natürlich buf[2] und Byte 4 buf[3]



  • okay .. mir wurde grade weiß gemacht dass das theoretisch keine OP Codes sind auch wenn sie bezeichnen was mit dem packet gemacht werden soll (ich wusste nur dass OP Code operation code heisst und dachte das passt :P)



  • (mal so nebenbei es is kacke dass ich meine posts nich bearbeiten kann xD)

    also wenn ich len zurückgeben lasse funktionierts auch nicht .. und zwar weil die MySend() funktion NUR eine send funktion ist, wenn sie send zurück gibt .. die funktion ist von mir definiert, das heisst es gibt keinen bestimmten rückgabewert



  • weiss keiner mehr rat? oder is einfach keiner mehr on xD



  • Jetzt hast du schon wieder NULL zurückgegeben.
    Schreib halt mal die Daten in ne Datei und schau, ob es die richtigen sind.
    Dann kann bei einem compare eigentlich wenig schief gehen...



  • Polko schrieb:

    weiss keiner mehr rat? oder is einfach keiner mehr on xD

    Im WinAPI-Forum gäbe es vielleicht mehr Interesse.



  • oh warum sagt mir denn keiner dass ich im falschen forum bin xD


Anmelden zum Antworten