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