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

📄 natas.cpp

📁 用于网络抓包的源码实现,可以查看特定端口和Ip的数据包
💻 CPP
字号:

#include <winsock2.h>
#include <windows.h>
#include "resource.h"
#include "natasconfig.h"
#include "netadapter.h"
#include "packetcapture.h"
#include "packetparser.h"


#define MAX_LOADSTRING 100


/**********************************************************************/

// Global Variables:
HINSTANCE hInst;						// current instance
TCHAR  szTitle[MAX_LOADSTRING];			// The title bar text
TCHAR  szWindowClass[MAX_LOADSTRING];	// The title bar text
BOOL   threadactive;					// is the thread active?
HANDLE hThread;							// sniff-thread handle
DWORD  ThreadID;						// sniff-thread id


/**********************************************************************/

// Foward declarations
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	AboutDlg(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    NetAdapterConfigDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK    LogFileConfigDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK    FilterConfigDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam); 
void				LogfileBrowse(HWND hDlg,int editbox, char *fn);
unsigned long _stdcall sniff(void *v);

/**********************************************************************/

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	MSG msg;
	WSADATA wsd;

	WSAStartup(MAKEWORD(2,2),&wsd);

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_NATASX, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if(!InitInstance (hInstance, nCmdShow)) return FALSE;

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	WSACleanup();

	return msg.wParam;
}



/**********************************************************************/

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_NATASX);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= (LPCSTR)IDC_NATASX;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

	return RegisterClassEx(&wcex);
}

/**********************************************************************/

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

/**********************************************************************/

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR szHello[MAX_LOADSTRING];
	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

	switch (message) 
	{
		case WM_CREATE:
			EnableMenuItem(GetMenu(hWnd),IDM_STOPCAPTURE,MF_GRAYED);
			break;

		case WM_COMMAND:
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam); 

			// Parse the menu selections:
			switch (wmId)
			{
				case IDM_ABOUT:
				    DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)AboutDlg);
					break;

				case IDM_STARTCAPTURE:
					EnableMenuItem(GetMenu(hWnd),IDM_STARTCAPTURE,MF_GRAYED);
					EnableMenuItem(GetMenu(hWnd),IDM_NETADAPTER,MF_GRAYED);
					EnableMenuItem(GetMenu(hWnd),IDM_PACKETFILTER,MF_GRAYED);
					EnableMenuItem(GetMenu(hWnd),IDM_LOGFILES,MF_GRAYED);					
					EnableMenuItem(GetMenu(hWnd),IDM_STOPCAPTURE,MF_ENABLED);
					threadactive=TRUE;
					hThread=CreateThread(NULL,0,sniff,0,0,&ThreadID);
					break;

				case IDM_STOPCAPTURE:
					threadactive=FALSE;
					Sleep(1000);
					EnableMenuItem(GetMenu(hWnd),IDM_STOPCAPTURE,MF_GRAYED);
					EnableMenuItem(GetMenu(hWnd),IDM_NETADAPTER,MF_ENABLED);
					EnableMenuItem(GetMenu(hWnd),IDM_PACKETFILTER,MF_ENABLED);
					EnableMenuItem(GetMenu(hWnd),IDM_LOGFILES,MF_ENABLED);
					EnableMenuItem(GetMenu(hWnd),IDM_STARTCAPTURE,MF_ENABLED);
					TerminateThread(hThread,ThreadID);
					break;

				case IDM_NETADAPTER:
					DialogBox(hInst,(LPCTSTR)IDD_NETADAPTER,hWnd,(DLGPROC)NetAdapterConfigDlg);
					break;

				case IDM_PACKETFILTER:
					DialogBox(hInst,(LPCTSTR)IDD_FILTER,hWnd,(DLGPROC)FilterConfigDlg);
					break;

				case IDM_LOGFILES:
					DialogBox(hInst,(LPCTSTR)IDD_LOGFILES,hWnd,(DLGPROC)LogFileConfigDlg);
					break;

				case IDM_EXIT:
				     DestroyWindow(hWnd);
				     break;

				default:
				   return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);			
			RECT rt;
			GetClientRect(hWnd, &rt);
			DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
			EndPaint(hWnd, &ps);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

