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



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

大家好,我刚学习LINUX编程,编了一个小程序,主要功能是想创建一个SOCKECT,然后绑定到本地网卡上,截取所有通过本网卡的数据包,然后打印出来。P!Q(h6vJg
但是程序执行到revc的while循环的时候,就一直停在那里,接收不到数据,不知道是不是前面什么地方设置错了?请大家指点。
0X?/ta(w;ZLinux伊甸园论坛程序如下 :;V        {;S(_wrd
D*z/F&y

#include<stdio.h>

dV R&k/QHA/k1{3^
#define SIO_RCVALL     _WSAIOW(IOC_VENDOR,1)
X4E7S f
k.fwww.linuxeden.com
#include<fcntl.h>
)@R n*II s$@#@www.linuxeden.com#include<sys/socket.h>Linux伊甸园论坛jKXM pJ4HBI
#include<netinet/in.h>
N7w@Pl'BX/{)Iwww.linuxeden.com#include<string.h>
j dQL4tX7Lwww.linuxeden.com#include<sys/types.h>
Q5VJsz$q        T
L
#include<stdlib.h>_*d6X'Ke/]_ s
V

#include<errno.h>{`'H:r-_        d
#include<unistd.h>
M3sMg/t0r qwww.linuxeden.com#define N 1024
hKXp.F#define M 1024
xgH        _/ymLinux伊甸园论坛typedef struct _IP{
$`9g*F_b,f:W"NU0Iunion{ uint8_t Version;
k'l8K3^T       uint8_t HdrLen;};+w$Hui3W N o
       uint8_t ServiceType;fj a+Y        rF6X/a6F6d'J
       uint16_t TotalLen;
$B#n7o}!n^cK       uint16_t ID;
iv$GK`N;?w ZL L'o

       union{uint16_t Flags0;uint16_t FragOff;};
%mYp7^h0~
JW.W.I;{
       uint8_t TimeToLive;#C2W&f1C)^V5yUM
       uint8_t Protocol;Linux伊甸园论坛b;Y-?Al
       uint16_t HdrChksum;
r0omb9B1R7G%O7xuY       uint32_t SrcAddr;%fcb.H&vX"V x
       uint32_t DstAddr;         yh$C-Xjc0x
}IP;R:{$\I!DKd]9|\
typedef struct _TCP9jI,e e1j%]i
{
$}$yLbFx V       uint16_t SrcPort;u T z/z-_]u0F
       uint16_t DstPort;
An.Y$aU:frD?www.linuxeden.com       uint32_t SeqNum;*IS rMR P
       uint32_t AckNum;:h%?)}        n1f)C0w
       uint8_t DataOff;
X)qUO%o^       uint8_t Flags1;

^+s5U0sP
       uint16_t Window;
