📄 synscanportdlg.cpp
字号:
// SynScanPortDlg.cpp : implementation file
//
#include "stdafx.h"
#include <winsock2.h>
#include "SynScanPort.h"
#include "SynScanPortDlg.h"
#include "Ping.h"
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#if _MSC_VER > 1000
#pragma once
#endif
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)
#define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)
#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)
#define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)
#define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)
#define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7)
#define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)
#define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)
#define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10)
#define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)
struct tcp_keepalive {
u_long onoff;
u_long keepalivetime;
u_long keepaliveinterval;
};
#define srcPort 88
char srcIP[20] = "";//定义源地址
int StartPort,EndPort;
CSynScanPortDlg *dlg=NULL;
typedef struct ip_hdr
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct tcp_hdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
typedef struct tsd_hdr //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSD_HEADER;
int recv_packet()
{
SOCKADDR_IN sniff;
SOCKET sock;
char recvBuffer[65000] = "";
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
sniff.sin_family = AF_INET;
sniff.sin_port = htons(0);
sniff.sin_addr.s_addr = inet_addr(srcIP);
bind(sock,(PSOCKADDR)&sniff,sizeof(sniff));
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0 ;
WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
printf("Sniffer On %s is OK...\n",srcIP);
while(TRUE)
{
memset(recvBuffer,0,sizeof(recvBuffer));
int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0);
if(bytesRecived <= 0)
continue;
IP_HEADER *ipHeader;
TCP_HEADER *tcpHeader;
ipHeader = (IP_HEADER *)recvBuffer;
tcpHeader = (TCP_HEADER *) (recvBuffer+sizeof(IP_HEADER));
//if(tcpHeader->th_seq == 0x12345678+2)
{
if(tcpHeader->th_flag == 18)
{
char result[50];
in_addr addr;
addr.s_addr = ipHeader->sourceIP;
wsprintf(result,"[Found] %-15s %-5d\r\n",inet_ntoa(addr),ntohs(tcpHeader->th_sport));
dlg->m_show += result;
dlg->SetDlgItemText(IDC_RICHEDIT_SHOW,dlg->m_show);
}
}
}
return 1;
}
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
int send_packet(void *targetIP)
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,1) ,&WSAData);
SOCKET sendSocket;
BOOL flag;
int timeout;
SOCKADDR_IN sin;
IP_HEADER ipHeader;
TCP_HEADER tcpHeader;
PSD_HEADER psdHeader;
char szSendBuf[60] = "";
if((sendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("Socket Setup Error...\n");
return 0;
}
if(setsockopt(sendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR)
{
printf("Setsockopt IP_HDRINCL Error...\n");
return 0;
}
timeout = 1000;
if(setsockopt(sendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == SOCKET_ERROR)
{
printf("Setsockopt SO_SNDTIMEO Error...\n");
return 0;
}
ipHeader.h_verlen = (4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.total_len = htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident = 1;
ipHeader.frag_and_flags = 0x40;
ipHeader.ttl = 128;
ipHeader.proto = IPPROTO_TCP;
ipHeader.checksum = 0;
ipHeader.sourceIP = inet_addr(srcIP);
ipHeader.destIP = inet_addr((char *)targetIP);
tcpHeader.th_sport = htons(srcPort);
tcpHeader.th_seq = 0x12345678;
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag = 2;//syn标志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG(推测,哈哈)
tcpHeader.th_win = htons(512);
tcpHeader.th_urp = 0;
tcpHeader.th_sum = 0;
psdHeader.saddr = ipHeader.sourceIP;
psdHeader.daddr = ipHeader.destIP;
psdHeader.mbz = 0;
psdHeader.ptcl = IPPROTO_TCP;
psdHeader.tcpl = htons(sizeof(tcpHeader));
for(int tmp = StartPort; tmp <= EndPort; tmp++)
{
ipHeader.checksum = 0;
tcpHeader.th_sum = 0;
tcpHeader.th_dport = htons(tmp);
sin.sin_family = AF_INET;
sin.sin_port = htons(tmp);
sin.sin_addr.S_un.S_addr = inet_addr((char *)targetIP);
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);
ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
int ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin));
if(ret == SOCKET_ERROR)
{
printf("Send Error:%d\n",GetLastError());
return 0;
}
}
/*
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);
ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
int ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin));
if(ret == SOCKET_ERROR)
{
printf("Send Error:%d\n",GetLastError());
return 0;
}*/
return 1;
}
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSynScanPortDlg dialog
CSynScanPortDlg::CSynScanPortDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSynScanPortDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSynScanPortDlg)
m_endport = 65535;
m_startport = 0;
m_show = _T("显示结果...\r\n");
m_ip = _T("192.168.159.1");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSynScanPortDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSynScanPortDlg)
DDX_Control(pDX, IDOK, m_btnok);
DDX_Control(pDX, IDC_EDIT_STARTPORT, m_edit_startport);
DDX_Control(pDX, IDC_EDIT_IP, m_edit_ip);
DDX_Control(pDX, IDC_EDIT_ENDPORT, m_edit_endport);
DDX_Control(pDX, IDC_BUTTON_PING, m_btn_ping);
DDX_Control(pDX, IDC_BUTTON_OUT, m_btn_out);
DDX_Control(pDX, IDC_BUTTON_CLEAN, m_btn_clean);
DDX_Text(pDX, IDC_EDIT_ENDPORT, m_endport);
DDX_Text(pDX, IDC_EDIT_STARTPORT, m_startport);
DDX_Text(pDX, IDC_RICHEDIT_SHOW, m_show);
DDX_Text(pDX, IDC_EDIT_IP, m_ip);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSynScanPortDlg, CDialog)
//{{AFX_MSG_MAP(CSynScanPortDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_OUT, OnButtonOut)
ON_BN_CLICKED(IDC_BUTTON_CLEAN, OnButtonClean)
ON_BN_CLICKED(IDC_BUTTON_PING, OnButtonPing)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSynScanPortDlg message handlers
BOOL CSynScanPortDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_wndLink1.SubclassDlgItem(IDC_URL1, this);
m_btnok.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
m_btnok.SetFontColor(RGB(100,50,280));
m_btn_ping.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
m_btn_ping.SetFontColor(RGB(100,50,280));
m_btn_out.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
m_btn_out.SetFontColor(RGB(100,50,280));
m_btn_clean.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
m_btn_clean.SetFontColor(RGB(100,50,280));
// TODO: Add extra initialization here
char FAR hostname[128] = "";
struct hostent *phe;
WSADATA WSAData;
WSAStartup(MAKEWORD(2,1) ,&WSAData);
gethostname(hostname,128);
phe = gethostbyname(hostname);
if(phe == NULL)
exit(0);
strcpy(srcIP, inet_ntoa(*((struct in_addr *)phe->h_addr_list[0])));
SetDlgItemText(IDC_EDIT_IP,srcIP);
StartPort = 0;
EndPort = 0;
dlg = this;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recv_packet,NULL,0,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CSynScanPortDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSynScanPortDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CSynScanPortDlg::OnOK()
{
UpdateData(TRUE);
StartPort = m_startport;
EndPort = m_endport;
AfxBeginThread((AFX_THREADPROC)send_packet,(void *)m_ip.GetBuffer(0));
}
void CSynScanPortDlg::OnButtonOut()
{
CFileDialog fileDialog(TRUE,"*.txt",NULL,NULL,"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
if (fileDialog.DoModal() == IDOK)
{
CString m_file = fileDialog.GetPathName();
CFile file;
file.Open(m_file,CFile::modeCreate|CFile::modeWrite);
file.Write(m_show.GetBuffer(0),m_show.GetLength());
file.Write("\r\n\r\n\t\tby 特南克斯\r\n",strlen("\r\n\r\n\t\tby 特南克斯\r\n"));
file.Close();
MessageBox("导出成功","导出列表");
}
}
void CSynScanPortDlg::OnButtonClean()
{
m_show="显示结果...";
UpdateData(FALSE);
}
void CSynScanPortDlg::OnButtonPing()
{
UpdateData(TRUE);
CPing ping;
ping.SetConfigure(m_ip.GetBuffer(0),32,4);
ping.Ping(1000);
CString str;
str.Format("%s",ping.msg);
m_show+=str;
UpdateData(FALSE);
}
void CSynScanPortDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
::SendMessage(this->GetSafeHwnd(),WM_SYSCOMMAND,SC_MOVE+HTCAPTION,0);
CDialog::OnLButtonDown(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -