端口扫描报告.docx
《端口扫描报告.docx》由会员分享,可在线阅读,更多相关《端口扫描报告.docx(22页珍藏版)》请在冰点文库上搜索。
端口扫描报告
杭州电子科技大学软件学院
网络工程试验报告
端口扫描报告
09109146
王子龙
1.端口及端口扫描技术简介
根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。
计算机之间相互通信的时候,分为两种方式:
一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。
对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。
一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。
主机不只是靠IP地址来区分网络服务,因为IP地址与网络服务的关系是一对多的关系。
实际上是通过“IP地址+端口号”来区分不同的服务的。
一个端口就是一个潜在的通信通道,也就是一个入侵通道。
对目标计算机进行端口扫描,能得到许多有用的信息。
进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。
在手工进行扫描时,需要熟悉各种命令。
对命令执行后的输出进行分析。
用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能。
通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。
2.对现有端口扫描工具程序的理解
该程序是有C++编写的。
C++是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。
该程序能够扫描主机IP的某一个端口,或者是扫描该主机IP某一范围内的端口。
并且提供多次扫描功能。
如果要扫描的端口很多,在扫描过程中可以暂停扫描。
扫描结果在界面的下方显示。
主要显示内容有IP地址、端口号、端口状态、连接次数及备注。
主界面
本机ip地址为169.254.103.168
用端口扫描工具扫描135端口,135端口处于打开状态
扫描处于某一范围内的端口号,比如80—90,任务进展将在界面下方显示,
并且提示当前扫描哪一个端口及尝试扫描次数。
最终的扫描结果可以通过txt文本导出
3.核心代码
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CPortScanView
IMPLEMENT_DYNCREATE(CPortScanView,CFormView)
BEGIN_MESSAGE_MAP(CPortScanView,CFormView)
//{{AFX_MSG_MAP(CPortScanView)
ON_WM_CTLCOLOR()
ON_WM_SHOWWINDOW()
ON_BN_CLICKED(IDC_RADIO_SINGLE,OnRadioSingle)
ON_BN_CLICKED(IDC_RADIO_RANGE,OnRadioRange)
ON_BN_CLICKED(IDC_BUTTON_SCAN,OnButtonScan)
ON_BN_CLICKED(IDC_BUTTON_STOP,OnButtonStop)
ON_COMMAND(ID_FILE_SAVE,OnFileSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CPortScanViewconstruction/destruction
CPortScanView:
:
CPortScanView()
:
CFormView(CPortScanView:
:
IDD)
{
//{{AFX_DATA_INIT(CPortScanView)
//}}AFX_DATA_INIT
//TODO:
addconstructioncodehere
m_pBrush=newCBrush;
ASSERT(m_pBrush);
//m_clrBk=RGB(0x00,0x00,0x77);
m_clrText=RGB(0xff,0xff,0x00);
//m_pBrush->CreateSolidBrush(m_clrBk);
m_pColumns=newCStringList;
ASSERT(m_pColumns);
m_bSinglePort=TRUE;
m_nMaxAttempts=1;//defaultvalue,Thisvaluehasbeensetonthewindow
m_pStatusList=newCPtrList;
ASSERT(m_pStatusList);
}
CPortScanView:
:
~CPortScanView()
{
if(m_pStatusList)
{
//FirstEmptytheportstatuslist:
POSITIONp=m_pStatusList->GetHeadPosition();
while(p)
{
POSITIONtemp=p;
DATA*pNode=(DATA*)m_pStatusList->GetNext(p);
m_pStatusList->RemoveAt(temp);
if(pNode)
deletepNode;
}
//Thenremoveitfromheap:
deletem_pStatusList;
}
if(m_pBrush)
deletem_pBrush;
}
voidCPortScanView:
:
DoDataExchange(CDataExchange*pDX)
{
CFormView:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPortScanView)
DDX_Control(pDX,IDC_PROGRESS,m_cProgress);
DDX_Control(pDX,IDC_EDIT_ATTEMPTS,m_cAttempts);
DDX_Control(pDX,IDC_BUTTON_STOP,m_cBtnStop);
DDX_Control(pDX,IDC_LIST_RESULT,m_cResult);
DDX_Control(pDX,IDC_BUTTON_SCAN,m_cBtnScan);
DDX_Control(pDX,IDC_IP_ADDRESS,m_cIP);
DDX_Control(pDX,IDC_EDIT_SINGLE_PORT_TO,m_cPortTo);
DDX_Control(pDX,IDC_EDIT_SINGLE_PORT_FROM,m_cPortFrom);
DDX_Control(pDX,IDC_EDIT_SINGLE_PORT,m_cSinglePort);
//}}AFX_DATA_MAP
}
BOOLCPortScanView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCFormView:
:
PreCreateWindow(cs);
}
voidCPortScanView:
:
OnInitialUpdate()
{
CFormView:
:
OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit(FALSE);
ResizeParentToFit();
ShowHeaders();
CheckRadioButton(IDC_RADIO_SINGLE,IDC_RADIO_RANGE,IDC_RADIO_SINGLE);
m_cSinglePort.EnableWindow();
m_cPortFrom.EnableWindow(FALSE);
m_cPortTo.EnableWindow(FALSE);
m_parent=(CMainFrame*)GetParent();
ASSERT(m_parent);
//m_cBtnStop.EnableWindow(FALSE);
m_cAttempts.SetWindowText(_T("1"));
}
/////////////////////////////////////////////////////////////////////////////
//CPortScanViewdiagnostics
#ifdef_DEBUG
voidCPortScanView:
:
AssertValid()const
{
CFormView:
:
AssertValid();
}
voidCPortScanView:
:
Dump(CDumpContext&dc)const
{
CFormView:
:
Dump(dc);
}
CPortScanDoc*CPortScanView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPortScanDoc)));
return(CPortScanDoc*)m_pDocument;
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CPortScanViewmessagehandlers
HBRUSHCPortScanView:
:
OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
{
HBRUSHhbr=CFormView:
:
OnCtlColor(pDC,pWnd,nCtlColor);
//breakstatementmustbeignored:
switch(nCtlColor)
{
caseCTLCOLOR_BTN:
caseCTLCOLOR_STATIC:
pDC->SetBkColor(m_clrBk);
pDC->SetTextColor(m_clrText);
caseCTLCOLOR_DLG:
returnstatic_cast(m_pBrush->GetSafeHandle());
}
//TODO:
Returnadifferentbrushifthedefaultisnotdesired
returnCFormView:
:
OnCtlColor(pDC,pWnd,nCtlColor);
}
BOOLCPortScanView:
:
AddColumn(LPCTSTRstrItem,intnItem,intnSubItem,intnMask,intnFmt)
{
LV_COLUMNlvc;
lvc.mask=nMask;
lvc.fmt=nFmt;
lvc.pszText=(LPTSTR)strItem;
lvc.cx=m_cResult.GetStringWidth(lvc.pszText)+25;
if(nMask&LVCF_SUBITEM)
{
if(nSubItem!
=-1)
lvc.iSubItem=nSubItem;
else
lvc.iSubItem=nItem;
}
returnm_cResult.InsertColumn(nItem,&lvc);
}
BOOLCPortScanView:
:
AddItem(intnItem,intnSubItem,LPCTSTRstrItem,intnImageIndex)
{
LV_ITEMlvItem;
lvItem.mask=LVIF_TEXT;
lvItem.iItem=nItem;
lvItem.iSubItem=nSubItem;
lvItem.pszText=(LPTSTR)strItem;
if(nImageIndex!
=-1)
{
lvItem.mask|=LVIF_IMAGE;
lvItem.iImage|=LVIF_IMAGE;
}
if(nSubItem==0)
returnm_cResult.InsertItem(&lvItem);
returnm_cResult.SetItem(&lvItem);
}
voidCPortScanView:
:
AddHeader(LPTSTRhdr)
{
if(m_pColumns)
m_pColumns->AddTail(hdr);
}
voidCPortScanView:
:
ShowHeaders()
{
intnIndex=0;
POSITIONpos=m_pColumns->GetHeadPosition();
while(pos)
{
CStringhdr=(CString)m_pColumns->GetNext(pos);
AddColumn(hdr,nIndex++);
}
}
voidCPortScanView:
:
OnShowWindow(BOOLbShow,UINTnStatus)
{
CFormView:
:
OnShowWindow(bShow,nStatus);
AddHeader(_T("IP地址"));
AddHeader(_T("端口号"));
AddHeader(_T("端口状态"));
AddHeader(_T("连接次数"));
AddHeader(_T("备注"));
}
voidCPortScanView:
:
OnRadioSingle()
{
m_bSinglePort=TRUE;
m_cSinglePort.EnableWindow();
m_cPortFrom.EnableWindow(FALSE);
m_cPortTo.EnableWindow(FALSE);
}
voidCPortScanView:
:
OnRadioRange()
{
m_bSinglePort=FALSE;
m_cSinglePort.EnableWindow(FALSE);
m_cPortFrom.EnableWindow();
m_cPortTo.EnableWindow();
m_cBtnStop.EnableWindow(FALSE);
}
//开始扫描按钮处理程序
voidCPortScanView:
:
OnButtonScan()
{
CStringbtnTxt,IP;
UINTnSinglePort;
BYTEf1,f2,f3,f4;
TCHARtemp[10]="\0";
m_cProgress.SetPos(0);
m_cResult.DeleteAllItems();
//清空列表框
POSITIONp=m_pStatusList->GetHeadPosition();
while(p)
{
POSITIONtemp=p;
DATA*pNode=(DATA*)m_pStatusList->GetNext(p);
m_pStatusList->RemoveAt(temp);
//循环删除
if(pNode)
deletepNode;
}
//验证IP地址是否为空
if(m_cIP.IsBlank())
{
MessageBox(_T("请输入IP地址."),
_T("Error"),
MB_OK|MB_ICONEXCLAMATION);
return;
}
//验证IP地址是否正确
if(m_cIP.GetAddress(f1,f2,f3,f4)<4)
{
MessageBox(_T("请确认IP地址."),
_T("InvalidIPaddress"),MB_OK|MB_ICONEXCLAMATION);
return;
}
//进行IP地址转化
IP=_itoa(f1,temp,10);
IP+=_T('.');
IP+=_itoa(f2,temp,10);
IP+=_T('.');
IP+=_itoa(f3,temp,10);
IP+=_T('.');
IP+=_itoa(f4,temp,10);
m_cBtnStop.EnableWindow();
m_cBtnScan.EnableWindow(FALSE);
//是否是单个端口扫描
if(m_bSinglePort)
{
CStringport;
m_cSinglePort.GetWindowText(port);
m_minPort=m_maxPort=nSinglePort=atoi(port);
}
else
{
CStringport1,port2;
m_cPortFrom.GetWindowText(port1);
m_cPortTo.GetWindowText(port2);
m_minPort=atoi(port1);
m_maxPort=atoi(port2);
m_cProgress.SetRange32(0,m_maxPort-m_minPort+1);
m_cProgress.SetStep
(1);
}
if(!
m_bSinglePort&&m_maxPort{
MessageBox(_T("最大端口要大于最小端口."),
_T("Caution"),
MB_OK|MB_ICONINFORMATION);
return;
}
UINTm_nMaxAttempts=GetDlgItemInt(IDC_EDIT_ATTEMPTS);
for(m_nCounter=m_minPort;m_nCounter<=m_maxPort;m_nCounter++)
{
BOOLbIsOpen=FALSE;
UINTnAttempt=1;
while(nAttempt<=m_nMaxAttempts&&!
bIsOpen)
{
TCHARtemp[10]="\0";
CStringstr=_T("连接端口#");
#ifdef_UNICODE
str+=_itow(m_nCounter,temp,10);
#else
str+=itoa(m_nCounter,temp,10);
#endif
str+=_T(",IP地址=");
str+=IP;
str+=_T(",Attempt=");
#ifdef_UNICODE
str+=_itow(nAttempt,temp,10);
#else
str+=itoa(nAttempt,temp,10);
#endif
//设定状态栏
m_parent->SetStatusBarText(str);
str.Empty();
//打开连接
bIsOpen=TestConnection(IP,m_nCounter);
//判断是否打开
if(bIsOpen)
{
DATA*pNode=newDATA;
ASSERT(pNode);
strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength()));
strcpy(pNode->port,_itoa(m_nCounter,temp,10));
pNode->bStatus=1;//open
pNode->nAttempts=nAttempt;
m_pStatusList->AddTail(pNode);
}
//试图连接次数
nAttempt++;
}
//如果还是无法扫描成功
if(!
bIsOpen)
{
DATA*pNode=newDATA;
ASSERT(pNode);
strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength()));
strcpy(pNode->port,_itoa(m_nCounter,temp,10));
pNode->bStatus=0;//关闭状态
pNode->nAttempts=nAttempt-1;
m_pStatusList->AddTail(pNode);
}
MSGmessage;
if(:
:
PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
:
:
TranslateMessage(&message);
:
:
DispatchMessage(&message);
}
m_cProgress.StepIt();
}
//设定状态栏
m_parent->SetStatusBarText((CString)_T("完毕"));
m_cBtnScan.EnableWindow();
m_cBtnStop.EnableWindow(FALSE);
//填充报表视图
UINTnIndex=0;
POSITI