linux破解卡到抓包,请大家帮帮忙,真的是不会了,本来想做个抓包工具的,结果卡这了...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

本人刚接触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 *hwph;

int ret;

unsigned char *data;

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 *)data;

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 *)data;

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 *)data;

unsigned char *ipsd=(unsigned char *)&eth1->h_source;

第六个问题,这才是核心问题,下面输出的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_dest;

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);

//******************************************************************************************

return id;

}

下面的请高手不用看,贴上他只是为了完整性

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 *qh;

struct nfnl_handle *nh;

int fd;

int rv;

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值