/**********************************************************************/

LRESULT CALLBACK AboutDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
				return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
			{
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

/**********************************************************************/

LRESULT CALLBACK NetAdapterConfigDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam){   
 switch(Msg){

  case WM_INITDIALOG:{
		SOCKET_ADDRESS_LIST *pslist;
		char slist_buf[4096];
	    char buf[200];
	    int i;
		pslist =(SOCKET_ADDRESS_LIST *)slist_buf;
		CNetAdapter *netadapter=new CNetAdapter;
		CNatasConfig *theConfig=new CNatasConfig;
		theConfig->ReadConfigFromRegistry();		
		if(netadapter->GetAdapterList(slist_buf)){
			for(i=0;i<pslist->iAddressCount;i++){

// bugfix for error with more than one network adapter on some machines
//				sprintf(buf,"#%d -> ",i);

				sprintf(buf,"#%d  ->  %s",i,inet_ntoa(((SOCKADDR_IN *)pslist->Address[i].lpSockaddr)->sin_addr));
				SendDlgItemMessage(hDlg,IDC_ADAPTER,CB_ADDSTRING,0,(LPARAM)buf);			
			}
		}
		SendDlgItemMessage(hDlg,IDC_ADAPTER,CB_SETCURSEL,(WPARAM)theConfig->NetAdapterNr,0);
		delete netadapter;
		delete theConfig;
					 }
        return TRUE;

  case WM_COMMAND:
	  switch(LOWORD(wParam)){

	    case IDOK:{
			CNatasConfig *theConfig=new CNatasConfig;
			theConfig->ReadConfigFromRegistry();		
			theConfig->NetAdapterNr=SendDlgItemMessage(hDlg,IDC_ADAPTER,CB_GETCURSEL,0,0);
			theConfig->WriteConfigToRegistry();
			delete theConfig;			  
			EndDialog(hDlg, LOWORD(wParam));
				  }
            return TRUE;

        case IDCANCEL:              
              EndDialog(hDlg, LOWORD(wParam));
              return TRUE;
        break;     
	  }
 }
 return FALSE;
}

/**********************************************************************/

LRESULT CALLBACK LogFileConfigDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam){   
 switch(Msg){

  case WM_INITDIALOG:{
		CNatasConfig *theConfig=new CNatasConfig;
		theConfig->ReadConfigFromRegistry();		
		SendDlgItemMessage(hDlg,IDC_LOGFILE_YN,BM_SETCHECK,(WPARAM)theConfig->bLogFile,0);
		SendDlgItemMessage(hDlg,IDC_PWLOGFILE_YN,BM_SETCHECK,(WPARAM)theConfig->bPWLogFile,0);
		SendDlgItemMessage(hDlg,IDC_HTTPLOGFILE_YN,BM_SETCHECK,(WPARAM)theConfig->bHTTPLogFile,0);
		SetDlgItemText(hDlg,IDC_LOGFILE_NAME,theConfig->LogFileName);
		SetDlgItemText(hDlg,IDC_HTTPLOGFILE_NAME,theConfig->HTTPLogFileName);
		SetDlgItemText(hDlg,IDC_PWLOGFILE_NAME,theConfig->PWLogFileName);
		delete theConfig;			  
					 }
        return TRUE;

  case WM_COMMAND:
	  switch(LOWORD(wParam)){

	    case IDOK:{
			  CNatasConfig *theConfig=new CNatasConfig;
	    	  theConfig->ReadConfigFromRegistry();		
			  theConfig->bLogFile=SendDlgItemMessage(hDlg,IDC_LOGFILE_YN,BM_GETCHECK,0,0);
			  theConfig->bPWLogFile=SendDlgItemMessage(hDlg,IDC_PWLOGFILE_YN,BM_GETCHECK,0,0);
			  theConfig->bHTTPLogFile=SendDlgItemMessage(hDlg,IDC_HTTPLOGFILE_YN,BM_GETCHECK,0,0);
			  GetDlgItemText(hDlg,IDC_LOGFILE_NAME,theConfig->LogFileName,255);
			  GetDlgItemText(hDlg,IDC_HTTPLOGFILE_NAME,theConfig->HTTPLogFileName,255);
			  GetDlgItemText(hDlg,IDC_PWLOGFILE_NAME,theConfig->PWLogFileName,255);
			  theConfig->WriteConfigToRegistry();
			  delete theConfig;			  
			  EndDialog(hDlg, LOWORD(wParam));
				  }
			  return TRUE;

        case IDC_LOGFILE_BROWSE:
              LogfileBrowse(hDlg,IDC_LOGFILE_NAME,"natas.log");
              return TRUE;

        case IDC_HTTPLOGFILE_BROWSE:             
			  LogfileBrowse(hDlg,IDC_HTTPLOGFILE_NAME,"natas_http.log");
              return TRUE;

        case IDC_PWLOGFILE_BROWSE:              
			  LogfileBrowse(hDlg,IDC_PWLOGFILE_NAME,"natas_pw.log");
              return TRUE;

        case IDCANCEL:              
              EndDialog(hDlg, LOWORD(wParam));
              return TRUE;
        break;     
	  }
 }
 return FALSE;
}

