我在Ws2_32.dll中的recv
函數上安裝了一個鉤子。現在,當調用recv
時,我想獲取關於誰發送信息的信息。所以我嘗試了以下方法來獲取發件人的遠程地址,但是我得到的地址總是錯誤的,並且對於互聯網來說是非常不切實際的(例如,我得到2.0.0.80)。通過SOCKET標識符獲取遠程地址在recv-hook中
我在做什麼錯?
int __stdcall TcpHook::my_recv(SOCKET s, char *buf, int len, int flags)
{
sockaddr addr;
int len2 = sizeof(addr);
getpeername(s, &addr, &len2);
char *sender = inet_ntoa(*(in_addr*)&addr);
// print out sender etc.
return tcpHook.recvOriginal(s, buf, len, flags);
}
有趣的一點是,我沒有任何信息,儘管通過s
(類型SOCKET
)的。
您沒有檢查'getpeername'的返回值。另外,我們不知道你是如何掛鉤的;如果鉤子沒有在擁有套接字的進程中執行,你會得到垃圾。 – 2013-05-08 21:47:28
當然,掛鉤與原始套接字處於相同的過程。我不檢查結果,因爲這是一個概念證明。我知道我應該這樣做,但這不是過錯。 – 2013-05-08 21:53:30
檢查sockaddr的'ss_family',這可能不是IPv4地址 – 2013-05-08 21:54:40