用C#成功的HOOK了Sock的recv函数。如何获取数据包对应IP地址和端口?

gleam12315 2012-03-01 05:57:53
用网上的HOOKAPI扩展后成功,如何获取数据包IP地址?
部份代码如下。HOOKAPI可在网上找。
int recvProc(int s2, IntPtr buf2, int len2, int flag2)
{
int ret = 0;
recv_Hook.Suspend(); //暂停拦截,转交系统调用
ret = recv(s2, buf2, len2, flag2); //接收数据,此处可进行拦截,//第二个参数为IntPtr类型。byt[]不行
recv_Hook.Continue(); //恢复HOOK 一定要先recv,恢复Hook后再进行缓冲区数据读取。
if (ret == -1) //SOCKET_ERROR
return ret;
byte[] buffer2 = new byte[len2];
Marshal.Copy(buf2, buffer2, 0, len2); //读缓冲区封包数据
CommValues.RecvQue.Enqueue(buffer2);//封包入队列,等处理。异步操作有更好的方法吗?
return ret;
}

这一步成功了。没有任何问题,也没有读不完数据的问题。但我想根据IP地址和端口来确定要不要入队。
我的思路是:
参数:int S2 获得的应是Sock的句柄 或者说文件描述符
再根据S2获得Sock的信息或实例。但C#水平有限,无法成功。

如何根据以上Hook的recv函数,得到对应数据包的源IP、源端口等信息。第一次上CSDN。分有点少。
有达人能帮忙解决一下吗。万分感谢。
...全文
677 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCLOVEYA 2012-03-02
  • 打赏
  • 举报
回复
求度娘的网址
gleam12315 2012-03-01
  • 打赏
  • 举报
回复
更正一下
byte[] buffer2 = new byte[len2];
这个地方要改成
byte[] buffer2 = new byte[ret];
才能获取实际的数据长度
gleam12315 2012-03-01
  • 打赏
  • 举报
回复
自己解决了。我发现度娘比论坛快多了。所以我很少上论坛。、
S2返回的是SOCK描述符。是系统分配的SOCK配置表结构数组的下标。
根据这个下标。就可以获得SOCK配置结构。从而获取了SOCK连接信息
gleam12315 2012-03-01
  • 打赏
  • 举报
回复
先顶起。要不然只能先用RawSocket来接收所有数据包了。然后用程序句柄绑定端口来识别 开多个程序时识别数据是发给谁的

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