我有一個應用程序,它使用Winsock 2.0 recv
函數,我可以通過Redox Packet Editor捕獲輸出,例如,它確認版本是2.0。Winsock recv hooking Detours
我有這樣的代碼掛鉤函數:
#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);
}
對於send
,一切完美,但我沒有得到任何輸出recv
。我嘗試使用1.1版Winsock的另一個應用程序,它工作正常。試圖掛鉤WSARecv,WSARecvEx沒有任何運氣。
使用WinAPIOverride32檢查了應用程序,它清楚地表明它使用了recv
函數,併成功記錄了使用情況。 Winsock Packet Editor也正在讀取數據。
任何想法?
int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags)
{
fopen_s(&pRecvLogFile, "C:\\RecvLog.txt", "a+");
fprintf(pRecvLogFile, "%s\n", buf);
fclose(pRecvLogFile);
return pRecv(s, buf, len, flags); //you need to call recv first
}
,而不是做這樣的事情:
我的建議是:寫一個LSP(Layered Service Provider)。修改其中一個LSP樣本將使您獲得更多,並且可能比掛鉤方式更具包容性。將其設想爲TDI驅動程序和朋友的替代用戶模式。 – 0xC0000022L 2012-04-09 00:17:06
該LSP的任何文章或示例代碼?我希望它不那麼複雜。 – methyl 2012-04-09 08:34:12
當然,這個大部分仍然有效:https://www.microsoft.com/msj/0599/layeredservice/layeredservice.aspx,當然還有:http://msdn.microsoft.com/en-us/ library/windows/desktop/bb513664(v = vs.85).aspx – 0xC0000022L 2012-04-09 11:50:07