endicking
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2004-06-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3854回复:11

怎么用原始套接字模拟三次握手、。

楼主#
更多 发布于:2004-05-28 12:54
项目要求使用原始套接字模拟三次握手,但是到第二次握手的时候,系统老是自作聪明发送了一个RST标志的TCP,
我已经尝试

m_socket=socket(AF_INET,SOCK_STREAM,0);
bind(m_socket,(struct sockaddr *)&RegPort,sizeof(struct sockaddr));
listen(m_socket,SOMAXCONN);
绑定端口,和监听端口,防止端口不可到达,但是系统还是自作聪明发送一个RST数据包
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-28 14:25
你这不是用原始套接字
你用的是SOCK_STREAM
原始套接字的类型为SOCK_RAW

//初始化 Raw Socket
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET)
throw Exception(\"socket setup error!\");

//设置IP头操作选项
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
throw Exception(\"setsockopt IP_HDRINCL error!\");


//把 sock 绑定到本地地址上
if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
throw Exception(\"bind error!\");

以上是RAWSOCKET的一些代码用法


[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-28 14:34
还有,你的表述不是很明确
我无法判断你的具体需求

是拦截TCP通讯的三次握手,并干预三次握手过程呢,还是就是自己实现协议栈。

如果是第一种情况,分你是发起方还是接受方两种情况处理:
接受方:
检查SYN标志-》复制SYN+设置ACK标志,保存序列,校验,构造syn+ack报文-》设置超时-》发送-》监听

太多了,不写了,你找个扫描软件的源代码看看;
是那种半开扫描的代码,改改就是你要的功能。
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
endicking
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2004-06-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-28 15:56
m_socket=socket(AF_INET,SOCK_STREAM,0);
bind(m_socket,(struct sockaddr *)&RegPort,sizeof(struct sockaddr));
listen(m_socket,SOMAXCONN);

这段代码不是原始套接字的代码,是打开一个用于TCP的端口,防止发送ICMP端口不可到达的协议。

但是我不清楚,为什么打开端口后客户机还是要产生RST的tcp报文
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-01 09:24
因为你的客户端超时没有响应,这时,服务端查询是否已经建立连接,结果当然是没有建立连接,此时。客户端有义务发回RST信号,重置服务端连接

你看看协议
或者去看看半连接扫描器的源代码就知道了
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-01 09:34
半开放式连接(handshake cheating connection)
Client--------Syn------->Server
Client<-----Syn/Ack------Server
Client----->\\\\延迟回应---Server
Client-connected--?<-----Server
Client--------RST------->Server

你的问题就出现在第二步结束以后
因为延迟回应,导致第四步动作,从而产生第五步的动作

问题的原理是在这里
可是你还没有回答我你到底是做的什么功能,自己实现那一边(C?/S?)
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-01 09:40
还有
我感觉你做这样的事情,用RAW SOCKET有一些问题
WINDOW下需要考虑WINDOW本省协议栈对连接的响应。
RAW SOCKET是获得数据报的旁路拷贝,而不是拦截。所以用来实现自己的底层通讯协议可以考虑,但是实现机器已经安装的协议受到的干扰太多了。越是高层协议,受到的干扰越多,而且行为不稳定,网络轻载和重载的行为有很大差异。
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
endicking
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2004-06-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-02 16:29
兄弟,谢谢你的回复
我做的是网关的问题
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-03 16:10
网关要考虑什么三次握手
好像不需要考虑高层协议吧
IP包转发不就可以了吗?乱说的
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-03 16:11
你不会做电话网关吧,IP网关好像现在大多都不 用做协议转换
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
endicking
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2004-06-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-06-03 18:05
谢谢楼上的兄弟热情的回复,

不知道用TDI能否很好地处理这个问题,也就是截获握手的数据包,和构造这种数据包来发送.

另外TCP是面向连接协议,要向系统堆栈注册的,我的ICMP,和UDP都工作得很好,现在一直没有进展就是因为TCP做不了,
endicking
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2004-06-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-06-03 18:08
再说一句,在底层可以不用理会各个协议的关系,
但是在高层做起来麻烦,我知道用NDIS IMD可以很好处理,但是
太难,而且不支持modem,NDIS HOOK有没有相关的规范文档,
所以打算用TDI,


各位走过路过,可怜偶这个超级菜鸟程序员吧,5555~~~~
游客

返回顶部