/**********************************************************************/

LRESULT CALLBACK FilterConfigDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam){   
 switch(Msg){

  case WM_INITDIALOG:{
	    CNatasConfig *theConfig=new CNatasConfig;
	  	char temp[20];

	    theConfig->ReadConfigFromRegistry();
	    sprintf(temp,"%d",theConfig->SourcePort);
		SetDlgItemText(hDlg,IDC_SOURCE_PORT,temp);
	    sprintf(temp,"%d",theConfig->TargetPort);
		SetDlgItemText(hDlg,IDC_TARGET_PORT,temp);
		SendDlgItemMessage(hDlg,IDC_RADIO_OR,BM_SETCHECK,(WPARAM)!theConfig->Combination,0);
		SendDlgItemMessage(hDlg,IDC_RADIO_AND,BM_SETCHECK,(WPARAM)(theConfig->Combination),0);

		SetDlgItemText(hDlg,IDC_SA1,strtok(theConfig->SourceAddress,".\0"));
		SetDlgItemText(hDlg,IDC_SA2,strtok(0,".\0"));
		SetDlgItemText(hDlg,IDC_SA3,strtok(0,".\0"));
		SetDlgItemText(hDlg,IDC_SA4,strtok(0,".\0"));

		SetDlgItemText(hDlg,IDC_TA1,strtok(theConfig->TargetAddress,".\0"));
		SetDlgItemText(hDlg,IDC_TA2,strtok(0,".\0"));
		SetDlgItemText(hDlg,IDC_TA3,strtok(0,".\0"));
		SetDlgItemText(hDlg,IDC_TA4,strtok(0,".\0"));

		delete theConfig;
					 }
        return TRUE;

  case WM_COMMAND:
	  switch(LOWORD(wParam)){

    	case IDOK:
			{
				CNatasConfig *theConfig=new CNatasConfig;
	  			char temp[20];
				char a1[3],a2[3],a3[3],a4[3];
				int i;

				theConfig->ReadConfigFromRegistry();
				GetDlgItemText(hDlg,IDC_SOURCE_PORT,temp,20);
				sscanf(temp,"%d",&i);			
				theConfig->SourcePort=i;
				GetDlgItemText(hDlg,IDC_TARGET_PORT,temp,20);
				sscanf(temp,"%d",&i);
				theConfig->TargetPort=i;

				GetDlgItemText(hDlg,IDC_SA1,a1,3);
				GetDlgItemText(hDlg,IDC_SA2,a2,3);
				GetDlgItemText(hDlg,IDC_SA3,a3,3);
				GetDlgItemText(hDlg,IDC_SA4,a4,3);
				sprintf(theConfig->SourceAddress,"%s.%s.%s.%s",a1,a2,a3,a4);

				GetDlgItemText(hDlg,IDC_TA1,a1,3);
				GetDlgItemText(hDlg,IDC_TA2,a2,3);
				GetDlgItemText(hDlg,IDC_TA3,a3,3);
				GetDlgItemText(hDlg,IDC_TA4,a4,3);
				sprintf(theConfig->TargetAddress,"%s.%s.%s.%s",a1,a2,a3,a4);

				theConfig->Combination=SendDlgItemMessage(hDlg,IDC_RADIO_AND,BM_GETCHECK,0,0);

				theConfig->WriteConfigToRegistry();
				delete theConfig;
                EndDialog(hDlg, LOWORD(wParam));
			}
			  return TRUE;

        case IDCANCEL:              
              EndDialog(hDlg, LOWORD(wParam));
              return TRUE;
        break;     
	  }
 }
 return FALSE;
}

