端口扫描实验总结报告文档格式.docx
《端口扫描实验总结报告文档格式.docx》由会员分享,可在线阅读,更多相关《端口扫描实验总结报告文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
1.了解熟悉MFC及的基本原理和方法。
2.加深对tcp的理解,学习端口扫描技术和,原理熟悉socket编程。
3.通过自己编程实现简单的IP端口扫描器模型。
4.通过端口扫描了解目标主机开放的端口和服务程序。
三、实验环境
Windows操作系统
VC++6.0开发环境
四、实验设计
实验原理
通过调用socket函数connect()连接到目标计算机上,完成一次完整的三次握手过程,如果端口处于侦听状态,那么connect()就可以成功返回,否则这个端口不可用,即没有提供服务。
实验内容
1.
设计实现端口扫描器
2.
IP地址、端口范围可以用户输入。
3.
要求有有好的可视化操作界面。
实验步骤:
1、用户界面:
使用vc6.0里的MFC来开发用户界面
2、端口扫描:
使用socket函数中的connect()连接计算机来判定目标计算机是否开放了要测试的端口
五、代码实现
#include<
afxext.h>
winsock.h>
#pragmacomment(lib,"
wsock32.lib"
)
#defineZERO(fd_set*)0
intmaxth,scanok,scannum;
intportip,hoststart,hoststop,startport,endport;
longsearchnum,searched;
voidusage(char*);
voidplayx(int);
voidsetip2(char*);
voidcustomport(char*,char*,char*);
voidportscannow(int);
intmain(intargc,char*argv[])
{
WSADATAwsadata;
system("
cls.exe"
);
printf("
\r\n==============命令行端口扫描器PortScannerV1.0=============="
if((argc<
3)||(argc>
4))
usage(argv[0]);
return-1;
}
if(!
(stricmp(strlwr(argv[1]),"
-p"
)==0))
if(WSAStartup(MAKEWORD(1,1),&
wsadata)!
=0)
\r\nWsatartuperror"
if(argc==3)
setip2(argv[2]);
else
if(argc==4)
customport(argv[0],argv[2],argv[3]);
portscannow(argc);
WSACleanup();
return0;
voidusage(char*prog)
Usage:
%s<
Option>
"
prog);
\r\n\n<
:
\r\n-p[Port|StartPort-EndPort]<
HostName|IP|StartIP-EndIP>
\r\n\nExample:
"
\r\n%s-p192.168.0.1"
\r\n%s-p192.168.0.1-192.168.0.254"
\r\n%s-p21-80192.168.0.1"
\r\n%s-p21-80192.168.0.1-192.168.0.254\r\n"
return;
voidplayx(intplay=0)
char*plays[12]=
|"
"
/"
-"
\\"
};
if(searchnum!
=0)
for(inti=0;
i<
=3;
i++)
printf("
=%s=%d%sCompleted.\r"
plays,searched*100/(searchnum+1),"
%"
Sleep(5);
=%s=\r"
plays[play]);
Sleep(10);
voidsetip2(char*cp)
inthost;
structhostent*testhost;
char*startip="
*endip="
;
if(strstr(cp,"
-"
)&
&
strlen(cp)>
15&
strlen(cp)<
32)
endip=strchr(cp,'
-'
)+1;
strncpy(startip,cp,strlen(cp)-strlen(strchr(cp,'
)));
hoststart=ntohl(inet_addr(startip));
hoststop=ntohl(inet_addr(endip));
testhost=gethostbyname(startip);
if(!
testhost)
WSACleanup();
\r\nCan'
tgetipof:
%s"
cp);
exit(-1);
memcpy(&
host,testhost->
h_addr,4);
hoststop=hoststart=ntohl(host);
voidTestThread(intthread=200)
for(;
playx();
if(maxth>
thread)
Sleep(100);
elsebreak;
voidWaitThreadEnd()
Sleep(6000);
\r\r\n"
Wait(%d)Threadend...\r\n"
maxth);
for(;
0)
playx();
continue;
\r\n"
voidcustomport(char*cp,char*cp2,char*cp3)
intintport;
char*checker;
startport=atoi(cp2);
endport=atoi(cp2);
if(strstr(cp2,"
))
intport=atoi(checker=strchr(cp2,'
)+1);
if(intport>
0&
intport<
65536)
endport=intport;
if(startport<
0||startport>
65536||endport<
0||endport>
65535)
usage(cp);
exit(-1);
setip2(cp3);
UINTportscan(LPVOIDport)
intaddr=portip;
intsock;
structfd_setmask;
structtimevaltimeout;
structsockaddr_inserver;
unsignedlongflag=1;
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
\r\nSockError:
%s"
WSAGetLastError());
maxth--;
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(addr);
server.sin_port=htons(short(port));
if(ioctlsocket(sock,FIONBIO,&
flag)!
closesocket(sock);
connect(sock,(structsockaddr*)&
server,sizeof(server));
timeout.tv_sec=18;
timeout.tv_usec=0;
FD_ZERO(&
mask);
FD_SET(sock,&
switch(select(sock+1,ZERO,&
mask,ZERO,&
timeout))
case-1:
\r\nSelect()error"
maxth--;
return-1;
case0:
closesocket(sock);
default:
if(FD_ISSET(sock,&
mask))
shutdown(sock,0);
[Found:
]%sPort:
%dopen.\r\n"
inet_ntoa(server.sin_addr),ntohs(server.sin_port));
scanok++;
return1;
voidportscannow(intxp)
intsport;
char*timenow,timebuf[32];
char*ports[32]={
21"
22"
23"
25"
53"
79"
80"
110"
111"
113"
123"
135"
139"
143"
443"
512"
513"
514"
515"
540"
1080"
1433"
1521"
1524"
3306"
3389"
5631"
6000"
6112"
8000"
8080"
12345"
timenow=_strtime(timebuf);
\r\nPortScanStartTime:
%s\r\n\n"
timenow);
maxth=0;
scanok=0;
scannum=0;
searched=0;
searchnum=hoststop-hoststart+1;
if(xp==3)
searchnum=searchnum*32;
if(xp==4)
searchnum=searchnum*(endport-startport+1);
for(portip=hoststart;
portip<
=hoststop;
portip++,scannum++)
if((portip%256)==0||(portip%256)==255)
if(xp==3)
searchnum=searchnum-32;
if(xp==4)
searchnum=searchnum-(endport-startport+1);
scannum--;
if(xp==3)
for(sport=0;
sport<
32;
sport++,maxth++,searched++)
{
TestThread(180);
CWinThread*pthread=AfxBeginThread(portscan,LPVOID(atoi((char*)ports[sport])));
Sleep(120);
}
if(xp==4)
{
sport=endport-startport;
if(sport>
500)
for(sport=startport;
=endport;
TestThread(2000);
CWinThread*pthread=AfxBeginThread(portscan,LPVOID(sport));
else
TestThread(250);
WaitThreadEnd();
\r\nPortScanEndTime:
timenow);
\r\nScan%dHostscompleted.Open%dPorts!
scannum,scanok);
6、代码实现
在刚开始的时候编译是成功的,但是build是有错误的,如图:
在网上找解决的方法,发现是MFC连接的问题,在工程—>
设置—>
microsoft基础类中不使用MFC改成使用MFC作为静态链接库,确定后再次build。
Build成功后代码能够成功运行,端口扫描成功
八、实验总结
1.实验中的遇到的问题:
刚开始老师布置作业的时候完全不知道怎么做,在网上找了一些资料和借鉴同学的实验过程才完成了这个实验,着实不易。
2.实验中的收获:
一定程度上加深了对MFC和socket编程的的理解,对课程学习打下了一个比较好的基础;
用一些设计模式在一定程度能提高开发效能,降低开发的复杂度,并且深刻地认识到实践才能出真知这个硬道理。