Eukleides project

from http://d.hatena.ne.jp/u5_h/

UDPportscan BSD仕様

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
struct sockaddr_in addr;
struct icmp *icmp;
struct ip *ip;
struct ip *ip2;
struct timeval t;
struct udphdr *udp;
int dsv,ihlen,ihlen2;
fd_set fds;

int ssd = socket(AF_INET,SOCK_DGRAM,0);
int rsd = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
char buf[8192];
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(dsv);
for(dsv=1;dsv<=65536;dsv++)
{
addr.sin_port = htons(dsv);
sendto(ssd,NULL,0,0,(struct sockaddr*)&addr,sizeof addr);
t.tv_sec=1;
t.tv_usec =0;
while(1)
{
FD_ZERO(&fds);
FD_SET(rsd,&fds);
if(select(rsd + 1,&fds,NULL,NULL,&t)>0)
{
int j=recvfrom(rsd,buf,8192,0,NULL,NULL);
ip = (struct ip *) buf;
ihlen =ip->ip_hl<<2;
icmp = (struct icmp *)((char *)ip+ihlen);
ip2 =(struct ip *) icmp->icmp_data;
ihlen2 =ip2->ip_hl<<2;
udp=(struct udphdr *) ((char *)ip2+ihlen2);
if(
(j==56)
&&(ip->ip_src.s_addr ==addr.sin_addr.s_addr)
&&(icmp->icmp_type == ICMP_UNREACH)
&&(icmp->icmp_code == ICMP_UNREACH_PORT)
&&(udp->uh_dport==addr.sin_port)
)
break;
}else{
printf("%5d\n",dsv);
}
}
usleep(10*1000);
}
close(ssd);
close(rsd);
return 0;
}