Linux下sniffer实现(转)
转发网址:https://blog.csdn.net/eqiang8271/article/details/8489769
- //Example 1.
- #include <stdio.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <linux/in.h>
- #include <linux/if_ether.h>
- #include <unistd.h>
- #include <stdlib.h>
- int main(int argc, char **argv) {
- int sock, n;
- char buffer[];
- unsigned char *iphead, *ethhead;
- if ((sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))<) {
- perror("socket");
- exit();
- }
- while () {
- printf("----------\n");
- n = recvfrom(sock,buffer,,,NULL,NULL);
- printf("%d bytes read\n",n);
- /* Check to see if the packet contains at least
- * complete Ethernet (14), IP (20) and TCP/UDP
- * (8) headers.
- */
- if (n<) {
- perror("recvfrom():");
- printf("Incomplete packet (errno is %d)\n", errno);
- close(sock);
- exit();
- }
- ethhead = buffer;
- printf("Source MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
- ethhead[],ethhead[],ethhead[],ethhead[],ethhead[],ethhead[]);
- printf("Destination MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
- ethhead[],ethhead[],ethhead[],ethhead[],ethhead[],ethhead[]);
- iphead = buffer+; /* Skip Ethernet header */
- if (*iphead==0x45) { /* Double check for IPv4 and no options present */
- printf("Source host: %d.%d.%d.%d\n", iphead[], iphead[], iphead[], iphead[]);
- printf("Dest host: %d.%d.%d.%d\n", iphead[], iphead[], iphead[], iphead[]);
- printf("Source,Dest ports %d,%d\n", (iphead[]<<)+iphead[], (iphead[]<<)+iphead[]);
- printf("Layer-4 protocol %d\n",iphead[]);
- }
- }
- }
- //Example 2.
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <linux/in.h>
- #include <linux/if_ether.h>
- #include <net/if.h>
- #include <sys/ioctl.h>
- #include <unistd.h>
- #include <stdlib.h>
- int main(int argc, char **argv) {
- int sock, n;
- char buffer[];
- unsigned char *iphead, *ethhead;
- struct ifreq ethreq;
- if ( (sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))<) {
- perror("socket");
- exit();
- }
- /* Set the network card in promiscuos mode */
- strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);
- if (ioctl(sock,SIOCGIFFLAGS,ðreq)==-) {
- perror("ioctl");
- close(sock);
- exit();
- }
- ethreq.ifr_flags|=IFF_PROMISC;
- if (ioctl(sock,SIOCSIFFLAGS,ðreq)==-) {
- perror("ioctl");
- close(sock);
- exit();
- }
- while () {
- printf("----------\n");
- n = recvfrom(sock,buffer,,,NULL,NULL);
- printf("%d bytes read\n",n);
- /* Check to see if the packet contains at least
- * complete Ethernet (14), IP (20) and TCP/UDP
- * (8) headers.
- */
- if (n<) {
- perror("recvfrom():");
- printf("Incomplete packet (errno is %d)\n", errno);
- close(sock);
- exit();
- }
- ethhead = buffer;
- printf("Source MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
- ethhead[],ethhead[],ethhead[],ethhead[],ethhead[],ethhead[]);
- printf("Destination MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
- ethhead[],ethhead[],ethhead[],ethhead[],ethhead[],ethhead[]);
- iphead = buffer+; /* Skip Ethernet header */
- if (*iphead==0x45) { /* Double check for IPv4 and no options present */
- printf("Source host %d.%d.%d.%d\n", iphead[],iphead[],iphead[],iphead[]);
- printf("Dest host %d.%d.%d.%d\n",iphead[],iphead[],iphead[],iphead[]);
- printf("Source,Dest ports %d,%d\n",(iphead[]<<)+iphead[],(iphead[]<<)+iphead[]);
- printf("Layer-4 protocol %d\n",iphead[]);
- }
- }
- }
使用BPF的这个可能有问题:
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <linux/in.h>
- #include <linux/if_ether.h>
- #include <net/if.h>
- #include <linux/filter.h>
- #include <sys/ioctl.h>
- int main(int argc, char **argv) {
- int sock, n;
- char buffer[];
- unsigned char *iphead, *ethhead;
- struct ifreq ethreq;
- /*my ip: 10.219.119.23 == 0x0adb7716*/
- /*
- udp and host 192.168.13.41 and src port 5000
- (000) ldh [12]
- (001) jeq #0x800 jt 2 jf 14
- (002) ldb [23]
- (003) jeq #0x11 jt 4 jf 14
- (004) ld [26]
- (005) jeq #0x0adb7716 jt 8 jf 6
- (006) ld [30]
- (007) jeq #0x0adb7716 jt 8 jf 14
- (008) ldh [20]
- (009) jset #0x1fff jt 14 jf 10
- (010) ldxb 4*([14]&0xf)
- (011) ldh [x + 14]
- (012) jeq #0x1388 jt 13 jf 14
- (013) ret #68
- (014) ret #0
- */
- struct sock_filter BPF_code[]= {
- { 0x28, , , 0x0000000c },
- { 0x15, , , 0x00000800 },
- { 0x30, , , 0x00000017 },
- { 0x15, , , 0x00000011 },
- { 0x20, , , 0x0000001a },
- { 0x15, , , 0x0adb7716 },
- { 0x20, , , 0x0000001e },
- { 0x15, , , 0x0adb7716 },
- { 0x28, , , 0x00000014 },
- { 0x45, , , 0x00001fff },
- { 0xb1, , , 0x0000000e },
- { 0x48, , , 0x0000000e },
- { 0x15, , , 0x00001388 },
- { 0x6, , , 0x00000044 },
- { 0x6, , , 0x00000000 }
- };
- struct sock_fprog Filter;
- Filter.len = ;
- Filter.filter = BPF_code;
- if ( (sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))<) {
- perror("socket");
- return -;
- }
- /* Set the network card in promiscuous mode 设置网卡为混杂模式*/
- strncpy(ethreq.ifr_name,"eth3",IFNAMSIZ); //hardcode, please check your computer: $ifconfig
- if (ioctl(sock,SIOCGIFFLAGS,ðreq)==-) {
- perror("ioctl");
- close(sock);
- return -;
- }
- ethreq.ifr_flags|=IFF_PROMISC;
- if (ioctl(sock,SIOCSIFFLAGS,ðreq)==-) {
- perror("ioctl");
- close(sock);
- return -;
- }
- /* Attach the filter to the socket */
- if(setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter))<){
- perror("setsockopt");
- close(sock);
- return -;
- }
- while () {
- printf("----------\n");
- n = recvfrom(sock,buffer,,,NULL,NULL);
- printf("%d bytes read\n",n);
- /* Check to see if the packet contains at least
- * complete Ethernet (14), IP (20) and TCP/UDP
- * (8) headers.
- */
- if (n<) {
- perror("recvfrom():");
- printf("Incomplete packet (errno is %d)\n", errno);
- close(sock);
- return ;
- }
- ethhead = buffer;
- printf("Source MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
- ethhead[],ethhead[],ethhead[],ethhead[],ethhead[],ethhead[]);
- printf("Destination MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
- ethhead[],ethhead[],ethhead[],ethhead[],ethhead[],ethhead[]);
- iphead = buffer+; /* Skip Ethernet header */
- if (*iphead==0x45) { /* Double check for IPv4 and no options present */
- printf("Source host %d.%d.%d.%d\n", iphead[],iphead[],iphead[],iphead[]);
- printf("Dest host %d.%d.%d.%d\n", iphead[],iphead[], iphead[],iphead[]);
- printf("Source,Dest ports %d,%d\n", (iphead[]<<)+iphead[], (iphead[]<<)+iphead[]);
- printf("Layer-4 protocol %d\n",iphead[]);
- }
- }
- }
Linux下sniffer实现(转)的更多相关文章
- Linux下的sniffer工具--TcpDump的安装和使用
在如今众多的黑客技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一. 用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共 ...
- Linux下一个简单sniffer的实现
Sniffer(嗅探器)是一种基于被动侦听原理的网络分析方式.将网络接口设置在监听模式,便可以将网上传输的源源不断的信息截获.对于网络监听的基本原理我们不在赘述,我们也不开启网卡的混杂模式,因为现在的 ...
- Linux下不同服务器间数据传输--转载
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- Linux下不同服务器间数据传输
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)
linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举 ...
- linux下常用文件传输命令 (转)
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- linux如何ARP嗅探 Linux下嗅探工具Dsniff安装记录
先来下载依赖包 和一些必须要用到的工具 我这里用的是 dsniff-2.3 的版本 wget http://www.monkey.org/~dugsong/dsniff/dsniff-2.3.ta ...
- linux下常用文件传输命令(转)
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- linux下不同服务器间数据传输(wget,scp)
一.wget是Linux下最常用的http/ftp文件下载工具1.wget断点续传,只需要加上-c参数即可,例如:代码:wget-chttp://www.abc.com/abc.zip-Oabc.zi ...
随机推荐
- hdu5141 线段树
这题说的是给了一串然后计算出这个串的最长递增子序列的长度,然后计算出有过少个子串[i,j] 他们的最长递增子序列和这整个子串的最长递增子序列相同,我们对于每个j最长递增子序列找出他在序列中的使成为最长 ...
- EF Code First 学习笔记:表映射(转)
多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Per ...
- 独家揭秘,106岁的IBM靠什么完成了世纪大转型|钛度专访
IBM大中华区董事长陈黎明 到2017年2月,陈黎明就担任IBM大中华区董事长整整两年了. 五年前,IBM历史上首位女CEO也是第9位CEO罗睿兰上任,三年前,IBM在罗睿兰的带领下以数据与分析.云. ...
- 【转载】IEEE754 学习总结
以下是参考<IEEE754 学习总结>并结合自己学习总结 一:前言二:预备知识 三:浮点数的表示范围四:将浮点格式转换成十进制数 一:前言 前不久在分析一个程序的过程中遇到了浮点运算,也就 ...
- Mindoc搭建流程
1,安装MySql 2,官网下载:https://github.com/lifei6671/mindoc/releases mindoc_windows_amd64.7z 3,如果下载的压缩包中不存在 ...
- win2008R2 bitnami 安装 wamp
下载官方版本:bitnami-wampstack-5.6.30-1-windows-x64-installer.exe 用管理员权限安装,不然mysql服务可能会安装不上.
- usb_submit_urb
hub_irq() --> usb_submit_urb() usb_start_wait_urb() --> usb_submit_urb() 一旦urb被USB驱动程序正确地创建和初始 ...
- hexo + Github 搭建问题综述
1.Mac下安装hexo Error: Cannot find module './build/Release/DTraceProviderBindings 解决: solution 2.node s ...
- spring boot2 基于百度云apiface实现人脸检测与认证2
接上一篇,上篇只实现了人脸的认证,接下来实现人脸的检测. 原理介绍: 把摄像头抓拍的图像上传到服务器,服务器把图像上传到百度云,百度云返回识别出的人脸的数量和位置,前端根据服务端的返回,在图像中画出人 ...
- git submodule临时分支;以及git reset使用
submodule 已经建立好了一个gitlab submodule形式的repo: 在repo A下面有一个submodule B, A --> B. clone -b branch [rep ...