探測遠程主機防火墻允許開放端口
時間:2010-07-15 22:37:05 整理:佚名 []
大家都知道如果能夠連接遠程主機的某個端口,那么這個端口自然是防火墻允許開放的。現在的問題是,現在端口關閉著,如何判斷呢?
這里我想到有大蝦說過telnet遠程主機端口時,如果很快返回連接失敗就說明端口關閉;如果等了十多秒才返回多半是對方裝有防火墻。這個方法是對的,可是一共有65535個端口,不會讓我慢慢去telnet吧,所以就寫個程序自動去掃。
同端口掃描程序類似,這個程序也調用winsock的connect函數,但由于端口是關閉的,所以connect會返回一個錯誤碼10061(連接被拒。由于被目標機器拒絕,連接無法建立);但如果是對方的防火墻攔截了連接請求的話,過段時間就會返回10060錯誤(連接超時)。利用返回的錯誤類型我們就可以判斷該端口是否為遠程主機防火墻允許開放的了。不過這里注意,如果目標ip不存在主機的話也會超時的哦。
原理搞懂了寫程序也就很簡單了,就是調用winsock的connect。關于winsock編程參考《WINDOWS網絡編程技術》吧;嗯,另外注意用多線程,不然的話,呵呵,一整天都掃不完。多線程要使用CreateThread這個API函數,看看MSDN吧。隨便在網上找了個掃描器代碼參考,寫了這個程序,代碼如下:
#include
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
#define MAXThreadCount 100//設置 大線程數
#define SumScanCount 65535//設置掃描端口總數
struct sockaddr_in server;
int ThreadCount=0;
int dwThrdParam = 1; //CreateThread的參數,提到前面好計算
unsigned int resolve(char *name)
struct hostent *he;
unsigned int ip;
if((ip=inet_addr(name))==(-1))
if((he = gethostbyname(name))==0)
printf("ERROR: Don't find the %s .\n",name);
exit(0);
}
memcpy(&ip,he->h_addr,4);
}
return ip;
}
DWORD WINAPI Scan(LPVOID lpParam )
int mysock,code,port=(int)lpParam ;
mysock=socket(AF_INET,SOCK_STREAM,0);
if(mysock < 0) { printf("socket error!");
server.sin_port = htons(port);
if(connect(mysock,(struct sockaddr *) & server,sizeof(server))!=0)
code=GetLastError();
if(code==10061)printf("port %d allown open\n",port);
else
printf("port %d openning\n",port);
closesocket(mysock);
ThreadCount--;
return 0;
}
void thread(int port)
{
DWORD dwThreadId;
HANDLE hThread;
WSADATA ws;
if (WSAStartup( MAKEWORD(2,2), &ws )!=0) ;
{
printf(" [-] WSAStartup() error\n");
exit(0);
}
hThread = CreateThread(
NULL, // no security attributes g
0, // use default stack size
Scan, // thread function
(LPVOID)port, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier n
if (hThread == NULL)
printf( "CreateThread failed." );
dwThrdParam++;
ThreadCount++;
Sleep(200); //延時,否則CPU會用滿……
CloseHandle(hThread);
}
void main(int argc, char* argv[])
{
if(argc!=2)
{
printf("\n- This program find port that firewall allow open -\n");
printf("- Only for test by lake2 - \n");
printf("Usage: %s IP\n",argv[0]);
exit(0);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = resolve( argv[1] );
printf("Starting and waiting..............\n");
while( dwThrdParam <= SumScanCount )
{
if( ThreadCount < MAXThreadCount ){ thread(dwThrdParam); }
}
while( ThreadCount!=0 ){ }
WSACleanup();
printf("Done!");
}
運行程序,填上ip它就會自動探測所有端口,由于那些被過濾的端口大概都差不多要等二十秒,速度比較慢,可以自己設個超時值加快速度;另外也可以修改一下讓用戶自定義掃描范圍等等,現在不管了,用得起就行。
程序做好了當然要拿來用啦,經過漫長的3小時多的掃描之后,得到結果:目標主機_blank">防火墻只開放80端口。當場暈死!唉,“路漫漫其修遠兮,吾將上下而求索”……

![]() ![]() |
![]() |
關鍵詞:探測遠程主機防火墻允許開放端口 相關文章