【发布时间】:2018-01-07 06:53:02
【问题描述】:
我正在编写一个端口扫描器,目的是循环遍历整个子网,以查看是否在任何主机上打开了端口 445,以此作为学习 C 编程的一种方式。该程序当前的设置方式是,需要手动输入一个 IP 地址,然后扫描仪就会启动。它运行良好(最终)。
我目前面临的问题:我不确定如何让这个程序扫描整个子网,而不仅仅是单个主机。在研究了这个问题之后,我相信最好的方法是去掉 IP 地址的最后一个八位字节,并让它从 1-254 循环。但是,我不完全确定如何开始处理这个问题。这是我当前的代码(大量注释以澄清):
...
void portScan() {
struct hostent *host;
int err, i , sock ,start , end;
char hostname[100];
struct sockaddr_in sa;
//Get the hostname to scan
printf("Enter hostname or IP to scan: ");
gets(hostname);
//Get start port number
start = 445;
//Get end port number
end = 445;
//Initialise the sockaddr_in structure
strncpy((char*)&sa , "" , sizeof sa);
sa.sin_family = AF_INET;
//direct ip address, use it
if(isdigit(hostname[0])) {
sa.sin_addr.s_addr = inet_addr(hostname);
}
//Start the port scan loop
printf("Starting the portscan loop : \n");
for( i = start ; i <= end ; i++) {
//Fill in the port number
sa.sin_port = htons(i);
//Create a socket of type internet
sock = socket(AF_INET , SOCK_STREAM , 0);
//Check whether socket was created or not
if(sock < 0) {
perror("\nSocket");
exit(1);
}
//Connect using that socket and sockaddr structure
err = connect(sock , (struct sockaddr*)&sa , sizeof sa);
//not connected
if(err < 0) {
//printf("%s %-5d %s\r" , hostname , i, strerror(errno));
fflush(stdout);
}
//connected
else {
printf("%-5d open\n", i);
}
close(sock);
}
printf("\r");
fflush(stdout);
}
TL;DR:我不知道如何修改此代码以去除 IP 地址的最后一个八位字节,并通过将最后一个八位字节替换为 1 - 254 来循环子网。任何反馈、想法或帮助高度赞赏!在 C 世界中仍然非常初级。
【问题讨论】:
-
strncpy来自空字符串没有意义。你的意思是memsetor=0? -
@DavisHerring 很有趣,感谢您的反馈并抓住了这一点!立即查看详细信息。
-
你在问这个问题,那么你没有看的太长了(
TL;DR:)??
标签: c subnet port-scanning