【发布时间】:2017-12-10 22:44:43
【问题描述】:
所以我正在尝试创建一个功能强大的 udp 端口扫描器。到目前为止,我的代码似乎缺少一些东西,例如开关、使用 iwreq 或只是扫描端口的链接列表,不确定。我是 C 编程新手,希望能提供任何帮助。
#include <erno.h>
#include <stdio.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <iwlib.h>
#include <wireless.h>
#define MAXSIZE 0
int main(){
struct timeval timesec;
int sockfd;
int ipleng;
int port= 1020;
struct hostent hostent;
struct sockaddr my_addre;
struct imcmphdr IC;
struct sockaddr_in my_addr;
struct ip ipp;
struct iw_range rang;
struct iwreq iwq;
char message=" ";
h_addr_list[0];
scan();
if(scan==NULL){
perror("scan not done");
exit(1);
}
int scan(){
ioctl(socket,SIOCSIWSCAN,&iwq);
iw_get_range_info(sockfd,wlan0,&rang);
if(iw_get_range_info(sockfd, wlan0, &rang)>0){
rang=1;
}
r=iw_get_range_info(sockfd,wlan0,&rang);
char serve [50];
int hlen;
int slen;
for(int i=0; port<r; i++){
if(hostt=getnameinfo(struct hostent *host, MAXSIZE, host, hlen, serve,
slen, NULL)==NULL){
if(haddrinfo=getaddrinfo(struct hostent *host, MAXSIZE, host, hlen, serve,
slen, NULL)==NULL){
exit(1);
}
else{
printf("IP address");
addrlist=h_addr_list;
for(i=0; addrlist[i]>0; i++){
printf("host: %s\n", arrdlist[i], hostt);
printf("server: %s\n", haddrinfo);
if(sockfd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0 {
perror("socket not created");
return -1;
if(rsock=sockfd(AF_INET, SOCK_RAW, IPPROTO_ICMP))<0){
perror("socket fail");
exit(1);
else{
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(1020);
my_addr.sin_addr.s_addr=inet_addr();
my_addr.sin_addr(struct in_addr*)hostt->h_addr;
if(sendto(sockfd,MAXSIZE,0,0,(struct sockaddr*)&my_addre,sizeof(my_addre))
<0){
perror("can't send");
return -1;
}
}
}
}
if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&host,sizeof(host))== -1){
perror("setsockopt(SOL_BROADCAST)");
return -1;
else
timesec.tv_sec=3;
while(1);
{
FD_ISSET(&my_addr);
FD_ZERO(&readfds);
FD_SET(&rsock,&readfds);
ipleng=ip->ip_hl<<2;
if(select(rsock+1,&readfds,NULL,NULL,&timsec);
for(;;){
if(select(rsock+1,&readfds,NULL,NULL,×ec){
if(FD_ISSET(rsock,&readfds0{
siz=read(rsock,(struct icmphdr*)&IC,sizeof(IC));
if(siz=0){
printf("can't read");
}
}
}
}
ipp=(struct ip*)MAXSIZE;
message=(struct icmp*)(MAXSIZE+ipleng);
if(recvfrom(rsock,MAXSIZE,sizeof(MAXSIZE),NULL,my_addre,hlen)<0){
perror("ICMP error");
printf("port closed");
if(message->icmp_type==ICMP_UNREACH)&&message->icmp_code==ICMP_UNREACH_PORT{
exit(1);
}
else{
if(message==0){
printf("p;ort open");
port=getservbyport(htons(addrlist[i], "port");
printf("udp port %d %s is open\n", addrlist[i], port->s_addr);
if(port==NULL){
printf("unknown");
}
}
}
}
}
}
}
}
}
}
}
fflush(sockfd);
return 0;
}
【问题讨论】:
-
它至少缺少正确的格式。
-
请转至help center 并了解如何询问以及询问什么。您可能有minimal reproducible example,但没有明确的问题陈述,也没有对问题的描述。 IOW,您需要付出一些努力。
-
if(select(rsock+1,&readfds,NULL,NULL,&timsec); -
不使用这种代码结构可以避免很多不可读的缩进:
exit(1); } else{#codingstyle 避免这种情况:` } } } } } } } } } }` 在末尾 -
你写的代码有很多错误。我建议您首先尝试以 C-ey 方式对其进行格式化。然后,开始通过带有警告的编译器运行代码。在 linux 或 mac 上,这将是“gcc -Wall filename.c”。你会得到很多错误,但要消除它们!然后,@Fabien 的回答是一个很好的起点。祝你好运!