【问题标题】:UDP port scanner issues, CUDP 端口扫描器问题,C
【发布时间】: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,&timesec){
        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,&amp;readfds,NULL,NULL,&amp;timsec);
  • 不使用这种代码结构可以避免很多不可读的缩进:exit(1); } else{ #codingstyle 避免这种情况:` } } } } } } } } } }` 在末尾
  • 你写的代码有很多错误。我建议您首先尝试以 C-ey 方式对其进行格式化。然后,开始通过带有警告的编译器运行代码。在 linux 或 mac 上,这将是“gcc -Wall filename.c”。你会得到很多错误,但要消除它们!然后,@Fabien 的回答是一个很好的起点。祝你好运!

标签: c sockets udp port


【解决方案1】:

“UDP 端口扫描器”之类的东西在技术上并不存在,因为 UDP 是无状态的,所以没有连接。

相反,“UDP 端口扫描器”所做的是发送“有效负载”以尝试获得响应。

基本上,测试 UDP 53 的正确有效负载是 DNS 请求。

因此,您实现了有效负载,并在一个端口上测试了所有有效负载。然后你就有了一种 UDP 扫描器。

好吧,我想这并不能回答您的问题,但我希望它可以帮助您执行更好的扫描仪。

【讨论】:

  • 感谢您尝试获取代码以将数据包发送到各个端口并检测哪个端口响应 icmp 错误,但我会检查您所说的。
  • 在受保护的服务器上,这些 ICMP 数据包被过滤,而预期的 UDP 流量不会被过滤。这就是为什么 nmap 会在这些端口上告诉您open|filtered。因为他不知道它们是 ICMP 防火墙还是开放的。只有适当的有效载荷才能说明。 nmap -sU -p 55555 8.8.8.8
  • 好吧,我试试看,但代码似乎有问题(我的代码就是这样)。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多