- 论坛徽章:
- 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 *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 *)ð1->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 *)ð1->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;
}
|
|