上一篇:修改用户控制权限管理自启动文件 >>
探测远程主机上防火墙允许开放端口
大家都知道如果能够连接远程主机的某个端口,那么这个端口自然是_blank">防火墙允许开放的。现在的问题是,现在端口关闭着,如何判断呢?
这里我想到有大虾说过telnet远程主机端口时,如果很快返回连接失败就说明端口关闭;如果等了十多秒才返回多半是对方装有_blank">防火墙。这个方法是对的,可是一共有65535个端口,不会让我慢慢去telnet吧,所以就写个程序自动去扫。
同端口扫描程序类似,这个程序也调用winsock的connect函数,但由于端口是关闭的,所以connect会返回一个错误码10061 (连接被拒。由于被目标机器拒绝,连接无法建立);但如果是对方的_blank">防火墙拦截了连接请求的话,过段时间就会返回10060错误(连接超时)。利用返回的错误类型我们就可以判断该端口是否为远程主机_blank">防火墙允许开放的了。不过这里注意,如果目标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 0, // use default stack size scan, // thread function (lpvoid)port, // argument to thread function 0, // use default creation flags &dwthreadid); // returns the thread identifier 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!"); } 下一篇:溢出下shell下的文件上传 >> 相关文章:
© 2006 www.java-asp.net
|
