标题: linux下实现SNIFFER功能
zhuly
新生入学
Rank: 1
注册用户



UID 184875
精华 0
积分 0(积分有什么用?)
帖子 2
阅读权限 10
注册 2007-3-12
状态 离线
发表于 2007-5-5 10:40  资料  个人空间  短消息  加为好友 
linux下实现SNIFFER功能

大家好,我刚学习LINUX编程,编了一个小程序,主要功能是想创建一个SOCKECT,然后绑定到本地网卡上,截取所有通过本网卡的数据包,然后打印出来。6C'Vd&Z5Q:j5|)yp
但是程序执行到revc的while循环的时候,就一直停在那里,接收不到数据,不知道是不是前面什么地方设置错了?请大家指点。
6zVN9Y_4ZM程序如下 :www.linuxeden.comef7\,C5v3^G,w{L
#include<stdio.h>
vp@5F|@#define SIO_RCVALL     _WSAIOW(IOC_VENDOR,1)^qn@gh
#include<fcntl.h>
:N9Hm.i+Z.k8k        C]3lwww.linuxeden.com#include<sys/socket.h>#Z@jn3^}
ksC

#include<netinet/in.h>www.linuxeden.com2hcxV!xO
#include<string.h>        z+dg2tXH6_S$FC
#include<sys/types.h>www.linuxeden.com`1`4Xj[+`
#include<stdlib.h> Vt]rV)kYA
#include<errno.h>
/gKz5e){"O#include<unistd.h>
KYV        Zi
ow&R
#define N 1024'fA:t
vm8y9yp
gQ2|

#define M 1024

_%h'f"H$m        m.kA tLinux伊甸园论坛
typedef struct _IP{
z[e(LQaunion{ uint8_t Version;Linux伊甸园论坛9@)[!z?
? JG V

       uint8_t HdrLen;};www.linuxeden.comHk&j I%nQ6wRt
       uint8_t ServiceType;www.linuxeden.comSVzE-Tw
       uint16_t TotalLen;Linux伊甸园论坛#_BlZxp6F:l
       uint16_t ID;
.i3l}"e d
tco
       union{uint16_t Flags0;uint16_t FragOff;};'b ya-b)e9u$y lc
       uint8_t TimeToLive;
T9D8a'u&rY@]"Y       uint8_t Protocol;
.LT(Y%].\6_7|D rD9Owww.linuxeden.com       uint16_t HdrChksum;
p)L*X        Af?Linux伊甸园论坛       uint32_t SrcAddr;

b!P,n+yb6O
       uint32_t DstAddr;         q0px/o5Re;mj
}IP;www.linuxeden.com'BZB&A;w.W
typedef struct _TCP
C7]$yyYP
T_p
{6Xxi|u&J
       uint16_t SrcPort;
Vx.US{,d       uint16_t DstPort;F
fNu$j
t

       uint32_t SeqNum;
#d-}3XKEY@&I       uint32_t AckNum;
mRy.?4j:RQ       uint8_t DataOff;'It!x+P,~(Bz,LH
       uint8_t Flags1;Linux伊甸园论坛ew7RX`
n.V
Rs

       uint16_t Window;Linux伊甸园论坛KiDW
}uE)E

       uint16_t Chksum;
-D,LNQ`       uint16_t UrgPtr;
UvD)oD}TCP;
0q~+}6X0w0l;gjwww.linuxeden.comIP ip;r+Dv,n5h
TCP tcp;
/q$r9H4E[ FJu'e5{cint printer(IP ip)
-`F1||(F vwww.linuxeden.com{
)E)]
f#k c ^'v
    uint8_t version;www.linuxeden.comc$H&oJZ"{%Ne
    uint8_t hdrlen;Linux伊甸园论坛`
?Z&YIGi2c~X

    uint8_t DF,MF;www.linuxeden.comS,y4fJ8] lD2H
    uint16_t foff;www.linuxeden.com]7@3DD)TsD!P
    version=ip.Version>>4;M[0?.u-X&c2_
    hdrlen=(ip.Version&0x0f)*4;www.linuxeden.comj        A/X7MlT;w.LY
    DF=(ip.Flags0>>14)&0x01;
%Y&Il,WQ8v B Swww.linuxeden.com    MF=(ip.Flags0>>13)&0x01;
3bp]D9Z-ELinux伊甸园论坛    foff=ip.Flags0&0x1fff;
9y-j^8x)H    Linux伊甸园论坛$BmI?Zi7J{
    printf("Version:%d\r\n",version);
/K:|er:[T-`    printf("Herd length:%d\r\n",hdrlen);5\qLB:OVb
    printf("datapack length:%d\r\n",ntohs(ip.TotalLen));Linux伊甸园论坛IE)eXM/XvbpueD
    printf("ID:%d\r\n",ip.ID);
["}TS7OA    printf("flag:%s\r\n",inet_ntoa(ip.Flags0));#A0Un3l3n6^8t/[?
    printf("segment :%d\r\n",foff);Linux伊甸园论坛:wX9s
~4d

    printf("timetolive:%d\r\n",ip.TimeToLive);Linux伊甸园论坛(x6{*~F)P-^C _C(N
    printf("header check:%d\r\n",ip.HdrChksum);
.Nh*q r&z h
B
    printf("ip source:%s\r\n",inet_ntoa(ip.SrcAddr));
q2E%g{1os-R `2B    printf("ip dest:%s\r\n\r\n\r\n",inet_ntoa(ip.DstAddr));  www.linuxeden.comn$Lmg {?,y
    return 0;
~        bOUE        {}
BO2v-H~
QEc
int main()Linux伊甸园论坛
V&n&o2`!?\qz-r

{  5cKic t3~1m}R B|
    struct sockaddr_in addr_in;M^%J-V        c{q~
    const int BUFFER_SIZE=65535;
LTbQ#q2Lh5J    int flag=1;
5fa1UM6ku4n\t    char LocalName[256];`q:Rv&P9A
    struct postent * pHost;
f:_maX8y}        V    char RecvBuf [BUFFER_SIZE];Linux伊甸园论坛H'Y,G8TR
    IP ip;
@#^'`T'E
r*vn
   
b3I`
RR9Qx
    int sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);6W(~8~D g        G
    printf("sock=%d\n",sock);
6Ac1E'uD ZJEwww.linuxeden.com    int rc=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));{#b,gw Q1Y^0n8v
    if(rc<0)7u%^ a2Z
r X

    {
tJVX
T2Gwww.linuxeden.com
        printf("%d\n",rc);!Hn
F8w fw.^)W

        printf("setsockopt fail!\n");Linux伊甸园论坛.C(`:wCl6B'\7I)l
    }
[8_-R`
_G
    if(0!=gethostname((char*)LocalName,sizeof(LocalName)-1))//获取本地IP地址名
-[&lR7?E*Rd    {Q1U-u4B$`\g:]8{
        printf("gethostname fail!\n");
[6}*_0@P(m    }
Awt^5n({p

    else
$a'uD5I9yX7R    {
*e.B[z9F        printf("hostname=%s!\n",LocalName);
;_G;Z+Y_,_3z    }

|Y2}%k
v
o8O8nwww.linuxeden.com
    addr_in.sin_addr.s_addr=inet_addr("172.16.22.23");//本地IP地址
!_3N;sF GYz#D    addr_in.sin_family=AF_INET;www.linuxeden.com R
j.hN1fbc_1@

    addr_in.sin_port=htons(45882);
0M;F N9P.HIt9T   
yd^2D@f3EYZll    if(0!=bind(sock , (struct sockaddr * )&addr_in,sizeof(addr_in)))O.R        mn(D7tbrvn
    {
(e7b8^'\
_6V9t(pwww.linuxeden.com
       printf("bind failed!\n");
+S4H"} pRLinux伊甸园论坛    }
N0`q"P0j gv:J!RW1E    if(0!=fcntl(sock,F_SETFL,O_NONBLOCK))//设置网卡接收所有通过本网卡的数据包www.linuxeden.com&k,of
K+s0^-d

    { printf("ioctlsocket failed!\n");}
Qg;^6L5bu`-C;C1^    socklen_t len;
Be$e
l$VJb        Bwww.linuxeden.com
    while(1)
1Q$F8@(R~Hs6zOgEwww.linuxeden.com    {#EA0G9d&[}*F        S
       int ret=recv(sock,RecvBuf,BUFFER_SIZE,0);f:r+|D'IvD8]
       if(ret>0)I_I        J'om.h
       {
qf/R$Cq%BO0l            ip=*(IP*)RecvBuf;
2c J)__M3Pl/s            tcp=*(TCP*)(RecvBuf+ip.HdrLen);
2Z&p(I:U:qH'Qm:b#F            printer(ip); c#@[-L
            printf("%d\n",ret);
F'}Hc]9B5aN;Xb$xLinux伊甸园论坛       }    2Q ` C,?$B2W
       else if(ret==0)
I c.D`T)c T9?Linux伊甸园论坛       {
9m#K
c/R9[ c.@Ai/eIy
            printf("the connection has been gracefully close!\n");4Q-l%s!J%o8V.IDR        B%p
       } GHbZ-A`s^ l
    }0q        JJV^/Jzg
}

顶部
不容错过的IBM 集群技术资源汇总
zhuly
新生入学
Rank: 1
注册用户



UID 184875
精华 0
积分 0(积分有什么用?)
帖子 2
阅读权限 10
注册 2007-3-12
状态 离线
发表于 2007-5-5 10:59  资料  个人空间  短消息  加为好友 
如果谁有这方面的源代码,麻烦可以发给我一份么?让我学习一下。。。不胜感激。

顶部
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-5-6 20:41  资料  个人空间  短消息  加为好友 
似乎应该设置网卡为混杂模式?Linux伊甸园论坛8[
a4u7v#i        b

用ifconfig看看?





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 04:22

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.088630 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP