自己写的一个抓包程序
通过原始套接字抓包在分析tcp包的时候发现syn总是为0,请大家帮忙看看:-)下面是tcp头定义,有问题么?
struct TCPHeader
{
USHORT SourPort;
USHORT DestPort;
ULONG  SeqNo;   
ULONG  AckNo; 
USHORT 
       tcp_res1:4,
       tcp_hlen:4,
       tcp_fin:1, 
                tcp_syn:1, 
                tcp_rst:1, 
                tcp_psh:1, 
                tcp_ack:1, 
                tcp_urg:1,
       tcp_res2:2;
USHORT WndSize;
USHORT UrgPtr;
USHORT ChkSum;
};pTcpHeader = (TCPHeader *)(recvbuf+IPHeaderLen);
syn = pTcpHeader->tcp_syn;
ack = pTcpHeader->tcp_ack;
fin = pTcpHeader->tcp_fin;
rst = pTcpHeader->tcp_rst;
psh = pTcpHeader->tcp_psh;
urg = pTcpHeader->tcp_urg;if((Param.syn == 1) && (Param.ack == 0))
{
     //有关连接的代码
     
}采用单步调试,发现syn值总是为0,百思不得其解

解决方案 »

  1.   

    我把防火墙关掉,就能收到syn=1,ack=0的包
    难道是因为我的防火墙拦截了这个包么?
      

  2.   

    TCP包只有在三次握手时的前两个包SYS才为1
      

  3.   

    把防火墙关掉,就能收到syn=1,ack=0的包?
    不可能吧, 如果防火墙拦截了所有syn的包,
    你还怎么建立连接?
      

  4.   

    我也觉得纳闷,可是我一运行自己写的抓包程序防火墙就报警:218.194.49.155试图连接本机的http[80]端口
    TCP标志:S
    该操作被拒绝并且确实收不到syn=1,ack=0的包,不过别的包都能收到关掉防火墙,则可以收到syn=1,ack=0的包哪位大虾能够解释一下这是什么原因?
      

  5.   

    我没有写过防火墙,但是我们可以从windows本身的安全机制来推测防火墙对你的程序都做了一些什么.防火墙是开机就启动的,他对一些内核对象进行监控.当你自己的程序第一次运行的时候,防火墙检测到该你的程序对内核对象比如套接字请求,如果你第一次同意,防火墙将你的程序加入sd的肯定的acl中,如果你第一次否定,防火墙将你的对象加入sd的否定acl中,并且在注册表中进行描述.当以后的每次启动,防火墙从注册表中获取你的这种选择,这样如果你不幸的在第一次运行自己的程序拒绝修改注册表,放火墙对你以后的基于其监控的对象上的访问,都会因为你的程序权限不够而被拒绝.关掉防火墙,你的程序获取的默认的sd,一般你会以管理员的身份运行程序.所以这个时候是正常的.
      

  6.   

    看来我对防火墙和端口扫描程序还缺乏认识
    但是我该怎么改进我的程序,让防火墙不会误认为我是扫描的呢还有,三次握手的时候总是抓到4个包:  source IP           dest IP      syn   ack       sno          ano
    218.194.48.155    202.112.14.184    0     1     1730997270    175079361
    202.112.14.184    218.194.48.155    1     1     158302145     1730997270
    218.194.48.155    202.112.14.184    0     1     1730997270    175079361
    218.194.48.155    202.112.14.184    1     0     1714220054    0连接任意一个网站的时候三次握手发的包都有4个,请大虾们多多指教
      

  7.   

    看防火墙怎么做的了,有的防火墙会做成Synproxy模式,也就是说,所有的Syn都在防火墙被拦截下来,然后防火墙返回一个Syn+Ack的包,然后等待对方的Ack包,完成了以后才会和本机的服务进行连接,这个时候你根本就不会发现有Syn的包过来……OpenBSD的Packet Filter就是这么干的,估计你的防火墙也干了这种事情……