Socket原始套接字发送的Syn报文,返回syn+ack后自动发rst

时间:2021-01-08 11:01:54
我用SOCK_RAW发送一个tcp syn报文,返回syn+ack后,不等我的程序处理ack建立三次握手,系统自动发一条rst。
搜寻多方信息,说Tcp进SOCK_RAW发报文时,不进行“建立连接信息”记录。请教高手如何解决这一问题。
关键程序如下
1发送syn报文
sendto(sendSocket, szSendBuf,sizeof(ipHeader) + sizeof(tcpHeader),0, (struct sockaddr*)&sin, sizeof(sin))
2接收syn+ack报文,并发送ack报文
if(tcpHeader->th_flag == 18) 

send_packet(16,0x9ec10d1f,0);


请教在1 2两步中间加什么样的处理可以解决系统自动发送rst消息的问题。
我想到的办法有两个。
一,反编译内核,提取connect的信息,进行分析,看怎么记录连接信息的,自己加连接信息,我晕,不太好办。
二,做个IP报文拦截器,直接过滤掉rst报文。NND太暴了:),咱是文化人,不能用这招。

请教高手如何解决,头快痛死了。

9 个解决方案

#1


非暴力,不合作

只要能实现功能需求,什么技术手段都可以用啊

#2


应用层是很难解决的。

#3


破socket不用了,改主意用NDIS,呵呵。三楼说的好,不跟他较劲了。
不过做为技术分析啊,咱保留这个话题,看以后有没有高手能解开。

#4


能解开这个问题,愿意送2000元RMB,不呼哟。:),急眼了,我就不信没人懂tcp协议栈+内核调试

#5


呵呵2000太少了。

#6


请问楼主这个问题解决了吗?

#7


我们先来分析一下为什么会发送RST吧,一般我们在书上或者资料上都是这么说的,在机器重启之后,如果这时候收到TCP报文,而在TCP没有相应的状态、序列号与之对应,就会发出一个RST。
现在我们再来看看楼主的这个例子吧,楼主的做法实际上就是绕过TCP层发送一个SYN,对端对这个SYN做出ACK响应,那么TCP层是会收到这个报文的,它做出的反应跟之前说的那个情况应该没什么差别的。
那么我们该如何防止TCP层发出RST呢?楼主所说的办法2也并非不可行。还有一种办法就是不让TCP层收到ACK响应,那么我们就可以拦截这个报文并且把它过滤掉,这种方案也是可行的。

#8


请问楼主用NDIS怎么解决啊?我碰到这个问题,折腾好久了,另外楼上说拦截报文并过滤,这个要怎么实现呢?

#9


用winpcap拦截过滤,有兴趣去官方网站下载,比较简单

#1


非暴力,不合作

只要能实现功能需求,什么技术手段都可以用啊

#2


应用层是很难解决的。

#3


破socket不用了,改主意用NDIS,呵呵。三楼说的好,不跟他较劲了。
不过做为技术分析啊,咱保留这个话题,看以后有没有高手能解开。

#4


能解开这个问题,愿意送2000元RMB,不呼哟。:),急眼了,我就不信没人懂tcp协议栈+内核调试

#5


呵呵2000太少了。

#6


请问楼主这个问题解决了吗?

#7


我们先来分析一下为什么会发送RST吧,一般我们在书上或者资料上都是这么说的,在机器重启之后,如果这时候收到TCP报文,而在TCP没有相应的状态、序列号与之对应,就会发出一个RST。
现在我们再来看看楼主的这个例子吧,楼主的做法实际上就是绕过TCP层发送一个SYN,对端对这个SYN做出ACK响应,那么TCP层是会收到这个报文的,它做出的反应跟之前说的那个情况应该没什么差别的。
那么我们该如何防止TCP层发出RST呢?楼主所说的办法2也并非不可行。还有一种办法就是不让TCP层收到ACK响应,那么我们就可以拦截这个报文并且把它过滤掉,这种方案也是可行的。

#8


请问楼主用NDIS怎么解决啊?我碰到这个问题,折腾好久了,另外楼上说拦截报文并过滤,这个要怎么实现呢?

#9


用winpcap拦截过滤,有兴趣去官方网站下载,比较简单