【发布时间】:2013-05-03 06:31:32
【问题描述】:
我在 Ws2_32.dll 中的recv-函数上安装了一个挂钩。现在,当调用recv 时,我想获取有关谁发送了信息的信息。所以我尝试了以下方法来获取发件人的远程地址,但我得到的地址总是错误的,对于互联网来说非常不现实(例如我得到 2.0.0.80)。
我做错了什么?
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的返回值。另外,我们不知道你是怎么上钩的;如果钩子没有在拥有套接字的进程中执行,你会得到垃圾。 -
钩子当然和原来的socket在同一个进程中。我不检查结果,因为这是概念证明。我知道我应该这样做,但这不是错。
-
检查 sockaddr 的
ss_family,这可能不是 IPv4 地址 -
是 IPv4。我在另一个线程中找到了一个有趣的答案:stackoverflow.com/a/8114503/1433564 - 请参阅 cmets。所描述的情况似乎与我的情况相符,这可以解释为什么我得到错误的结果。
-
是的,如果这是一个无连接套接字,就会发生这种情况。