接着上一篇文件:使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包

上一篇文章我们使用wireshare抓包。尽管在Linux下也能够使用抓包工具,可是我打算自己动手,在内核添加以太网处理类型。

先上码:

#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <net/rtnetlink.h>
#include <net/netns/generic.h>
#include <linux/etherdevice.h>

#define DRV_VERSION "0.1"

const char brcm_fullname[] = "BRCM Support";
const char brcm_version[] = DRV_VERSION;
static const char brcm_copyright[] = "dean <350532197>";
static const char brcm_buggyright[] = "dean <350532197>";
void hook_func(struct sk_buff *skb)
{
    struct sk_buff *sb = skb;
    struct ethhdr *eth;
    eth=eth_hdr(sb);

    printk(KERN_INFO "SRC MAC: %pM\n",&eth->h_source);
    printk(KERN_INFO "DST MAC: %pM\n",&eth->h_dest);
    printk(KERN_INFO "MAC protocol: %04x\n",ntohs(eth->h_proto));
    printk(KERN_INFO "Date length=%d, Data=%s\n",sb->len,sb->data);
}

int brcm_skb_recv(struct sk_buff *skb, struct net_device *dev,
 struct packet_type *ptype, struct net_device *orig_dev)
{
      hook_func(skb);
kfree_skb(skb);
return NET_RX_DROP;
}

static struct packet_type brcm_packet_type __read_mostly = {
.type = cpu_to_be16(0x8874),
.func = brcm_skb_recv, /* BRCM receive method */
};

static int __init brcm_proto_init(void)
{
pr_info("%s v%s %s\n", brcm_fullname, brcm_version, brcm_copyright);
pr_info("All bugs added by %s\n", brcm_buggyright);
dev_add_pack(&brcm_packet_type);
return 0;
}

static void __exit brcm_cleanup_module(void)
{
dev_remove_pack(&brcm_packet_type);
}

module_init(brcm_proto_init);
module_exit(brcm_cleanup_module);

MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION);

编译载入执行:

/tmp # insmod my_brcm.ko 
[ 8961.342368] BRCM Support v0.1 dean <350532197>
[ 8961.349598] All bugs added by dean <350532197>
/tmp # [ 8981.887476] SRC MAC: 00:15:17:28:e4:06
[ 8981.891233] DST MAC: 00:0b:82:27:fd:e4
[ 8981.894999] MAC protocol: 8874
[ 8981.898057] Date length=46, Data=hello world!

client使用使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包编译出来的软件发送helloworld。

能够看出。此模块正确获取到数据包。

感谢yoyo的文章Linux内核实践 - 怎样加入网络协议

http://blog.csdn.net/qy532846454/article/details/6627536

使用dev_add_pack注冊新的以太网类型的更多相关文章

  1. WordPress改动新用户注冊邮件内容--自己定义插件

    有些开放用户注冊功能的WordPress站点,可能有这么一项需求,就是用户注冊成功后,系统会分别给站点管理员和新用户发送一封通知邮件.给管理员发送的是新用户的username和Email,给刚刚注冊的 ...

  2. WordPress公布新文章Email通知注冊用户

    非常多WordPress博客都开放了用户注冊的功能,用户能够參与到博客的内容建设其中来.也就是一个博客由多个用户来写.如今有这种需求,怎样实如今某一个用户发表文章后.其它用户都能收到Email通知?以 ...

  3. c++ 操作注冊表

    1.       注冊表简单介绍 注冊表是为Windows NT和Windows95中全部32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (W ...

  4. Android应用程序注冊广播接收器(registerReceiver)的过程分析

    前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/公布机制,因此,使用这样的消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息事实上就是注冊广播接收器, ...

  5. EtherType :以太网类型字段及值

    Ethernet II即DIX 2.0:Xerox与DEC.Intel在1982年制定的以太网标准帧格式.Cisco名称为:ARPA Ethernet II类型以太网帧的最小长度为64字节(6+6+2 ...

  6. Android Binder分析二:Natvie Service的注冊

    这一章我们通过MediaPlayerService的注冊来说明怎样在Native层通过binder向ServiceManager注冊一个service,以及client怎样通过binder向Servi ...

  7. Spring Boot 使用Java代码创建Bean并注冊到Spring中

    从 Spring3.0 開始,添加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式 ...

  8. 《解读window核心编程》 之 注冊表

    1 注冊表的作用及组织形式 Windows系统使用注冊表来存储系统和应用程序配置数据.非常多系统和应用程序重要的配置的信息都存储在注冊表中. 注冊表是一种以树型结构组织的数据库.树的每个节点称 作键( ...

  9. 从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)

    前言 因为一个同学问到我怎样依照一个流程走好之后回到首页.我曾经看到过4个解决方式,后来发现有做个记录和总结的必要,就写了这篇博文. (之前看小强也写过一篇,这里通过自身的分析完整的总结一下下面6种方 ...

随机推荐

  1. Entity Framework 并发处理(转)

    什么是并发? 并发分悲观并发和乐观并发. 悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档锁住,B就没办法打开了,只有等A修改完,完全退出的时候B才能进入修 ...

  2. cocos2dx 3.x 拼图小游戏

    .h #define IMAGE_MAX 2 //图片的个数.. //图片结构体 属性 struct IMAGE_DATA { cocos2d::Sprite *m_pImage; bool m_bO ...

  3. python面向对象编程基础

    演示了 Python 类与对象的编程基础, 包括属性.方法.继承.组合.动态创建类. python 版本: 2.7.5 class SimpleClass(object): ''' a simple ...

  4. Horizon代码的层次结构

    Horizon中包含多个dashboard,每个dashboard又包含多个panel,每个panel有可以包含多个Tab.

  5. 远程连接软件TeamViewer

    (1)先在windows下安装Teamviewer软件,地址:https://pan.baidu.com/s/1rWxRBtNbn3OMmg-8YaYWRQ (2)再在linux下安装Teamview ...

  6. unhandledException详细介绍

    http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html 1. GC 产生的异常,这种异常通常因为Finalize函数中引发未捕获异常 ...

  7. P1314 聪明的质监员(前缀和+二分)

    P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...

  8. git仓库迁移的两种解决方案

    Git仓库迁移而不丢失log的方法 要求能保留原先的commit记录,应该如何迁移呢? 同时,本地已经clone了原仓库,要配置成新的仓库地址,该如何修改呢? 注意:如果使用了代码审核工具Gerrit ...

  9. How to install tensorflow from source on ubuntu 18.04 64bit

    1,install dependencies sudo apt-get install openjdk-8-jdk git python-dev python3-dev python-numpy py ...

  10. 【找不到符号】Maven打包找不到符号的问题排查

    当碰到maven错误:找不到符号问题时,通常第一反应应该是执行eclipse的Project -> Clean … -> Clean all projects,然后再执行maven cle ...