dT"R ZKwww.linuxeden.com       uint16_t Chksum;
Ld.UVX%_p
}*HLinux伊甸园论坛
       uint16_t UrgPtr;Linux伊甸园论坛D)d'Vj,JY"A xl.\7x
}TCP;
+}4AW\swww.linuxeden.comIP ip;
]
d7Y
j$GOD&`
TCP tcp;
A*R`zO l5| kwww.linuxeden.comint printer(IP ip)K(b+sqzFG2?
{
LP.V+vMa3a    uint8_t version;www.linuxeden.com4oY DHaF&y
    uint8_t hdrlen;Linux伊甸园论坛7X+`s;[&e j%fw
    uint8_t DF,MF;
o*Z?Ar        ^www.linuxeden.com    uint16_t foff;CZ}2D        IY L:O!{C
    version=ip.Version>>4;
P(kh}&LI)~1Iwww.linuxeden.com    hdrlen=(ip.Version&0x0f)*4;Wt        n[s/@ `C
    DF=(ip.Flags0>>14)&0x01;
I9c&Z9f(\aDLinux伊甸园论坛    MF=(ip.Flags0>>13)&0x01;
%G3K~,[V2\PdLinux伊甸园论坛    foff=ip.Flags0&0x1fff;
*~9vhc.A*u        F    Linux伊甸园论坛9C+n!]$Np^ tLX
    printf("Version:%d\r\n",version);
4D^M        b0m}5A    printf("Herd length:%d\r\n",hdrlen);
[iK$pAQ'b#tPLinux伊甸园论坛    printf("datapack length:%d\r\n",ntohs(ip.TotalLen));
[P+H+I9Ulk*Gwww.linuxeden.com    printf("ID:%d\r\n",ip.ID);
4\$BY        Asx(L    printf("flag:%s\r\n",inet_ntoa(ip.Flags0));
`Y7~ hWGowww.linuxeden.com    printf("segment :%d\r\n",foff);$_:~B7k`
    printf("timetolive:%d\r\n",ip.TimeToLive);
%Q1UFLv    printf("header check:%d\r\n",ip.HdrChksum);+S8`4BnGli|
    printf("ip source:%s\r\n",inet_ntoa(ip.SrcAddr));q3s6smR%rg
    printf("ip dest:%s\r\n\r\n\r\n",inet_ntoa(ip.DstAddr));  O'VC\y8g
    return 0;
7I\_#z Kba;rK6BLinux伊甸园论坛}D+PN x8F
int main()www.linuxeden.com'bs9O
}i^        YR

{  www.linuxeden.come`:xLo#L_jD
    struct sockaddr_in addr_in;www.linuxeden.com }ph5R^n@
    const int BUFFER_SIZE=65535;I[)|B+S2xS
    int flag=1;Linux伊甸园论坛I?i Zb
B)EQl

    char LocalName[256];
X;rj"lj    struct postent * pHost;Linux伊甸园论坛(q6?        \5Ai
    char RecvBuf [BUFFER_SIZE];
xW'g$\8N@    IP ip;
[$t wm        V u    a.YY}`
a7K

    int sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);www.linuxeden.comt:vy3PK,S:A(L
    printf("sock=%d\n",sock);www.linuxeden.com9V        | G1y+xHS1["D
    int rc=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));'ye&cv2SQp?9[
    if(rc<0)
"u)B5c
@ HP
    {
`M/Rl        B        printf("%d\n",rc);
$U l;uM'C I        printf("setsockopt fail!\n");dt)m6s U
    }Linux伊甸园论坛2Ww!K0F_l
U

    if(0!=gethostname((char*)LocalName,sizeof(LocalName)-1))//获取本地IP地址名
k*y1[0kVE
HTwww.linuxeden.com
    {
[E5kT@.vx%]
a5Al-s
        printf("gethostname fail!\n");1R Ja(]Yo(W
_

    }
1r_}'^"Pv,aU&]    else
^(u"v*MM}Q    {
^`Xz}&?7GGo1i        printf("hostname=%s!\n",LocalName);oY&tI?
    }
[$K$h NU+@ \Q    addr_in.sin_addr.s_addr=inet_addr("172.16.22.23");//本地IP地址www.linuxeden.com;\v+`TV+[:t/e
    addr_in.sin_family=AF_INET;h?U        T
O)b7VE

    addr_in.sin_port=htons(45882);2X2dP        b5r1C-E;K
   
z[1J8g yG    if(0!=bind(sock , (struct sockaddr * )&addr_in,sizeof(addr_in)))
h4Fl{0~&jw    { g$`M        K5f4^
       printf("bind failed!\n"); k(JG`"a][9s8G
    } Nh.M(?#H1}7w#SJ
    if(0!=fcntl(sock,F_SETFL,O_NONBLOCK))//设置网卡接收所有通过本网卡的数据包7EDG.x!N;o h
    { printf("ioctlsocket failed!\n");}
(L}2HD
Vj5G
    socklen_t len;
T0pQ/H3d8R)A8Sp    while(1)8w&j$@cnc#E6m
    { m,Z(n.sY
F#J

       int ret=recv(sock,RecvBuf,BUFFER_SIZE,0);
o
v1mYJ9NS
       if(ret>0)www.linuxeden.com @v&K"j+o{(x
       {(hil@
?Z
|d+F

            ip=*(IP*)RecvBuf;
X.is!rLs/Ewww.linuxeden.com            tcp=*(TCP*)(RecvBuf+ip.HdrLen);
s7|"o1g[psnLinux伊甸园论坛            printer(ip);J,Y*gA2X-`b
E*_        m

            printf("%d\n",ret);
$D0xgm+Vwww.linuxeden.com       }   
$R$Qz UaYU       else if(ret==0)
8m.cD*@        bw       {-U~'~.Jms%J0S:t
            printf("the connection has been gracefully close!\n");
1z:}RL+B       }
s'O5J
^,vj+ZE3nwww.linuxeden.com
    }
*r7ce iK1b1s}

顶部
不容错过的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  资料  个人空间  短消息  加为好友 
似乎应该设置网卡为混杂模式?,S E!lhf"j;^
用ifconfig看看?





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



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

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

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