免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ecjtubaowp
打印 上一主题 下一主题

linux下在应用层如何修改数据包 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-07-09 13:24 |只看该作者
原帖由 piaobo79 于 2008-7-8 14:53 发表
可以使用libpcap来捕捉,然后通知内核丢弃被捕捉的包,然后把修改以后的包用libnet再发出去。我试过,可以用的。如果不要求性能的话这种方法就够了,可以使用python来进行快速开发。如果需要保证性能,那就最好 ...


你可以使用iptables来设置规则来丢弃相关的包,这样你的libpcap抓到的就是唯一的一份了,然后改了再用libnet发出去就行了。这种方法比较灵活,可以修改除了IP头之外的内容。

其实还有一个办法就是使用libipqueue, 这个库可以把被标记为queue的包发送到用户空间的你的程序里面,你改了以后可以直接使用ipqueue库把包返回到网络栈。这样libpcap和libnet都不需要了。其实这个办法是比较正规的,只是需要iptables来设置规则标记哪些包需要queue.

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
12 [报告]
发表于 2008-07-09 14:17 |只看该作者
原帖由 piaobo79 于 2008-7-9 13:24 发表


你可以使用iptables来设置规则来丢弃相关的包,这样你的libpcap抓到的就是唯一的一份了,然后改了再用libnet发出去就行了。这种方法比较灵活,可以修改除了IP头之外的内容。

其实还有一个办法就是使用li ...

你说的第二种方法的确是比较好,但是我是新手,我现在只想用libpcap和libnet,丢弃相关的包后,libpcap抓到的就是唯一的一份了?这句话我不 太理解。我现在是想在用户程序里把抓到的包修改后,然后发送出去,我这里有一个指向数据包的指针u_char *packet,修改数据包是不是就是对里面一些内容重新赋值呢,比如我把packet分解出了TCP数据包,是不是就是对里面的端口号和checksum等等重新赋一下值呢,还是和其他有什么相关的东西??谢谢哥哥了!!!!

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
13 [报告]
发表于 2008-07-10 16:50 |只看该作者

回复 #11 ecjtubaowp 的帖子

如果重新对数据包里的数据进行赋值,那么这样的话其实包都已经发送出去了,不知道怎么告诉内核不要处理我已经抓到的包???

论坛徽章:
0
14 [报告]
发表于 2008-07-14 17:44 |只看该作者
原帖由 ecjtubaowp 于 2008-7-10 16:50 发表
如果重新对数据包里的数据进行赋值,那么这样的话其实包都已经发送出去了,不知道怎么告诉内核不要处理我已经抓到的包???


如果使用iptables把你要修改的数据包丢掉的话,包就不会被发出去。

论坛徽章:
0
15 [报告]
发表于 2008-07-14 18:37 |只看该作者
你们这些人为什么总往复杂的弄?什么netfilter,netlib,人家的要求只是要修改包,一个raw socket.十几行代码轻松搞定。netfilter也是靠这个写出来的

论坛徽章:
0
16 [报告]
发表于 2008-07-15 12:08 |只看该作者
原帖由 hijohnny 于 2008-7-14 18:37 发表
你们这些人为什么总往复杂的弄?什么netfilter,netlib,人家的要求只是要修改包,一个raw socket.十几行代码轻松搞定。netfilter也是靠这个写出来的


不是我往复杂了弄,而是功力不够不知道怎样进行简单处理。希望楼上能够解释一下怎样使用raw socket来实现楼主的要求。 我记得raw socket可以修改包,但是对于需要转发的TCP/udp包,内核会进行相应的处理并转发,这样改了以后就算发出去也是2份。怎样才能只保留一份呢? 另外netfilter是内核的一套钩子函数,并不是使用raw socket实现的,可以参考内核的代码。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
17 [报告]
发表于 2008-07-15 13:14 |只看该作者
使用netfilter的mangle来修改吧,实现比较容易简单。

论坛徽章:
0
18 [报告]
发表于 2008-07-15 22:50 |只看该作者
希望能得到楼主悬赏的十分。

论坛徽章:
0
19 [报告]
发表于 2008-07-16 12:30 |只看该作者
感谢楼上分享代码。问题:如果一个包是应该被这台机器转发的,通过raw socket可以收到一份,之后内核里面的那份就被丢弃了?还是继续被转发?看代码里面对本地发出的包的处理,应该内核会继续处理的。这样怎样解决重复包的问题呢?

if(in_addr.sll_pkttype==PACKET_OUTGOING){printf("won't send me again;\n");continue;}                    
       dest.sll_family=AF_PACKET;
       dest.sll_ifindex =ifr.ifr_ifindex;
       dest.sll_halen=htons(ETH_HLEN);     
       memmove(&dest.sll_addr,buffer,sizeof(buffer[0])*8);
       n=sendto(sendfd,buffer,recv_len,0,(struct sockaddr*)&dest,sizeof(dest));

这段的意思好像是判断如果是发出去的包就不管,否则就修改并发出。按理说如果内核的部分会自动被丢弃的话,无论怎样都要重发一遍的,有点说不通。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
20 [报告]
发表于 2008-07-16 16:22 |只看该作者
原帖由 piaobo79 于 2008-7-16 12:30 发表
感谢楼上分享代码。问题:如果一个包是应该被这台机器转发的,通过raw socket可以收到一份,之后内核里面的那份就被丢弃了?还是继续被转发?看代码里面对本地发出的包的处理,应该内核会继续处理的。这样怎样解 ...

我也有同样的疑问???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP