linux下端口扫描程序(C)

网络攻击第一步是扫描目标机的开放端口,其原理是(摘自 http://www.pconline.com.cn/pcjob/nettech/safe/others/0502/557020_1.html):

根据TCP协议规范,当一台计算机收到一个TCP连接建立请求报文(TCP SYN)的时候,做这样的处理:

  1、 如果请求的TCP端口是开放的,则回应一个TCP ACK报文,并建立TCP连接控制结构(TCB);
  2、 如果请求的TCP端口没有开放,则回应一个TCP RST(TCP头部中的RST标志设为1)报文,告诉发起计算机,该端口没有开放。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的端口扫描的C语言程序,它可以扫描目标主机的特定端口是否开放: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MAX_PORTS 1000 int main(int argc, char *argv[]) { int sockfd, ret, start, end, i, j; struct sockaddr_in target_addr; char *target_ip, port_status[MAX_PORTS]; if (argc != 4) { printf("Usage: %s <target IP> <start port> <end port>\n", argv[0]); exit(EXIT_FAILURE); } target_ip = argv[1]; start = atoi(argv[2]); end = atoi(argv[3]); if (start < 1 || end < 1 || start > MAX_PORTS || end > MAX_PORTS) { printf("Invalid port range\n"); exit(EXIT_FAILURE); } if (start > end) { printf("Invalid port range: start port must be less than or equal to end port\n"); exit(EXIT_FAILURE); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("Failed to create socket: %s\n", strerror(errno)); exit(EXIT_FAILURE); } memset(&target_addr, 0, sizeof(target_addr)); target_addr.sin_family = AF_INET; target_addr.sin_addr.s_addr = inet_addr(target_ip); // Scan ports for (i = start; i <= end; i++) { target_addr.sin_port = htons(i); ret = connect(sockfd, (struct sockaddr *)&target_addr, sizeof(target_addr)); if (ret == 0) { printf("Port %d is open\n", i); port_status[i] = 1; } else { port_status[i] = 0; } } printf("Port scan completed. Open ports: "); for (j = start; j <= end; j++) { if (port_status[j] == 1) { printf("%d ", j); } } printf("\n"); close(sockfd); return 0; } ``` 请注意,这个程序需要在Linux或Unix系统上运行,因为它使用了Unix网络编程API。如果需要在Windows上运行,请使用Winsock API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值