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; }