
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib")
int main(int argc, char **argv)
{
SOCKET sd_client
u_short iPortStart, iPortEnd, port
struct sockaddr_in addr_srv
char *pszHost
WSADATA wsaData
WORD wVersionRequested
int err
switch(argc)
{
case 2:
iPortStart = 0
iPortEnd = 65535
pszHost =argv[1]
break
case 3:
iPortStart = iPortEnd = atoi(argv[2])
pszHost =argv[1]
break
case 4:
iPortStart = atoi(argv[2])
iPortEnd = atoi(argv[3])
pszHost =argv[1]
break
default:
printf("正确的命令行参数:\n")
printf("[IP] 扫描所有端口\n")
printf("[IP] [端口]:扫描单个端口\n")
printf("[IP] [端口1] [端口2]:扫描端口1到端口2\n")
return 1
}
wVersionRequested = MAKEWORD( 1, 1 )
err = WSAStartup( wVersionRequested, &wsaData )
if ( err != 0 )
{
printf("Error %d: Winsock not available\n", err)
return 1
}
for(port=iPortStartport<=iPortEndport++)
{
sd_client = socket(PF_INET, SOCK_STREAM, 0)
if (sd_client == INVALID_SOCKET)
{
printf("no more socket resources\n")
return 1
}
addr_srv.sin_family = PF_INET
addr_srv.sin_addr.s_addr=inet_addr(pszHost)
addr_srv.sin_port = htons(port)
err = connect(sd_client, (struct sockaddr *) &addr_srv, sizeof(addr_srv))
if (err == INVALID_SOCKET)
{
printf("不能连接此端口:%d\n", port)
closesocket(sd_client)
continue
}
printf("扫描此端口成功:%d\n", port)
closesocket(sd_client)
}
WSACleanup()
return 0
}
TCPSYN扫描
这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态。一个RST返回,表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录。但这种方法的一个缺点是,必须要有root权限才能建立自己的SYN数据包。
TCP扫描技术
最基本的利用TCP扫描就是使用connect(),这个很容易实现,如果目标主机能够connect,就说明一个相应的端口打开。不过,这也是最原始和最先被防护工具拒绝的一种。
在高级的TCP扫描技术中主要利用TCP连接的三次握手特性和TCP数据头中的标志位来进行,也就是所谓的半开扫描。
总的说来syn扫描速度更快,结果一样
TCP connect 扫描:TCP connect 扫描是最基本的TCP扫描方式。connect()是一种系统调用,由 *** 作系统提供,用来打开一个连接。如果目标端口有程序监听,connect()就会成功返回,否则这个端口是不可达的。这项技术最大的优点是,你勿需root权限。任何UNIX用户都可以自由使用这个系统调用。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)