raw socket应用实例

本文介绍如何使用Raw Socket编程技术捕获特定源地址的TCP数据包,并解析其内容。通过示例代码展示了创建Raw Socket的过程及如何从接收到的原始数据中提取关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于最近要做一些没有传输层以及应用层的协议探测程序,所需普通的socket就无法用了,因为这些协议是没有端口的,比如ping,就是用的ip层的icmp,而arp和rarp是在数据链路层上的应用,所以我只能用raw socket。下面用一个实例来解释raw socket的应用。才开始学,蛮肤浅的。

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#define BUFFER_MAX 1500

#define get_u32(X,O)  (*(__u32 *)(X + O))
#define get_u16(X,O)  (*(__u16 *)(X + O))
#define get_u8(X,O)  (*(__u8 *)(X + O))


int main(int argc, char *argv[])
{
        
        int sock, n_read, proto;        
        char buffer[BUFFER_MAX];
        char ip[1024]={'\0'};
        char  *ethhead, *iphead, *tcphead, 
                         *udphead, *icmphead, *p;
        
				if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0)
				    {
				        fprintf(stdout, "create socket error\n");
				        exit(0);
				    }
        
				while(1) 
				{
				     n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
							if(n_read < 42) 
							   {
							      fprintf(stdout, "Incomplete header, packet corrupt\n");
							      continue;
							   }
							 
							                
				        ethhead = buffer;
				        p = ethhead;
				        int n = 0XFF;
				        
				        iphead=buffer+26;
				        unsigned long source_ip=get_u32(iphead,0);
				        
				        
				        if(inet_addr("172.18.4.155")==source_ip)
				        {
				        	
				        	if(get_u8(buffer+23,0)==0x06)
				        	{
				        		printf("tcp package\n");		
				        	}
				        	
				        }
				   }
}

 


上面这个程序就是打印所有经过我们网卡的,源地址是172.18.4.155 的tcp 包。

从raw socket 接受过来的buffer 的地址是数据链路层的地址,具体我们获取的东西就是通过偏移量来,这个偏移量我们需要查看网络书或者抓个包分析下链路层的数据格式等等。

其实从这个程序来看,我们可以获取所有经过我们网卡的信息,比如QQ的文件传输等。

比如我们的防火墙上加这样一个程序,就可以获取所有通过我们墙的信息,比如封堵qq 等。

当然正式的强不可能是这样些,效率低下。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值