⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netlink_local.c

📁 linux netfilterNF_IP_LOCAL_IN处将发给本机的包用netlink重定向到用户空间
💻 C
字号:
#include <sys/socket.h>#include <linux/types.h>#include <linux/netlink.h>#define MAX_PAYLOAD 1024  /* maximum payload size*/#define NETLINK_RECV_1 30
#define ILV_TOTAL_NUMBER 3 

typedef struct TagRedirILVToLFB
{
     unsigned long dwMetaDataID;
     unsigned long dwMetaDataLength;
    void *pvMetaData;
}TRedirILVToLFB;

typedef struct TagRedirectDataToLFB{
    unsigned long dwILVNum;
    TRedirILVToLFB *ptILVs;
    unsigned long dwRedirectDataLength;
    void *pvRedirectData;
}TRedirectDataToLFB;

typedef struct TagRedirectData
{    
	unsigned long dwPortID;   
	unsigned long dwRedirectDataLength;    }TRedirectData;
void main() {	struct sockaddr_nl src_addrl, dest_addrl;	struct nlmsghdr *nlhl = NULL;	struct msghdr msgl;	struct iovec iovl;	int sockfd;	TRedirectData *pTempRedirData;
	TRedirectDataToLFB tTempRedirData;	sockfd = socket(PF_NETLINK, SOCK_RAW, NETLINK_RECV_1);	printf("%d\n",sockfd);	memset(&msgl, 0, sizeof(struct msghdr));	memset(&iovl, 0, sizeof(struct iovec));	memset(&src_addrl, 0, sizeof(src_addrl));	src_addrl.nl_family = AF_NETLINK;      	src_addrl.nl_pid = getpid();  /* self pid */	src_addrl.nl_groups = 0;  /* not in mcast groups */	bind(sockfd, (struct sockaddr*)&src_addrl, sizeof(src_addrl));	memset(&dest_addrl, 0, sizeof(dest_addrl));	dest_addrl.nl_family = AF_NETLINK;	dest_addrl.nl_pid = 0;   /* For Linux Kernel */	dest_addrl.nl_groups = 0; /* unicast */	nlhl=(struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));	/* Fill the netlink message header */	nlhl->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);	nlhl->nlmsg_pid = getpid();  /* self pid */	nlhl->nlmsg_flags = 0;	/* Fill in the netlink message payload */	strcpy(NLMSG_DATA(nlhl), "Hello you!");	iovl.iov_base = (void *)nlhl;	iovl.iov_len = nlhl->nlmsg_len;	msgl.msg_name = (void *)&dest_addrl;	msgl.msg_namelen = sizeof(dest_addrl);	msgl.msg_iov = &iovl;	msgl.msg_iovlen = 1;	//sendmsg(sockfd, &msgl, 0);	printf("%d\n", sendmsg(sockfd, &msgl, 0));	while(1)	{		int  ret, i;		unsigned char buff[1600];		void *pvRedirectData;
		unsigned int dwRedirectDataType=0x0800;		/* Read message from kernel */		memset(nlhl, 0, NLMSG_SPACE(MAX_PAYLOAD));		ret = recvmsg(sockfd, &msgl, 0);		printf("%d\n",ret);		memcpy(buff, NLMSG_DATA(nlhl), ret);		pTempRedirData = (TRedirectData *)malloc(sizeof(TRedirectData));		//pTempRedirData = (TRedirectData *)buff;		memcpy(pTempRedirData, (TRedirectData *)buff, sizeof(TRedirectData));		pvRedirectData = buff + 8;
		tTempRedirData.dwILVNum = ILV_TOTAL_NUMBER;
		tTempRedirData.dwRedirectDataLength = htonl(pTempRedirData->dwRedirectDataLength);
		tTempRedirData.ptILVs = (TRedirILVToLFB *)malloc(ILV_TOTAL_NUMBER*sizeof(TRedirILVToLFB));
		memset((char *)(tTempRedirData.ptILVs),0,ILV_TOTAL_NUMBER*sizeof(TRedirILVToLFB));
		
					
		(tTempRedirData.ptILVs)[0].dwMetaDataID = 1;
		dwRedirectDataType = htonl(dwRedirectDataType);
		(tTempRedirData.ptILVs)[0].pvMetaData = &dwRedirectDataType;
		(tTempRedirData.ptILVs)[0].dwMetaDataLength = 4;
				
		(tTempRedirData.ptILVs)[1].dwMetaDataID = 2;
		pTempRedirData->dwPortID = htonl(pTempRedirData->dwPortID);
		(tTempRedirData.ptILVs)[1].pvMetaData = &(pTempRedirData->dwPortID);
		(tTempRedirData.ptILVs)[1].dwMetaDataLength = 4;
		
			
		(tTempRedirData.ptILVs)[2].dwMetaDataID = 3;
		pTempRedirData->dwRedirectDataLength = htonl(pTempRedirData->dwRedirectDataLength);
		(tTempRedirData.ptILVs)[2].pvMetaData = &(pTempRedirData->dwRedirectDataLength);
		(tTempRedirData.ptILVs)[2].dwMetaDataLength = 4;
			
		tTempRedirData.pvRedirectData = pvRedirectData;
		printf(" Received message payload: \n");
		for(i=0;i<ret-16;i++)
		{
			if(i%16 == 0)
				printf("\n");
			printf("%02x ", buff[i]);
		}
		printf("\ndwPortID:%lu\n",*(unsigned long *)(tTempRedirData.ptILVs)[1].pvMetaData);
		printf("\n%lu\n", pTempRedirData->dwRedirectDataLength);
		printf("\ndwRedirectDataLength:%lu\n",*(unsigned long *)(tTempRedirData.ptILVs)[2].pvMetaData);		for(i=0;i<ret-24; i++)		{			if(i%16 == 0)				printf("\n");			//printf("%02x ",*((unsigned char *)pvRedirectData++));				printf("%02x ",*((unsigned char *)(tTempRedirData.pvRedirectData)++));		}
//		RFL_RedirectDataToCEProc(&tTempRedirData);
		free(tTempRedirData.ptILVs);		free(pTempRedirData);	}    /* Close Netlink Socket */	close(sockfd);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -