当前位置:  技术问答>linux和unix

如何在linux下编一个网络抓包的程序,不能用libcap

    来源: 互联网  发布时间:2015-08-16

    本文导语:  想利用linux的源代码的一部分来实现这个功能,但是不知道怎么做,在源代码的那个部分能找到这个功能,而且对协议栈的原理不大熟;   请指教,谢谢!!! | gcc -c test3.c -o test3~.o -I/usr...

想利用linux的源代码的一部分来实现这个功能,但是不知道怎么做,在源代码的那个部分能找到这个功能,而且对协议栈的原理不大熟;
  请指教,谢谢!!!

|
gcc -c test3.c -o test3~.o -I/usr/src/linux-2.4.20-8/include -Wall -D__KERNEL__
ld -r -o test3.o test3~.o -L/usr/lib -lc
这样编译如下模块test3.o
然后用root就可以insmod它到内核模块,就可以截取网络包,具体实现按你的想法改
我这个做的事拒绝来至 192.168.8.201的所有数据包
#define MODULE
        
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
    
static struct nf_hook_ops nfho;
unsigned char* ip = "x7fx00x00x01";
unsigned char* drop_ip = "xC0xA8x08xC9";
        
unsigned int hook_func(unsigned int hooknum,
                       struct sk_buff **skb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *))
{   
        struct sk_buff* sb = *skb;
        struct tcphdr *tcp = NULL;
        unsigned int d_ip ,s_ip = 0;
        unsigned int d_port = 0,s_port = 0;
        if( sb->nh.iph->protocol == IPPROTO_TCP )
                tcp = (struct tcphdr *)((sb->data) + (sb->nh.iph->ihl * 4));
        d_ip = sb->nh.iph->daddr;
        s_ip = sb->nh.iph->saddr;
        if( tcp )
        {
                d_port = tcp->source;
                s_port = tcp->dest;
        }
        if( sb->nh.iph->saddr == *(unsigned int*)drop_ip )
        {
                        printk( "Droped packet from ... %d.%d.%d.%d:%dn", NIPQUAD(s_ip), s_port );
                        return NF_DROP;
        }
//      printk( "FROM:%d.%d.%d.%d:%d TO:%d.%d.%d.%d:%d ETH:%sn",
//      NIPQUAD(s_ip), s_port, NIPQUAD(d_ip), d_port, in->name );
        return NF_ACCEPT;
}

int init_module()
{
        printk( "begin init module test2n" );
    nfho.hook     = hook_func;
    nfho.hooknum  = NF_IP_PRE_ROUTING;
    nfho.pf       = PF_INET;
    nfho.priority = NF_IP_PRI_FIRST;

    nf_register_hook(&nfho);
        printk("init module test2n");
    return 0;
}

void cleanup_module()
{
    nf_unregister_hook(&nfho);
        printk("cleanup module test2n");
}

MODULE_LICENSE("GPL");

|
首先你要确定你要在内核层抓包还是应用层.内核抓包用添加模块了,linux在内核网络栈上留了5个点就是用来扩展的.应用层抓包用raw socket,就是fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
man 7 socket有详细介绍.
前面一个方法比较复杂一点,一天两天也写不好的.后面一个就是套接字编程了.

|
linux平台下捕获数据包的程序,分为两个,一个是capture.c,另一个是handle.c。前一个是用于捕获数据包的,按CTRL+C退出。捕获的数据包存储在packet.dat文件中,供分析用。后一个是输出数据包中内容的。
// capture.c
// gcc -W -Wall -Wno-unused -ggdb -o capture capture.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include

#define DEFAULT_DEVICE_NAME "eth0"
#define DEFAULT_RECORD_FILENAME "packet.dat"

typedef unsigned char uchar;

int RecordFile;
int Packet;
int PacketCount = 0;
char *RecordFileName = DEFAULT_RECORD_FILENAME;
char *DeviceName = DEFAULT_DEVICE_NAME;
short int DefaultFlag;
struct ifreq ifr;

void ArgInit( int argc, char **argv )
{
}

