请大家国光帮帮忙忙 果聊 **

请大家帮帮忙,真的是不会了,本来想做个抓包工具的,结果卡这了_linux吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:72,257贴子:
请大家帮帮忙,真的是不会了,本来想做个抓包工具的,结果卡这了收藏
本人刚接触linux没多长时间,基本就是小白,狂爱iptables,下面的问题可能对高手来说是愚蠢的,请别嘲笑我正在努力。我想做个抓包的工具,为的是对7层工作有个直接的认识,自己动手学到的东西多。但是抓包之前要看到包,所以卡在这里了,望大家帮忙,查了一星期,度娘东一句西一句我是月学月糊涂,真的是不会了所以一口气问了一大堆。首先:iptables -A OUTPUT -j NFQUEUE下面的代码有部分减少,减少长度,为了不让大家看着心烦 static u_int32_t print_pkt (struct nfq_data *tb) {
int id = 0;
struct nfqnl_msg_packet_hw *
unsigned char *
hwph = nfq_get_packet_hw(tb);
if (hwph) {
int i, hlen = ntohs(hwph-&hw_addrlen);
printf("hw_src_addr=");第一个问题,非常奇怪,将output转到nfqueue时for就不输出,只有再加上input转到nfqueue时,才输出我路由的mac,而且mac值是正确的,为什么hw_addr是进来包的来源mac,那进来包的目的mac怎么获得,那么出去包的来源和目的mac又怎么获得那?
for (i = 0; i & hlen-1; i++)
printf("%02x:", hwph-&hw_addr[i]);
printf("%02x ", hwph-&hw_addr[hlen-1]);
ret = nfq_get_payload(tb, &data);
if (ret &= 0)
printf("payload_len=%d \n", ret);//******************************************************************************************
struct iphdr *ip_1;第二个问题,感觉data复值给ip就得到ip头,附值给tcp就得到tcp头,附值给ethhdr就得到mac头,因为此程序结果不对,所以不知道自己的感觉对不对,我现在都不知道data到底是什么样子,请高手指点我的感觉对吗?
ip_1=(struct iphdr *)
printf("check: %d \n",ip_1-&check);
//ip头检查码第三个问题,我想把frag_off分3部分输出,第一部分是frag_off的二进制的第二位,第二部分是二进制第三位,最后一部分就是frag_off剩余的,不知道printf里怎么写
printf("frag_off: \n",ip_1-&frag_off);
//3个标志位和分段偏移数
printf("id: %d\n",ntohs(ip_1-&id));//******************************************************************************************
struct tcphdr * tcp_1;
tcp_1=(struct tcphdr *)
printf("seq: %d \n",tcp_1-&seq)
printf("source: %d %d\n",tcp_1-&source,ntohs(tcp_1-&source));第四个问题,不知道怎么判断,什么时候需要ntohs,上面的seq和source和dest要不要用ntohl或者ntohs,为什么第五个问题,我ping我的路由,ping -c 1 192.168.0.1,结只是果是本地放出端口永远是69,ping是icmp包呀,怎么tcp也跟着变动
printf("dest: %d %d \n",tcp_1-&dest,ntohs(tcp_1-&dest)); //******************************************************************************************
ethhdr *eth1;
eth1=(struct ethhdr *)unsigned char *ipsd=(unsigned char *)&eth1-&h_第六个问题,这才是核心问题,下面输出的mac号都不是我主机和路由的mac,不知道怎么改了,真不会了printf("h_source: %02X:%02X:%02X:%02X:%02X:%02X \n",ipsd[0],ipsd[1],ipsd[2],ipsd[3],ipsd[4],ipsd[5]);printf("source : %02x:%02x:%02x:%02x:%02x:%02x\n",eth1-&h_source);ipsd=(unsigned char *)&eth1-&h_printf("h_dest: %02x:%02x:%02x:%02x:%02x:%02x \n",ipsd[0],ipsd[1],ipsd[2],ipsd[3],ipsd[4],ipsd[5]);printf("dest : %02x:%02x:%02x:%02x:%02x:%02x\n",eth1-&h_dest);//****************************************************************************************** }////////////////////下面的请高手不用看,贴上他只是为了完整性 static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
struct nfq_data *nfa, void *data) {u_int32_t id = print_pkt(nfa);return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL); }int main(int argc, char **argv) {
struct nfq_handle *h;
struct nfq_q_handle *
struct nfnl_handle *
char buf[4096] __attribute__ ((aligned));
printf("opening library handle\n");
h = nfq_open();
nfq_unbind_pf(h, AF_INET);
nfq_bind_pf(h, AF_INET);
qh = nfq_create_queue(h,
0, &cb, NULL);
nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff);
fd = nfq_fd(h);
while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv &= 0)
nfq_handle_packet(h, buf, rv);
return 0;}
附上头文件呗?我搭个环境帮你看看
#include &stdio.h& #include &stdlib.h& #include &unistd.h& #include &netinet/in.h& #include &linux/types.h& #include &linux/netfilter.h& #include &libnetfilter_queue/libnetfilter_queue.h& #include&linux/ip.h&#include&linux/tcp.h&#include&linux/ethtool.h&xiexie
把你的规则完全贴服务器上没改就手贱回车了,瞬间服务器就远程不上了……
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
吧友热玩游戏排行 类型:FPS游戏136万人在玩 类型:角色扮演118万人在玩 类型:角色扮演122万人在玩 类型:角色扮演112万人在玩 类型:角色扮演108万人在玩 类型:角色扮演106万人在玩 类型:角色扮演105万人在玩 类型:角色扮演103万人在玩 类型:角色扮演98万人在玩 类型:角色扮演99万人在玩
使用签名档&&
为兴趣而生,贴吧更懂你。或和女朋友都没什么话题可以聊不知道怎么办,请大家帮帮忙,给点话题_百度知道
和女朋友都没什么话题可以聊不知道怎么办,请大家帮帮忙,给点话题
提问者采纳
看看兴趣再找找否自兴趣;都没培养
其他类似问题
其他6条回答
身边事等等都
怎么没话题呢,彼此身边的人,彼此的家人,彼此的喜好,彼此的习惯,彼此的工作学习。从生活的点点滴滴了解彼此,这不就是话题吗
有钱什么都好聊的,没钱就暂时说说什么孩子他爹爹、孩子他娘怎么怎么咯
小处着手,放眼将来。就是日常生活都有好多聊的啊!
弄点小浪漫撒 要知道相爱容易 相守难啊、很多感情就是经不起平淡而恰恰平淡是最好打破的哪怕只是小小的惊喜
最近工作(学习)顺利吗?交到新朋友么?想我了吗?又天天念我的名字吗?............诸如此类
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁果聊的MM有吗,价格贵点无所谓,真实就好了。请大家帮帮忙高分求解答_百度知道
果聊的MM有吗,价格贵点无所谓,真实就好了。请大家帮帮忙高分求解答
我有更好的答案
按默认排序
给聊要50元钱
QQ给聊,只收50,不过光晚上给聊
破适民霓映膊睁贱糊墟逛果聊的MM有吗,价格贵点无所谓,真实就好了。请大家帮帮忙高分求解答
想知道,你那网名是什么意思?
你看男人你感兴趣么???
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分71 UID阅读权限10积分104帖子精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
白手起家, 积分 104, 距离下一级还需 96 积分
帖子主题精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
论坛徽章:0
本人刚接触linux没多长时间,基本就是小白,狂爱iptables,下面的问题可能对高手来说是愚蠢的,请别嘲笑我正在努力。我想做个抓包的工具,为的是对7层工作有个直接的认识,自己动手学到的东西多。但是抓包之前要看到包,所以卡在这里了,望大家帮忙,查了一星期,度娘和这里都是东一句西一句我是月学月糊涂,真的是不会了所以一口气问了一大堆。
首先:iptables -A OUTPUT -j NFQUEUE
下面的代码有部分减少,减少长度,为了不让大家看着心烦
static u_int32_t print_pkt (struct nfq_data *tb)
int id = 0;
struct nfqnl_msg_packet_hw *
unsigned char *
hwph = nfq_get_packet_hw(tb);
if (hwph) {
int i, hlen = ntohs(hwph-&hw_addrlen);
printf(&hw_src_addr=&);
第一个问题,非常奇怪,将output转到nfqueue时for就不输出,只有再加上input转到nfqueue时,才输出我路由的mac,而且mac值是正确的,为什么hw_addr是进来包的来源mac,那进来包的目的mac怎么获得,那么出去包的来源和目的mac又怎么获得那?
for (i = 0; i & hlen-1; i++)
printf(&%02x:&, hwph-&hw_addr[i]);
printf(&%02x &, hwph-&hw_addr[hlen-1]);
ret = nfq_get_payload(tb, &data);
if (ret &= 0)
printf(&payload_len=%d \n&, ret);
//******************************************************************************************
struct iphdr *ip_1;
第二个问题,感觉data复值给ip就得到ip头,附值给tcp就得到tcp头,附值给ethhdr就得到mac头,因为此程序结果不对,所以不知道自己的感觉对不对,我现在都不知道data到底是什么样子,请高手指点我的感觉对吗?
ip_1=(struct iphdr *)
printf(&check: %d \n&,ip_1-&check); //ip头检查码
第三个问题,我想把frag_off分3部分输出,第一部分是frag_off的二进制的第二位,第二部分是二进制第三位,最后一部分就是frag_off剩余的,不知道printf里怎么写
printf(&frag_off: \n&,ip_1-&frag_off); //3个标志位和分段偏移数
printf(&id: %d\n&,ntohs(ip_1-&id));
//******************************************************************************************
struct tcphdr * tcp_1;
tcp_1=(struct tcphdr *)
printf(&seq: %d \n&,tcp_1-&seq)
printf(&source: %d %d\n&,tcp_1-&source,ntohs(tcp_1-&source));
第四个问题,不知道怎么判断,什么时候需要ntohs,上面的seq和source和dest要不要用ntohl或者ntohs,为什么
第五个问题,我ping我的路由,ping -c 1 192.168.0.1,结只是果是本地放出端口永远是69,ping是icmp包呀,怎么tcp也跟着变动
printf(&dest: %d %d \n&,tcp_1-&dest,ntohs(tcp_1-&dest));
//******************************************************************************************
struct ethhdr *eth1;
eth1=(struct ethhdr *)
unsigned char *ipsd=(unsigned char *)&eth1-&h_
第六个问题,这才是核心问题,下面输出的mac号都不是我主机和路由的mac,不知道怎么改了,真不会了
printf(&h_source: %02X:%02X:%02X:%02X:%02X:%02X \n&,ipsd[0],ipsd[1],ipsd[2],ipsd[3],ipsd[4],ipsd[5]);
printf(&source : %02x:%02x:%02x:%02x:%02x:%02x\n&,eth1-&h_source);
ipsd=(unsigned char *)&eth1-&h_
printf(&h_dest: %02x:%02x:%02x:%02x:%02x:%02x \n&,ipsd[0],ipsd[1],ipsd[2],ipsd[3],ipsd[4],ipsd[5]);
printf(&dest : %02x:%02x:%02x:%02x:%02x:%02x\n&,eth1-&h_dest);
//******************************************************************************************
////////////////////下面的请高手不用看,贴上他只是为了完整性
static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
struct nfq_data *nfa, void *data)
{u_int32_t id = print_pkt(nfa);
return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
int main(int argc, char **argv)
struct nfq_handle *h;
struct nfq_q_handle *
struct nfnl_handle *
char buf[4096] __attribute__ ((aligned));
printf(&opening library handle\n&);
h = nfq_open();
nfq_unbind_pf(h, AF_INET);
nfq_bind_pf(h, AF_INET);
qh = nfq_create_queue(h, 0, &cb, NULL);
nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff);
fd = nfq_fd(h);
while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv &= 0)
nfq_handle_packet(h, buf, rv);
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分71 UID阅读权限10积分104帖子精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
白手起家, 积分 104, 距离下一级还需 96 积分
帖子主题精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
论坛徽章:0
自己定,望大家帮着看看,谢谢
空间积分0 信誉积分208 UID阅读权限10积分144帖子精华可用积分144 专家积分0 在线时间152 小时注册时间最后登录
白手起家, 积分 144, 距离下一级还需 56 积分
帖子主题精华可用积分144 专家积分0 在线时间152 小时注册时间最后登录
论坛徽章:0
本帖最后由 黎明748 于
21:51 编辑
第一个问题,不明意思。
第二个问题,我不知道你这个data是什么意思,从你代码看data是IP头的地址。ip_1=(struct iphdr *)tcp_1=(struct tcphdr *)(data+ip_1.ihl&&2);计算以太网头部类似,貌似数据包先指向以太网首部的吧。
第三个问题,printf(&frag_off: %d\n&,ip_1-&frag_off&0x1);
& && && && && && &printf(&frag_off: %d\n&,(ip_1-&frag_off&0x2)&& 1);
& && && && && && &printf(&frag_off: %d\n&,ip_1-&frag_off&&2);
第四个问题,数据包都是网络字节序,本地用都加ntohl或者ntohs。
第五个问题,不明。既然是ICMP包。哪来的TCP头。
第六个问题,还是网络字节序的问题。加ntohl或者ntohs。
话说你这程序可以用吗?
空间积分0 信誉积分522 UID804748阅读权限30积分1909帖子精华可用积分1909 专家积分0 在线时间483 小时注册时间最后登录
家境小康, 积分 1909, 距离下一级还需 91 积分
帖子主题精华可用积分1909 专家积分0 在线时间483 小时注册时间最后登录
论坛徽章:3
wantaugust
你不但程序不有问题,你IP协议栈都不清楚。
建议你先不写程程序了,学TCP/IP协议的最好办法是用Wireshark抓包来看看,数据包的结构,字段都会解析,说明得很清楚。结合TCP/IP的书就更好了。
你的解析过程错得很离谱,data怎么一会解析成IP头一会解析成TCP头的呢,TCP头是在IP头后面的!别外,你根本没有解析IP头的含义,PING是ICMP协议,你就去强转成TCP头。
不想一个一个问题回答了,因为错得太离谱了。
猫头上的鹰
空间积分0 信誉积分71 UID阅读权限10积分104帖子精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
白手起家, 积分 104, 距离下一级还需 96 积分
帖子主题精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
论坛徽章:0
非常感谢,但是最后一个问题还是不行回复
空间积分0 信誉积分71 UID阅读权限10积分104帖子精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
白手起家, 积分 104, 距离下一级还需 96 积分
帖子主题精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
论坛徽章:0
非常感谢回答我的问题,
7层的知识这学期都学了,我用wireshark也验证了,
代码里有ip tcp udp icmp mac的部分,只是贴代码的时候怕有人看着头疼,所以砍了一部分,实际上ping的时候我只看icmp的那部分输出,握手的时候我只看tcp的部分,但是我发现ping的时候tcp的部分也有奇怪的输出
还有您说的“ata怎么一会解析成IP头一会解析成TCP头的呢”,没错,这正是我的第二个问题,data里到底有什么。我怀疑data是一个类似于结构体的东西,我怀疑是这样的:
struct data
{mac头;ip头;tcp头;udp头;icmp头};
当把他赋值给tcphdr的话,那么data就把他里面的tcp头的部分数据传给tcphdr
空间积分0 信誉积分256 UID阅读权限10积分168帖子精华可用积分170 专家积分0 在线时间103 小时注册时间最后登录
白手起家, 积分 168, 距离下一级还需 32 积分
帖子主题精华可用积分170 专家积分0 在线时间103 小时注册时间最后登录
论坛徽章:0
本帖最后由 inurl 于
10:38 编辑
&&你这个抓包的原理是什么,流程是怎么走的
空间积分0 信誉积分71 UID阅读权限10积分104帖子精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
白手起家, 积分 104, 距离下一级还需 96 积分
帖子主题精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
论坛徽章:0
先用queue把包拿到,那后在用户空间里把包赋值给data,然后把data在给具体的iphdr
空间积分0 信誉积分71 UID阅读权限10积分104帖子精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
白手起家, 积分 104, 距离下一级还需 96 积分
帖子主题精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
论坛徽章:0
估计是我想错了, printf(&payload_len=%d \n&, ret);输出是40,可能data中只有ip和tcp的头,但是不知道怎么从data中得到tcp或者udp的头。因为我在tcp的代码段怎么改,输出结果和wireshark都不一样
这个官网上的定义:
int nfq_get_payload & & & & ( & & & & struct nfq_data *&&& & & & nfad,
& & & & & & & & unsigned char **&&& & & & data& & & &&&
& & & & ) & & & & & & & & & & & &
nfq_get_payload - get payload
Parameters:
& & & & & & nfad & & & & Netlink packet data handle passed to callback function
& & & & & & data & & & & Pointer of pointer that will be pointed to the payload
Retrieve the payload for a queued packet. The actual amount and type of data retrieved by this function will depend on the mode set with the nfq_set_mode() function.
& & -1 on error, otherwise & 0.
Definition at line 1028 of file libnetfilter_queue.c.
struct nfq_data {
& && && &struct nfattr **
struct nfattr是什么我没找到
空间积分0 信誉积分71 UID阅读权限10积分104帖子精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
白手起家, 积分 104, 距离下一级还需 96 积分
帖子主题精华可用积分104 专家积分0 在线时间53 小时注册时间最后登录
论坛徽章:0
data+ip_1.ihl&&2我明白了,但是请问ip_1.ihl为什么要乘4那,
直接在data上加头长不对吗?
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 sesese911主站 的文章

 

随机推荐