/*------------------------------------------------------------ Acceptable port scanner - EasyScan Ver 1.00 Programmed by UNYUN ------------------------------------------------------------ */ #include #include #include #include #include #include #include /* #include #include */ #define TIMEOUT_V 2 /* Connectionタイムアウト値 */ #define MAX_IPLEN 16 /* IPアドレスの最大文字数 */ int sock; /* 接続用ソケット */ main() { int portscan(int, char *); int separation(char *,unsigned long *); unsigned long ips,ipe,ip; char buf[MAX_IPLEN],buf2[MAX_IPLEN]; int portn; FILE *fp; printf("Acceptable port scanner - EasyScan Ver 1.00\n"); printf("Programmed by UNYUN\n\n"); printf("対象IPアドレス 開始 : "); scanf("%s",buf); if (separation(buf,&ips)==-1){ printf("Error : IPアドレスの指定に誤りがあります.\n"); exit(1); } printf("対象IPアドレス 終了 : "); scanf("%s",buf2); if (separation(buf2,&ipe)==-1){ printf("Error : IPアドレスの指定に誤りがあります.\n"); exit(1); } printf("ポート番号 : "); scanf("%d",&portn); if ((fp=fopen("log.txt","w"))==NULL){ printf("Error : ファイルの書き込みができません\n"); exit(1); } fprintf(fp,"対象IPアドレス 開始 : %s\n",buf); fprintf(fp,"対象IPアドレス 終了 : %s\n",buf2); fprintf(fp,"ポート番号 : %d\n",portn); fprintf(fp,"\n\n"); for (ip=ips;ip<=ipe;ip++){ sprintf(buf,"%lu.%lu.%lu.%lu", ip>>24, (ip&0x00ff0000)>>16, (ip&0x0000ff00)>>8, ip&0x000000ff); printf("%15s...",buf); fprintf(fp,"%15s...",buf); if (portscan(portn,buf)==0){ printf("Connected!\n"); fprintf(fp,"Connected!\n"); }else{ printf("no\n"); fprintf(fp,"no\n"); } } fclose(fp); } /*================================================== IPアドレス文字列の数値化 [Input] ipaddr : IPアドレス文字列 ipl : IPアドレス格納バッファ [Output] 0 : 正常 -1 : IPアドレスの指定に誤りがある ================================================== */ int separation(char *ipaddr,unsigned long *ipl) { int i,j,n; char buf[MAX_IPLEN]; int ip[4]; unsigned long d; for (n=0,j=0,i=0;i<=strlen(ipaddr);i++){ if (ipaddr[i]=='.' || i==strlen(ipaddr)){ buf[j]=0; ip[n]=atoi(buf); if (ip[n]<0 || ip[n]>255) return (-1); n++; j=0; }else{ buf[j]=ipaddr[i]; j++; } } if (n!=4) return (-1); d=256; *ipl=ip[3]+ip[2]*d+ip[1]*d*d+ip[0]*d*d*d; return(0); } /*================================================== IP、ポート番号を指定してConnect [Input] port : ポート番号 ipaddr : IPアドレス [Output] 0 = Connect可 -1 = Socket生成エラー -2 = バインドエラー -3 = Connectionエラー ================================================== */ int portscan(int port, char *ipaddr) { struct sockaddr_in addr, server; /* ソケットアドレス構造体 */ void timeoutfunc(); /****** Socket生成 ************************************/ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0){ printf("Socket creation error"); return(-1); } /****** SocketのBind **********************************/ memset((char *) &server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = 0; if (bind(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { close(sock); printf("Bind error "); return (-2); } /****** Connect **************************************/ addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ipaddr); addr.sin_port = htons(port); signal(SIGALRM, timeoutfunc); alarm(TIMEOUT_V); if (connect(sock,(struct sockaddr *)&addr,sizeof(addr))!=0){ close(sock); return (-3); } close(sock); return (0); } void timeoutfunc() { close(sock); }