📄 netwolf.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 + -