/**********************************************************************/

void LogfileBrowse(HWND hDlg,int editbox, char *fn){
	OPENFILENAME ofn;
	char filename[250];

	strcpy((char*)&filename,fn);
	static char szFilter[] = "Alle Dateien (*.log)\0*.log\0\0";
    ofn.lStructSize       = sizeof (OPENFILENAME);
    ofn.hwndOwner         = 0;
    ofn.hInstance         = NULL;
    ofn.lpstrFilter       = szFilter;
    ofn.lpstrCustomFilter = NULL;
    ofn.nMaxCustFilter    = 0;
    ofn.nFilterIndex      = 0;
    ofn.nMaxFile          = _MAX_PATH;
    ofn.lpstrFileTitle    = NULL;  
    ofn.nMaxFileTitle     = _MAX_FNAME + _MAX_EXT;
    ofn.lpstrInitialDir   = NULL;
    ofn.lpstrTitle        = NULL;
    ofn.Flags             = OFN_HIDEREADONLY; 
    ofn.nFileOffset       = 0;
    ofn.nFileExtension    = 0;
    ofn.lpstrDefExt       = "";
    ofn.lCustData         = 0L;
    ofn.lpfnHook          = NULL;
    ofn.lpTemplateName    = NULL;
    ofn.lpstrFile         = (char *)filename;
    GetOpenFileName(&ofn);
	
	SetDlgItemText(hDlg,editbox,filename);   
}

/**********************************************************************/

// der sniffer thread
unsigned long _stdcall sniff(void *v){
	CNatasConfig *theConfig=new CNatasConfig;
	CPacketCapture *pcapture=new CPacketCapture;
	CPacketParser *pp=new CPacketParser;	
	WSABUF wsb;
	char rcvbuf[MAX_IP_SIZE];	

	theConfig->ReadConfigFromRegistry();
	pcapture->Initialize(theConfig->NetAdapterNr);

    wsb.buf=rcvbuf;	

	while(threadactive) {
	    wsb.len=MAX_IP_SIZE;
		memset(wsb.buf,0x0,MAX_IP_SIZE);
		pcapture->GetPacket(&wsb);
		if(pp->CheckFilter(&wsb)) {
			if(theConfig->bPWLogFile) pp->PassCap((char*)(LPCTSTR)theConfig->PWLogFileName,&wsb);
			if(theConfig->bHTTPLogFile) pp->HTTPCap((char*)(LPCTSTR)theConfig->HTTPLogFileName,&wsb);
			if(theConfig->bLogFile) pp->DecodeToLogfile((char*)(LPCTSTR)theConfig->LogFileName,&wsb);
		}
	}

	delete theConfig;
	delete pcapture;
	delete pp;
	
	return 0;
}


⌨️ 快捷键说明

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