void Shutdown( int signum )
{
fdatasync( RecordFile );
close( RecordFile );
ifr.ifr_flags = DefaultFlag;
ioctl( Packet, SIOCSIFFLAGS, &ifr );
close( Packet );
fprintf( stdout, "Capture %d packetsn", PacketCount );
exit( 0 );
}

void AppInit( void )
{
RecordFile = open( RecordFileName, O_RDWR | O_CREAT | O_TRUNC );
if ( RecordFile 

    
 
 

您可能感兴趣的文章:

  • 一段可以在linux下编译并且运行正确的程序,在windows下编译也通不过.为什么?
  • 刚安装linux,如何在linux下编写程序?
  • 要在linux下编写关于openssl的程序,并要封装成.cab供win安装ActiveX
  • 怎样在linux下编译java?
  • 如何在linux下编写c程序
  • linux下编译firefox的问题
  • 在linux下编c程,找库
  • 急!急!急!急!急!如何在Linux下编译运行C++程序
  • 请问如何在linux环境下编写C++
  • 怎么在LINUX下编译JAVA?
  • ★★★在linux下编译pro*c文件,提示"sqlcxt"没有定义,哪位高手帮忙,定赠分!
  • 大家在UNIX/LINUX下编写C/C++程序时,用那些库?
  • 如何在linux下编写C程序?
  • 求教在LINUX下编写应用程序
  • 如何在linux下编译.pc程序
  • 请教:Linux下编译c代码,运行程序时出现undefined symbol exp
  • 求在Windows下编译Linux C程序的快捷途径?
  • linux下编译ACE5.7.5(总结)
  • linux下编译c++程序,系统头文件中包含的函数的定义源代码可以查看吗?
  • windows下编写的JAVA程序如何放到Linux下运行??
  • 在Linux下访问Windows的NTFS分区为什么不能写,也不能删里面的东西?
  • 在LINUX下不能拷影碟还是不能拷.dat文件??
  • 在linux下面使用相关的硬件,为何不能,系统不能检测到modem,网卡,以及其他,请教
  • 中文问题:我使用的是MEPIS Linux,系统不能显示中文,我能不能把Redhat中的中文字体移植到这个系统中?
  • 救急!Linux下WAS4.0不能启动(DB2 数据库也不能启动)
  • Linux 下面能能不能把linux自己消除
  • 我在VMWARE上装LINUX的 ,安装时不能检测到 我的显卡的型号,安装好后不能进入KDE,高分求助啊
  • 用linux启动盘不能引导linux????
  • 能不能不重装linux而恢复引导进入linux?
  • win7 和linux双系统,用LINUX不能上网
  • 在先装windowsxp,后装linux的情况下,不能进入linux
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下通过crond实现自动执行程序
  • 为什么linux下的C++程序这么少见? 请问那里有linux下的C++程序?什么类型的程序都可以.
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • linux上的程序怎样远程启动另一个linux系统上的某个程序
  • 如何使用linux下gdb来调试python程序
  • 在linux下面怎么安程序啊?我刚裝了一个 linux,下了一个迅雷安装程序,可是不知道怎么安装啊?真心请教。
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • Linux程序员在公司里做什么程序?(Linux程序员请进)
  • 我的linux程序 如何 在pc机器上运行。现在我用arm-linux-g++ 编译后的程序在我的嵌入设备上运行。
  • Linux 编程怎么样在程序开启一个程序,和关闭一个程序?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠
  • linux初学者一简单问题!在线送分!linux设备驱动程序一书的第一个程序.
  • 最进想学习LINUX程序设计,想了解一下在LINUX下的C++程序开发工具有哪些?有快速做界面的那种吗?
  • 我写了个linux下的网络程序,程序在多个电脑间通信,但是我没有多个电脑,怎么调试这样的程序啊?
  • linux下,一个程序如何向另一个程序发送消息,另一个程序如何接收
  • 请问载linux下如何调试汇编程序,有没有像debug的程序。
  • linux的程序员是不是比windows程序员的薪水高啊?
  • 菜鸟求助:Linux 应用程序后台启动后关闭窗口程序退出
  • 请教:如何在linux服务器上实现一个程序,该程序可启动远程linux客户端上的一个脚本(sh后缀)的执行
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3