www.pudn.com > NetWolfSrc.zip > NetWolf.c


#define UNICODE 1 
 
#include  
#include  
#include  
#include  
 
#include "ntddndis.h" 
#include "ntddpack.h" 
#include "packet32.h" 
#include "resource.h" 
 
#define MAX_ADAPTERS 10 
char Buffer[MAX_ADAPTERS * 256]; 
 
typedef struct _ARP_PACKET 
{  
unsigned char  targ_hw_addr[6];  
unsigned char  src_hw_addr[6]; 
unsigned short frame_type;  
unsigned short hw_type;  
unsigned short prot_type;  
unsigned char  hw_addr_size;  
unsigned char  prot_addr_size;  
unsigned short op;  
unsigned char  sndr_hw_addr[6];  
unsigned char  sndr_ip_addr[4];  
unsigned char  rcpt_hw_addr[6];  
unsigned char  rcpt_ip_addr[4];  
unsigned char  padding[18];  
}ARP_PACKET; 
 
typedef struct _CONTROL_BLOCK { 
    PVOID       OpenInstance; 
    HANDLE      hEvent; 
	// 接收的数据包的缓冲区 
    HANDLE      hMem; 
    LPBYTE      lpMem; 
	// 发送的数据包的缓冲区 
    HGLOBAL     hMem2; 
    LPBYTE      lpMem2; 
    ULONG       PacketLength;  // 数据包的长度 
    UINT        BufferSize;  // 缓冲区的长度 
    } CONTROL_BLOCK, *PCONTROL_BLOCK; 
 
ARP_PACKET arppacket; 
CONTROL_BLOCK Adapter; 
 
// The structure to get the adapter info 
typedef struct _ADAPTERS_INFO 
{ 
   ULONG   NumAdapters; 
   LPTSTR  AdapterName[MAX_ADAPTERS]; 
   LPTSTR  SymbolicLink[MAX_ADAPTERS]; 
} ADAPTERS_INFO, *PADAPTERS_INFO; 
 
ADAPTERS_INFO AdaptersInfo; 
 
BOOLEAN EnumAdapters(HWND hWnd); 
void FillArpPacket(HWND hwndDlg); 
void get_hw_addr(char *buf, char *str); 
void get_ip_addr(char *buf, char *str); 
 
//两个对话框过程 
BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); 
BOOL CALLBACK TestArpDialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); 
 
int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow) 
{ 
	WNDCLASS wc; 
 
	memset(&wc,0,sizeof(wc)); 
	wc.lpfnWndProc = DefDlgProc; 
	wc.cbWndExtra = DLGWINDOWEXTRA; 
	wc.hInstance = hinst; 
	wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
	wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); 
	wc.lpszClassName = TEXT("NetWolf"); 
	RegisterClass(&wc); 
 
	return DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, (DLGPROC) DialogFunc); 
 
} 
 
static int InitializeApp(HWND hDlg,WPARAM wParam, LPARAM lParam) 
{ 
	Adapter.BufferSize=1514; 
	Adapter.hMem=GlobalAlloc(GMEM_MOVEABLE,1514); 
	Adapter.lpMem=GlobalLock(Adapter.hMem); 
	Adapter.hMem2=GlobalAlloc(GMEM_MOVEABLE,1514); 
	Adapter.lpMem2=GlobalLock(Adapter.hMem2); 
	PacketStartDriver(TEXT("PACKET")); 
	return 1; 
} 
 
static BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
	HWND hWndList; 
	ULONG i; 
	int result=0; 
 
	switch (msg) { 
 
	case WM_INITDIALOG: 
		InitializeApp(hwndDlg,wParam,lParam); 
		return TRUE; 
 
	case WM_COMMAND: 
		switch (LOWORD(wParam)) { 
			case IDOK: 
				if (Adapter.OpenInstance != NULL)  
				{ 
					PacketCloseAdapter(Adapter.OpenInstance); 
					Adapter.OpenInstance = NULL; 
				} 
				EndDialog(hwndDlg,1); 
				return 1; 
			case IDCHECKNIC:  //检测网卡 
				if(!EnumAdapters(hwndDlg)) 
				{ 
                return FALSE; 
				} 
				hWndList = GetDlgItem(hwndDlg, IDC_NICLIST); 
				SendMessage(hWndList, LB_RESETCONTENT, 0, 0); 
			    for(i=0; i< AdaptersInfo.NumAdapters; i++) 
				{ 
					SendMessage(hWndList, LB_ADDSTRING, 0, (LPARAM)AdaptersInfo.AdapterName[i]); 
				} 
				break; 
			case IDOPENNIC:  //打开网卡 
				hWndList = GetDlgItem(hwndDlg, IDC_NICLIST); 
				SendMessage(hWndList, LB_GETCURSEL, 0, 0); 
				if (Adapter.OpenInstance == NULL) { 
					result=(int)SendMessage(hWndList, LB_GETCURSEL, 0, 0); 
					if(result == LB_ERR)return TRUE; 
					Adapter.OpenInstance=PacketOpenAdapter(AdaptersInfo.SymbolicLink[result]); 
					if (Adapter.OpenInstance != NULL) { 
						SetWindowText(hwndDlg, AdaptersInfo.AdapterName[result]); 
					} 
					else 
					{ 
						MessageBox(hwndDlg, TEXT("Unable to open"), TEXT("Error!"), MB_OK); 
					} 
				} 
				else 
				{ 
					MessageBox(hwndDlg, TEXT("Device is already open"), TEXT("Error!"), MB_OK); 
				} 
				break; 
			case IDCLOSENIC:  //关闭网卡 
				if (Adapter.OpenInstance != NULL) { 
					PacketCloseAdapter(Adapter.OpenInstance); 
					Adapter.OpenInstance = NULL; 
					SetWindowText(hwndDlg, TEXT("NetWolf")); 
				} 
				else 
				{ 
					MessageBox(hwndDlg, TEXT("Device not open"), TEXT("Error!"), MB_OK); 
				} 
				break; 
			case IDSETMODE:  //设置为混杂模式 
				if(Adapter.OpenInstance != NULL) 
				{ 
					if(Adapter.OpenInstance != NULL) { 
						if(PacketSetFilter(Adapter.OpenInstance,NDIS_PACKET_TYPE_PROMISCUOUS))  
						{ 
							LPTSTR wt = wcscat(AdaptersInfo.AdapterName[result],TEXT("[混杂模式]")); 
							SetWindowText(hwndDlg,wt); 
						} else { 
							MessageBox(hwndDlg, TEXT("Set Filter Failed"), TEXT("Error!"), MB_OK); 
						} 
					} 
				} 
				else 
				{ 
					MessageBox(hwndDlg, TEXT("Device not open"), TEXT("Error!"), MB_OK); 
				} 
				break; 
			case IDTESTARP: 
				DialogBox(NULL, MAKEINTRESOURCE(IDD_TESTARP), hwndDlg, (DLGPROC) TestArpDialog); 
				break; 
		} 
		break; 
  
	case WM_CLOSE: 
		if (Adapter.OpenInstance != NULL) { 
			PacketCloseAdapter(Adapter.OpenInstance); 
			Adapter.OpenInstance = NULL; 
		} 
		EndDialog(hwndDlg,0); 
		return TRUE; 
	 
	} 
	return FALSE; 
} 
 
static BOOL CALLBACK TestArpDialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
	PVOID Packet; 
	int result=0; 
 
	switch (msg) { 
 
	case WM_INITDIALOG: 
		SetDlgItemText(hwndDlg,IDC_DM,TEXT("FF-FF-FF-FF-FF-FF")); 
		SetDlgItemText(hwndDlg,IDC_RM,TEXT("00-00-00-00-00-00")); 
		return TRUE; 
 
	case WM_COMMAND: 
		switch (LOWORD(wParam)) { 
			case IDCANCEL: 
				EndDialog(hwndDlg,1); 
				return 1; 
 
			case IDSEND: 
				if(Adapter.OpenInstance != NULL) 
				{ 
					Packet=PacketAllocatePacket(Adapter.OpenInstance); 
					if (Packet != NULL) { 
						PacketInitPacket(Packet,Adapter.lpMem2,60); 
						FillArpPacket(hwndDlg); 
						memcpy(Adapter.lpMem2,&arppacket,60); 
						if(!PacketSendPacket(Adapter.OpenInstance,Packet,TRUE))  
						{ 
							MessageBox(hwndDlg, TEXT("Send Failed"), TEXT("Error!"), MB_OK); 
							break; 
						} 
						PacketFreePacket(Packet); 
					} 
				} 
				else 
				{ 
					MessageBox(hwndDlg, TEXT("Device not open"), TEXT("Error!"), MB_OK); 
				} 
				break; 
		} 
		break; 
  
	case WM_CLOSE: 
		return TRUE;	 
	} 
	return FALSE; 
} 
 
