#include < winsock2.h >
#include < windows.h >
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#pragma comment( lib, "WS2_32.lib" )
void psTitle( char * );//欢迎界面
void ps1( char *, char * );//默认扫描方式
void ps2( char *, char *, char *, char * );//自定义扫描方式
void GetLocalDate( void );//获得主机信息
DWORD WINAPI psProc(//线程函数
LPVOID lpParameter // thread data
);//全局变量
char g_szTargetIP[20]; //目标地址和目标端口
int g_nTargetPort;
int g_nPorts[23] = {
21,22,23,25,53,79,80,110,111,119,135,139,143,
443,445,512,554,1080,1433,1521,2401,3306,3389
};//默认常用探测端口
int g_nOpenPorts;//端口开放数量
class CGetError{
public:
void PortError( int nStartPort, int nEndPort )
{
if ( nStartPort < 0 || nStartPort > 65535 || nEndPort < 0 || nEndPort > 65535 )
{
printf("错误: 端口输入/n");
exit(1);
}
if ( nStartPort >= nEndPort )
{
printf("错误: 端口输入/n");
exit(1);
}
}
void main(int argc,char *argv[]){
if( argc == 1 )
{
psTitle( argv[0] );
exit( 1 );
}
else if(argc == 3)
{
ps1( argv[1] , argv[2] );
}
else if( argc == 5 )
{
ps2( argv[1], argv[2], argv[3], argv[4] );
}
else
{
printf( "错误: 参数输入/n" );
exit( 1 );
}
}
void psTitle(char *help)//欢迎界面
{
printf("--------------------------------------------------------------------/n");
printf ("Portscan端口扫描器/n");
printf ("------------------------------本机信息------------------------------/n");
GetLocalDate();
printf ("------------------------------功能说明------------------------------/n");
printf ("常用端口扫描:/n");
printf ("/tPortscan <目标IP> [等待时间(毫秒)]/n");
printf ("自定义端口扫描:/n");
printf ("/tPortscan <目标IP> [开始端口] [结束端口] [等待时间(毫秒)]/n");
printf ("举例:/n");
printf ("/tPortscan 127.0.0.1 1/n");
printf ("/tPortscan 127.0.0.1 0 65535 1/n");
}
void ps1( char *target, char *delay )//默认扫描方式
{
CGetError psError;//初始化CGetError
int nDelayTime = atoi( delay );
CInitSock initSock;//初始化Winsock库
HANDLE hThread1;
strcpy( g_szTargetIP , target );
psError.IPError();//输入错误处理
psError.DelayTimeError( nDelayTime );
printf( "目标地址: ");
puts( target );
printf( "目标端口: 默认常用端口" );
printf("/n------------------------------扫描报告------------------------------");
for ( int i = 0; i < 23; i++ )
{
g_nTargetPort = g_nPorts[i];
//NULL 使用缺省的安全性
//0 采用调用线程一样的大小
//psProc 指定线程入口函数的地址
//NULL 传递给线程的一个参数
//0 创建的标记为0 一旦创建立即运行
//NULL 线程的ID 不需要使用
hThread1 = CreateThread( NULL, 0, psProc, NULL, NULL, NULL );
CloseHandle( hThread1 );
Sleep( nDelayTime );
}
printf( "/n/n共扫描到%d个端口开放" , g_nOpenPorts );
printf ("/n--------------------------------------------------------------------/n");
printf( "/n/n端口扫描完毕/n" );
}
void ps2( char *target, char *start, char *end, char *delay )//自定义扫描方式
{
CGetError psError;//初始化CGetError
int nStartPort = atoi( start );
int nEndPort = atoi( end );
int nDelayTime = atol( delay );
CInitSock initSock;//初始化Winsock库
HANDLE hThread2;
strcpy( g_szTargetIP , target );
psError.PortError( nStartPort, nEndPort );//输入错误处理
psError.IPError();
psError.DelayTimeError( nDelayTime );
printf( "目标地址: ");
puts( target );
printf( "目标端口: %d -- %d:", nStartPort, nEndPort );
printf ("/n------------------------------扫描报告------------------------------");
for ( int port = nStartPort; port <= nEndPort; port++ )
{
g_nTargetPort = port;
//NULL 使用缺省的安全性
//0 采用调用线程一样的大小
//psProc 指定线程入口函数的地址
//NULL 传递给线程的一个参数
//0 创建的标记为0 一旦创建立即运行
//NULL 线程的ID 不需要使用
hThread2 = CreateThread( NULL, 0, psProc, NULL, NULL, NULL );
CloseHandle( hThread2 );
Sleep( nDelayTime );
}
printf( "/n/n共扫描到%d个端口开放" , g_nOpenPorts );
printf( "/n/n端口扫描完毕/n" );
}
};