2013-05-08 51 views
3

我在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)的。

+1

您沒有檢查'getpeername'的返回值。另外,我們不知道你是如何掛鉤的;如果鉤子沒有在擁有套接字的進程中執行,你會得到垃圾。 – 2013-05-08 21:47:28

+0

當然,掛鉤與原始套接字處於相同的過程。我不檢查結果,因爲這是一個概念證明。我知道我應該這樣做,但這不是過錯。 – 2013-05-08 21:53:30

+0

檢查sockaddr的'ss_family',這可能不是IPv4地址 – 2013-05-08 21:54:40

回答

0

我找到了解決方案......我只是失敗了。 正確的代碼是:

inet_ntoa((*(sockaddr_in*)&addr).sin_addr); 

它的工作原理。

+2

這取決於'sockaddr_in'和'sockaddr'是相同的大小。這恰好是真的。通常,在調用'getpeername()'時應該使用正確類型的'addr'。 – jxh 2013-05-08 22:24:18

+2

不要添加隨機轉換來編譯代碼。 – 2013-05-08 22:47:20