BOOLEAN EnumAdapters(HWND hWnd) 
{ 
    HANDLE hFile; 
    ULONG bytesReturned; 
    TCHAR *buffer; 
    UINT i; 
 
    memset(Buffer, 0, sizeof(Buffer)); 
    hFile=CreateFile(TEXT("\\\\.\\Packet"), 
                         GENERIC_WRITE | GENERIC_READ, 
                         0, 
                         NULL, 
                         OPEN_EXISTING, 
                         FILE_FLAG_OVERLAPPED, 
                         0 
                         ); 
    if(hFile == INVALID_HANDLE_VALUE) { 
        MessageBox(hWnd, TEXT("Driver is not loaded. Try reloading the app."),TEXT("Error!"), MB_OK); 
        return FALSE; 
    } 
     
    if(!DeviceIoControl(hFile, 
        IOCTL_ENUM_ADAPTERS, 
        NULL, 
        0, 
        Buffer, 
        sizeof(Buffer), 
        &bytesReturned, 
        NULL 
        )) 
 
    { 
        MessageBox(hWnd, TEXT("Enum ioctl failed"), TEXT("Error!"), MB_OK); 
        return FALSE; 
    } 
 
    buffer = (TCHAR *)Buffer; 
 
    // Parse the output and fill the AdaptersInfo structure 
 
    AdaptersInfo.NumAdapters = *(PULONG)buffer; 
    (PCHAR)buffer += sizeof(ULONG); 
 
    i = 0; 
    AdaptersInfo.AdapterName[i] = (LPTSTR)buffer; 
    while (*(buffer++)) { 
        while (*(buffer++)) { 
            ; 
        } 
        AdaptersInfo.SymbolicLink[i] = (LPTSTR)buffer; 
        while (*(buffer++)) { 
            ; 
        } 
        if(++i == MAX_ADAPTERS)  
            break; 
        AdaptersInfo.AdapterName[i] = (LPTSTR)buffer; 
    } 
    
    CloseHandle(hFile); 
    return TRUE; 
} 
 
void FillArpPacket(HWND hwndDlg) 
{ 
	char mac[30]; 
	memset(&arppacket,0,sizeof(arppacket)); 
 
	GetDlgItemTextA(hwndDlg,IDC_DM,mac,sizeof(mac)); 
	get_hw_addr(arppacket.targ_hw_addr,mac); 
 
	GetDlgItemTextA(hwndDlg,IDC_SM,mac,sizeof(mac)); 
	get_hw_addr(arppacket.src_hw_addr,mac); 
 
	arppacket.frame_type=0x0608; //帧类型为ARP请求或应答 
	arppacket.hw_type=0x0100;    //硬件类型为以太网地址 
	arppacket.prot_type=0x0008;  //协议类型为IP地址 
	arppacket.hw_addr_size=0X06;  
	arppacket.prot_addr_size=0X04; 
	arppacket.op=0x0100;		 //ARP请求为1、ARP应答为2、RARP请求为3、RARP应答为4 
 
	GetDlgItemTextA(hwndDlg,IDC_SEM,mac,sizeof(mac)); 
	get_hw_addr(arppacket.sndr_hw_addr,mac); 
 
	GetDlgItemTextA(hwndDlg,IDC_SI,mac,sizeof(mac)); 
	get_ip_addr(arppacket.sndr_ip_addr,mac); 
 
	GetDlgItemTextA(hwndDlg,IDC_RM,mac,sizeof(mac)); 
	get_hw_addr(arppacket.rcpt_hw_addr,mac); 
 
	GetDlgItemTextA(hwndDlg,IDC_DI,mac,sizeof(mac)); 
	get_ip_addr(arppacket.rcpt_ip_addr,mac); 
} 
 
void get_hw_addr(char *buf, char *str)  
{ 
	int i;  
	char c, val;  
	for(i = 0; i < 6; i++)  
	{  
		if (!(c = tolower(*str++))) return;  
		if (isdigit(c))  
			val = c - '0';  
		else if (c >= 'a' && c <= 'f')  
			val = c-'a'+10;  
		else  
			return;  
		*buf = val << 4;  
		if (!(c = tolower(*str++)))  
			return;  
		if (isdigit(c))  
			val = c - '0';  
		else if (c >= 'a' && c <= 'f')  
			val = c-'a'+10;  
		else  
			return;  
		*buf++ |= val;  
		if (*str == ':'||*str == '-')  
			str++;  
	}  
}  
 
void get_ip_addr(char *buf, char *str)  
{ 
	char *s=str; 
	char *d="."; 
	char *p; 
	char temp=0; 
 
	p=strtok(s,d); 
	temp=atoi(p); 
	buf[0]=temp; 
 
	p=strtok(NULL,d); 
	temp=atoi(p); 
	buf[1]=temp; 
 
	p=strtok(NULL,d); 
	temp=atoi(p); 
	buf[2]=temp; 
 
	p=strtok(NULL,d); 
	temp=atoi(p); 
	buf[3]=temp; 
}