Ich habe eine Anwendung, die Winsock 2.0 recv
Funktion verwendet, und ich kann die Ausgabe von Redox Packet Editor zum Beispiel abfangen, bestätigt es, dass die Version 2.0 ist.Winsock recv hooking mit Detours
Ich habe diesen Code kann die Funktion Haken:
#define _CRT_SECURE_NO_DEPRECATE
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <WinSock2.h>
#include <detours.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
FILE *pSendLogFile;
FILE *pRecvLogFile;
int (WINAPI *pSend)(SOCKET s, const char* buf, int len, int flags) = send;
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags);
int (WINAPI *pRecv)(SOCKET s, char *buf, int len, int flags) = recv;
int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags);
INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hDLL);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pSend, MySend);
if(DetourTransactionCommit() == NO_ERROR)
MessageBox(0,"send() detoured successfully","asd",MB_OK);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pRecv, MyRecv);
if(DetourTransactionCommit() == NO_ERROR)
MessageBox(0,"recv() detoured successfully","asd",MB_OK);
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags)
{
MessageBox(0,"sent","sent",MB_OK);
return pSend(s, buf, len, flags);
}
int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags)
{
MessageBox(0,"recvd","recvd",MB_OK);
return pRecv(s, buf, len, flags);
}
Für send
, alles perfekt funktioniert, aber ich bekomme keine Ausgabe für recv
. Ich versuchte es in einer anderen Anwendung mit 1.1-Version von Winsock und es funktioniert in Ordnung. Versucht, WSARecv, WSARecvEx ohne Glück zu haken.
Überprüft die App mit WinAPIOverride32, es zeigt deutlich, dass es recv
Funktion verwendet, und meldet erfolgreich die Verwendung. Winsock Packet Editor liest die Daten auch gut.
Irgendwelche Ideen?
Mein Tipp: Schreiben Sie stattdessen einen LSP (Layered Service Provider).Wenn Sie eines der LSP-Samples modifizieren, werden Sie viel weiter und umfassender als das Hooking-Verfahren. Stellen Sie es sich als eine Benutzermodusalternative zu TDI-Treibern und -Freunden vor. – 0xC0000022L
Beliebiger Artikel oder Beispielcode für diesen LSP? Ich hoffe, es ist nicht so kompliziert. – methyl
Sicher, dieser ist immer noch größtenteils gültig: https://www.microsoft.com/msj/0599/layeredservice/layeredservice.aspx und natürlich: http://msdn.microsoft.com/en-us/ Bibliothek/Windows/Desktop/bb513664 (v = vs.85) .aspx – 0xC0000022L