gpt4 book ai didi

c - 如何发送ping数据包

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:58 25 4
gpt4 key购买 nike

我制作了一个模块,旨在从用户空间(应用程序)使用 ioctl 命令发送 ping 数据包。但是我不确定它是否发送 ping 数据包,因为当我尝试通过 Hook 函数接收数据包时,没有回复它。我正在将 ping 数据包发送到路由器 (192.168.1.1)。以下是我的代码,它的编译和运行没有错误:

int device_ioctl(struct net_device *dev,struct ifreq *ifr, int cmd)
{

int len;

//printk("%s , %d",__func__,__LINE__);
switch(cmd)
{
case SIOCDEVPRIVATE:
printk("here it is : %s: %d\n",__func__,__LINE__);
break;

case WLAN_TRANSMIT :
icmp.type = ICMP_ECHO;
icmp.code = 0;
icmp.un.echo.sequence = i++;
icmp.un.echo.id = current->pid & 0xFFFF;
printk(KERN_ALERT"ID::%X\n",icmp.un.echo.id);
ip4.protocol = 0x01; //for icmp protocol
ip4.tos = 0x00;
ip4.frag_off = 0;
ip4.daddr = in_aton(procfs_buffer);
ip4.saddr = in_aton(ifr->ifr_addr.sa_data);
len = sizeof(data);
skb = dev_alloc_skb(1500);
skb->dev = __dev_get_by_name(&init_net,"wlan0");
skb_reserve(skb,NET_IP_ALIGN); //header of 2 bytes; increments tail and data pointer
skb->data = skb_put(skb,sizeof(len)); // increments all pointer or adds data
memcpy(data,skb->data,len);
wdev = skb->dev;
skb->transport_header =skb_push(skb,sizeof(icmp));
memset(skb->transport_header,0,sizeof(struct icmphdr));
memcpy(skb->transport_header,&icmp,sizeof(struct icmphdr));

skb->network_header=skb_push(skb,sizeof(ip4));
memset(skb->network_header,0,sizeof(struct iphdr));
memcpy(skb->network_header,&ip4,sizeof(struct iphdr));
// printk("i::%d\n",i);
// skb->mac_header = skb_push(skb,6*sizeof(0xFF));
// memset(skb->mac_header,0xFF,6*sizeof(0xFF));
dev_queue_xmit(skb);

// kfree(skb);
}

return 0;
}

unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb1, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
struct sk_buff *sock_buff;
struct iphdr *ip1;
struct icmphdr *icmp1;
sock_buff = skb1;
//printk("ihere we are::%s,%d\n",__func__,__LINE__);
ip1 = (struct iphdr *)skb_network_header(sock_buff);
//printk(KERN_ALERT"proto:%d,addr:%X::%X\n",ip1->protocol,ip1->saddr,ip1->daddr);
if(ip1->protocol==1)
{
printk(KERN_ALERT"proto:%d,addr:%X::%X\n",ip1->protocol,ip1->saddr,ip1->daddr);
icmp1 = (struct icmphdr *)skb_transport_header(sock_buff);
printk(KERN_ALERT"reply type: %c,,seq : %04X\n",icmp1->type,icmp1->un.echo.id);
}
// kfree(sock_buff);
return NF_ACCEPT;

}

钩子(Hook)函数工作正常,但不确定如何发送 ping 数据包(有疑问,因为没有收到回复数据包)。

问候

卡兰

最佳答案

您可以以 root 身份使用以下命令检查 ping 是否超出您的范围:

# tcpdump -i eth0 icmp

当然,将 eth0 替换为您机器的真实接口(interface)名称。此命令将转储该接口(interface)中的所有 ICMP 流量,因此您应该能够检查发生了什么。

关于c - 如何发送ping数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9334428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com