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

📄 globals.cpp

📁 实现网络原始数据包的捕获和分析
💻 CPP
字号:
#include "stdafx.h"
#include "globals.h"
#include "define.h"
#include <winsock2.h>
#include <crtdbg.h>

SOCKET s=0;;

// Function name	: GetAdapterMAC
// Description	    : 得到网卡的物理地址,这里只能处理有一块网卡的情况
// Return type		: bool 
// Argument         : UCHAR addr[6]
bool GetAdapterMAC(UCHAR addr[6])
{
	ResetAdapter();//reset 网卡
	NCB ncb;
	UCHAR uCode;
	ASTAT  Adapter;
	
	memset(addr,0,6*sizeof(UCHAR));	
	
	memset( &ncb, 0, sizeof(ncb) );
    ncb.ncb_command = NCBASTAT;
    ncb.ncb_lana_num = 0;

    strcpy((char *)ncb.ncb_callname,  "*               " );
    ncb.ncb_buffer = (UCHAR *) &Adapter;
    ncb.ncb_length = sizeof(Adapter);

    uCode = Netbios( &ncb );
	memcpy(addr,Adapter.adapt.adapter_address,6*sizeof(UCHAR));
	if(uCode==NRC_GOODRET)
		return true;
	else
		return false;
	
}

// Function name	: GetAdapterNum
// Description	    : 得到本机网卡的个数
// Return type		: UCHAR 
UCHAR GetAdapterNum()
{
	NCB ncb;
	LANA_ENUM   lenum;
	UCHAR uCode;
	memset(&ncb,0,sizeof(NCB));	
	//得到网卡的个数
	ncb.ncb_command=NCBENUM;
	ncb.ncb_buffer=(UCHAR *)&lenum;
	ncb.ncb_length = sizeof(lenum);
	uCode=Netbios(&ncb);
	if(uCode!=NRC_GOODRET)//没有得到网开的个数
		return 0;
	return lenum.length;//返回网卡个数
}

// Function name	: ResetAdapter
// Description	    : Reset 一张LAN网卡
// Return type		: void 
void ResetAdapter()
{
	NCB ncb;	
	UCHAR uCode;
	memset(&ncb,0,sizeof(NCB));		
	ncb.ncb_command = NCBRESET;
	ncb.ncb_lana_num = 0;
	//
	uCode = Netbios( &ncb );
	
}

// Function name	: SetAdapterReceiveAll
// Description	    : 设置网卡可以接收所有IP的数据(混杂模式)
// Return type		: void 
bool SetAdapterReceiveAll()
{
	//检查Winsock版本
	WORD ver=MAKEWORD(2,2);
	WSADATA wsaData;
	int err=WSAStartup(ver,&wsaData);
	if(err!=0)
	{
		_RPT2( _CRT_ERROR,"启动WinSocket version %d.%d 错误!",2,2);
		return false;
	}
	//创建原始套接字
	s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
	//设置为对IP头亲自操
	BOOL bFlag=TRUE;
	err=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bFlag,sizeof(bFlag));
	if(err!=0)		
		return false;
	//获得本机地址
	char hostname[256];
	memset(hostname,0,256);
	err=gethostname(hostname,256);
	if(err!=0)		
		return false;
	struct hostent * phost=gethostbyname(hostname);
	if(!phost)
		return false;
	//把原始套接字绑定到本定网卡
	struct sockaddr_in addr_in;
	memset(&addr_in,0,sizeof(addr_in));
	addr_in.sin_addr=*(in_addr *)phost->h_addr_list[0];
	addr_in.sin_family = AF_INET;
	addr_in.sin_port = htons(57274);//端口号,可以是任意值,但最好不要和公共端口冲突	
	bind(s, (PSOCKADDR)&addr_in, sizeof(addr_in));
	// dwValue为输入输出参数,为1时执行,0时取消
	DWORD dwValue = 1; 
	// 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
	// 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
	ioctlsocket(s, SIO_RCVALL, &dwValue);
	return true;
}

// Function name	: ReceiveAdapter
// Description	    : 接收数据
// Return type		: int  
// Argument         : byte * buf
// Argument         : int len
int  ReceiveAdapter(byte * buf,int len)
{
	return  recv(s,(char *)buf, len, 0);
}

// Function name	: GetHostName
// Description	    : 通过IP地址得到机器名
// Return type		: int 机器名字符串长度
// Argument         : char * addr ip地址
// Argument         : char * name 机器名
int GetHostName(char * addr,char * name)
{
	unsigned int node=inet_addr(addr);
	if(node==INADDR_NONE)
		return -1;
	WORD ver=MAKEWORD(2,2);
	WSADATA wsaData;
	if(WSAStartup(ver,&wsaData)!=0)
		return -1;

	struct hostent * phost=gethostbyaddr((char *)&node,4,AF_INET);
	if(!phost)
		return -1;
	int len=strlen(phost->h_name);
	memcpy(name,phost->h_name,len);
	return strlen(name);

}

⌨️ 快捷键说明

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