免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 世事皆虚幻
打印 上一主题 下一主题

[内核模块] 在模块加载时构造SYN包并发送到本机 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2016-05-07 11:22 |只看该作者
本帖最后由 世事皆虚幻 于 2016-05-07 11:50 编辑

回复 10# 世事皆虚幻


    目前最新进展:调用以下函数,可以向上层发送 SYN 报文,服务端会向客户端发送 SYN+ACK, 但是该函数会卡在 dst_input, 这个函数出不来,咋回事儿呢?

  1. int SendTcpPacket(__be32 sip, __be16 sport, __be32 dip, __be16 dport, __be32 seq, __u8 syn, __u8 fin, __u8 rst, __u8 ack, __be32 seq_ack)
  2. {
  3.     struct dst_entry* dest = NULL;
  4.     struct sk_buff *skb;
  5.     struct tcphdr* tcph;
  6.     struct iphdr *iph;
  7.     int ip_payload_size;
  8.     int result;

  9.     skb = alloc_skb(MAX_TCP_HEADER, GFP_ATOMIC|__GFP_ZERO);
  10.     if (skb == NULL)
  11.     {
  12.         printk(KERN_ALERT"Failed to alloc_skb\n");
  13.         return -1;
  14.     }
  15.     skb_reserve(skb, sizeof(struct iphdr) + sizeof(struct tcphdr));

  16.     // TCP header
  17.     tcph = (struct tcphdr *)skb_push(skb, sizeof(struct tcphdr));
  18.     tcph->source  = sport;
  19.     tcph->dest    = dport;
  20.     tcph->doff    = (sizeof(struct tcphdr) >> 2);
  21.     tcph->psh     = 0;
  22.     tcph->seq     = seq;
  23.     tcph->syn     = syn;
  24.     tcph->fin     = fin;
  25.     tcph->rst     = rst;
  26.     tcph->ack     = ack;
  27.     tcph->ack_seq = seq_ack;
  28.     tcph->window  = htons(0xFFFF);
  29.     skb_reset_transport_header(skb);

  30.     // IP Header
  31.     iph = (struct iphdr *)skb_push(skb, sizeof(struct iphdr));
  32.     iph->ihl      = (sizeof(struct iphdr) >> 2);
  33.     iph->version  = 4;
  34.     iph->tot_len  = htons(skb->len);
  35.     iph->ttl      = 64;
  36.     iph->tos      = 0;
  37.     iph->protocol = IPPROTO_TCP;
  38.     iph->saddr    = sip;
  39.     iph->daddr    = dip;
  40.     ip_send_check(iph);
  41.     skb_reset_network_header(skb);

  42.     ip_payload_size = skb->len - sizeof(struct iphdr);
  43.     skb->csum = skb_checksum(skb, sizeof(struct iphdr), ip_payload_size, 0);
  44.     tcph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, ip_payload_size, iph->protocol, skb->csum);
  45.     skb->ip_summed = CHECKSUM_UNNECESSARY;
  46.     //skb->ip_summed = CHECKSUM_NONE;
  47.     skb->pkt_type = PACKET_HOST;

  48.     {
  49.         struct rtable *rt;                /* Route to the other host */
  50.         struct flowi fi;

  51.         memset(&fi, 0, sizeof(struct flowi));
  52.         fi.fl4_dst = sip;
  53.         //fi.proto = IPPROTO_IPIP;

  54.         if (0 != ip_route_output_key(&init_net, &rt, &fi))
  55.         {
  56.             return -1;
  57.         }

  58.         if (NULL == rt)
  59.         {
  60.             return -1;
  61.         }

  62.         dest = &rt->u.dst;
  63.         //dev_hold(dest->dev);
  64.     }

  65.     skb->dev = dest->dev;
  66.     skb_dst_set(skb, dest);

  67.     result = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dest->dev);
  68.     if (unlikely(result))
  69.     {
  70.         // Host Unreachable
  71.         printk(KERN_ALERT"Failed to ip_route_input\n");
  72.         return -1;
  73.     }

  74.     result = dst_input(skb);
  75.     if (result != NET_RX_SUCCESS)
  76.     {
  77.         kfree_skb(skb);
  78.         printk(KERN_ALERT"Failed to send packet. ErrCode=%d\n", result);
  79.     }
  80.     else
  81.     {
  82.         printk(KERN_ALERT"Send packet succeeded from %pI4:%d to %pI4:%d\n", &sip, ntohs(sport), &dip, ntohs(dport));
  83.     }

  84.     return 0;
  85. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2016-05-07 12:32 |只看该作者
结贴,已搞定,多谢关注~

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
13 [报告]
发表于 2016-05-08 21:15 |只看该作者
回复 12# 世事皆虚幻

欢迎分享一下解决的方法。


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
14 [报告]
发表于 2016-05-09 20:29 |只看该作者
卡在?
难道产生了递归调用,要不然总会有个结果出来吧?
(没有跟踪具体上下文)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP