2016-10-11 4 views
-1

Im machen eine Anwendung zu manipulieren senden und recv, tun es mit send war sehr einfach, aber ich kann nicht herausfinden, wie die recv fälschen oder zu ersetzen.Ändern Sie Pufferdaten von recv

Was ich versuche zu tun, ist zum Beispiel, wenn das Programm "Hello" empfängt, filtert es und macht das Programm glauben, dass es "Bye" empfangen. Hier

ist der Teil des Codes, wo ich versuche, die recv zu filtern:

int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags) 
{ 
     int i = 0; 
     int ret = pRecv(s, buf, len, flags); 
     while (i < ret && buf) 
     { 
     if (strncmp(buf, "Hello\0", 5) == 0) 
     {    
       strcpy(buf,"Bye\0"); 
     }// End of if 

     int len = strlen(buf) +1; 
     buf += len; 
     i += len; 
     }//End of While 
     return ret; 

}//End of Function 

Eigentlich diese Art von Arbeiten, versucht aber beim nächsten Aufruf zu tun, nachdem es "Hello" empfängt und das ist nicht die Absicht, ich möchte das tatsächliche Paket ersetzen, das "Hello" enthält und es zu "Bye"

+0

Sie müssen String-Terminatoren nicht explizit in konstante String-Literale setzen, sie werden dort automatisch von den Compilern eingefügt. –

+1

Das ist eine extrem komplexe Sache, und der Code, den Sie gezeigt haben, ist nicht annähernd so ähnlich wie das, was Sie tun würden. Wirf den Code weg. Versuchen Sie stattdessen, einen rationalen Algorithmus dafür zu entwickeln, wie Sie dies tun würden. Schreiben Sie nicht, bis Sie einen Algorithmus haben. Zum Beispiel, was machst du, wenn 'len' 1 ist? –

+0

Was Ihr Problem betrifft, hängt es sehr von Ihrem Betriebssystem ab. Es ist auch etwas, das nur sehr wenige Leute Ihnen empfehlen würden, anders als Sie es bereits tun. Kannst du uns bitte aufklären * warum * willst du es auf einer niedrigeren Ebene ändern? –

Antwort

-1

ändern Haken Sie die Funktion, indem Sie eine DLL einwerfen und diese ursprüngliche Funktion zu Ihrer Hakenfunktion umleiten. Hier ist ein Beispiel für meinen x86-Umleitungscode, den ich verwende.

const void* DetourFunc(BYTE* const src, const BYTE* dest, const DWORD length) 
{ 
    BYTE* jump = new BYTE[length + 5]; 
    for (int i = 0; i < sizeof(detourBuffer)/sizeof(void*); ++i) 
    { 
     if (!detourBuffer[i]) 
     { 
      detourBuffer[i] = jump; 
      break; 
     } 
    } 

    DWORD dwVirtualProtectBackup; 
    VirtualProtect(src, length, PAGE_READWRITE, &dwVirtualProtectBackup); 

    memcpy(jump, src, length); 
    jump += length; 

    jump[0] = 0xE9; 
    *(DWORD*)(jump + 1) = (DWORD)(src + length - jump) - 5; 

    src[0] = 0xE9; 
    *(DWORD*)(src + 1) = (DWORD)(dest - src) - 5; 

    VirtualProtect(src, length, dwVirtualProtectBackup, &dwVirtualProtectBackup); 

    return jump - length; 
} 

Wenn Sie es nicht herausfinden können, beginnen Sie besser zu erforschen.