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

📄 netwolf.c

📁 一个直接控制网卡发送ARP分组的程序
💻 C
字号:
#define UNICODE 1

#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <string.h>

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

⌨️ 快捷键说明

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