?? tcpconnectscan.cpp
字號:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")
// 端口結構,包括開始端口和結束端口
typedef struct _PortList
{
unsigned int start_port;
unsigned int end_port;
unsigned short thread_id;
}PortList;
#define MAX_THREAD 60 // 定義最大線程數
char TargetIP[20]; // 目標機IP地址
unsigned int ThreadNum; // 掃描線程數
unsigned int StartPort;
unsigned int EndPort;
// 解析命令函數
void ParseCmd(int argc, char **argv)
{
char *pdest;
int result;
int ch = '-'; // 分隔符
char startport[8];
char endport[8];
ZeroMemory(startport,8);
ZeroMemory(endport,8);
if(argc < 3 || argc >4)
{
printf("usage : %s [TargetIP] [StartPort-EndPort] [ThreadNum]\n");
}
else// 參數為3個時,默認線程數為1
{
strcpy(TargetIP,argv[1]); // 獲取目標機IP
pdest = strchr( argv[2], ch );
result = pdest - argv[2] + 1; // 尋找‘-’的位置
strncpy(startport,argv[2],result-1); // 提取開始端口
strncpy(endport,argv[2]+result,strlen(argv[2])-result); // 提取結束端口
StartPort = atoi(startport);
EndPort = atoi(endport);
}
if(argc == 3)
{
ThreadNum = 1;
}
else
{
ThreadNum = atoi(argv[3]); // 提取線程數
if(ThreadNum>MAX_THREAD)
{
printf("超出最大線程數范圍(1-60)!\n");
exit(0);
}
}
}
// 端口掃描線程
DWORD WINAPI ScanHost(LPVOID lpParam)
{
WSADATA wsd;
// 初始化Winsock庫
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("加載Winsock失敗!\n");
return 0;
}
unsigned int startport; // 每個線程的開始端口
unsigned int endport; // 每個線程的結束端口
unsigned short threadid; // 進程標志位
PortList *pl;
pl = (PortList *)malloc(sizeof(PortList));
if(pl == NULL)
{
printf(" 不能分配足夠的內存!\n");
exit(0);
}
pl = (PortList *)lpParam;
startport = pl->start_port;
endport = pl->end_port;
threadid = pl->thread_id;
SOCKET client_sock;
struct sockaddr_in server;
// 創建連接端口的套接字
client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (client_sock == INVALID_SOCKET)
{
printf("創建socket失敗: %d\n", WSAGetLastError());
return 0;
}
// 設置目標機相關參數
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(TargetIP);
// 開始探測端口
for( unsigned int i=startport; i<=endport; i++)
{
// 設置目標機端口
server.sin_port = htons(i);
if (connect(client_sock, (struct sockaddr *)&server,
sizeof(server)) == SOCKET_ERROR)
{ // 連接不成功,端口未開放
// printf("端口 %5d 未開放 ---Thread %d\n", i, threadid);
}
else
{ // 連接成功,端口開放
printf("端口 %5d 開放!! ---Thread %d\n",i ,threadid);
}
Sleep(1);
}
closesocket(client_sock);
return NULL;
}
int main(int argc, char **argv)
{
ParseCmd(argc,argv);
unsigned int portnum = EndPort-StartPort+1; // 總共的端口數目
if(portnum<ThreadNum)
{
printf("請確保總端口數目大于線程數!\n");
exit(0);
}
PortList *pl;
pl = (PortList *)malloc(sizeof(PortList));
if(pl == NULL)
{
printf(" 不能分配足夠的內存!\n");
exit(0);
}
printf("\n開始掃描目標主機 %s 端口范圍 %d-%d 線程數 %d\n\n",TargetIP,StartPort,EndPort,ThreadNum);
int aver = portnum/ThreadNum; // 每個線程的端口數目
DWORD dwStart = GetTickCount(); // 計時開始
HANDLE h[MAX_THREAD]; // 線程句柄
for(unsigned int i=0; i<ThreadNum; i++)
{
// 設置每個線程開始端口
pl->start_port = StartPort + i*aver;
pl->thread_id = i+1; // 線程ID
// 設置每個線程結束端口
if(i!=ThreadNum-1)
{
pl->end_port = StartPort + (i+1)*aver -1;
}
else
{
pl->end_port = EndPort;
}
// 創建掃描線程
h[i] = CreateThread(NULL, 0, ScanHost, pl, 0, 0);
Sleep(100);
}
// 等待線程全部結束
WaitForMultipleObjects(ThreadNum,h,TRUE,INFINITE);
printf("\n 端口掃描消耗時間 : %d ms \n",GetTickCount()-dwStart);
free(pl);
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -