Programa em C para monitorar IPs e portas ativas
Publicado por Lauro Salmito Pinheiro 30/07/2009
[ Hits: 10.083 ]
Desenvolvi o PortMonitor para que os administradores de redes e segurança da informação possam gerar um relatório de status dos serviços e ficarem monitorando os serviços de vários servidores.
Distributed under GPLv2
Copyright (c) 2009 Lauro Salmito Pinheiro <laurosalmito@gmail.com>
/* * PortMonitor * Monitor dos status das portas dos hosts * * Distribute under GPLv2 * * Copyright (c) 2009 Lauro Salmito Pinheiro <laurosalmito@gmail.com> * */ #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <time.h> #include <gtk/gtk.h> #include <stdlib.h> #define BUFFSIZE 32 void displayUI(char *str) { GtkWidget* mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkWidget* label,*box1,*button,*box2; box1 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (mainWindow), box1); gtk_widget_show (box1); box2 = gtk_hbox_new (TRUE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 0); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, FALSE, 0); label = gtk_label_new (str); gtk_box_pack_start (GTK_BOX (box1), label, TRUE, FALSE, 0); gtk_widget_show (box2); gtk_window_set_default_size(GTK_WINDOW(mainWindow), 300, 200); gtk_window_set_title(GTK_WINDOW(mainWindow), " ..:: Port Monitor 1.0 ::.."); gtk_window_set_position(GTK_WINDOW(mainWindow), GTK_WIN_POS_CENTER_ALWAYS); gtk_signal_connect(GTK_OBJECT(mainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL); button = gtk_button_new_with_label (" ! OK ! "); g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (mainWindow)); gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show (label); gtk_widget_show_all(mainWindow); } void Die(char *mess) { perror(mess); exit(1);} void trim(char *s, const int len) { int end = len - 1; int start = 0; int i = 0; while ((start < len) && (s[start] <= ' ')) { start++; } while ((start < end) && (s[end] <= ' ')) { end--; } if (start > end) { memset(s, '{FONTE}', len); return; } for (i = 0; (i + start) <= end; i++) { s[i] = s[start + i]; } memset((s + i), '{FONTE}', len - i); } int connections(const char *ip,const char *port) { int sock,z,linger_return; struct sockaddr_in socket_struture; struct linger a; a.l_onoff=1; a.l_linger=0; sleep(1); if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { Die("Err:"); } memset(&socket_struture, 0, sizeof(socket_struture)); socket_struture.sin_family = AF_INET; socket_struture.sin_addr.s_addr = inet_addr(ip); socket_struture.sin_port = htons(atoi(port)); if ((z = connect(sock,(struct sockaddr *) &socket_struture,sizeof(socket_struture)) == 0)) { //printf("Porta %s Ativa:. - %d -\n",port,z); //Debug linger_return = setsockopt(sock, SOL_SOCKET, SO_LINGER,&a, sizeof(a)); close(sock); return 1; } else { // printf("Porta %s Desconectada:. - %d -\n",port,z); //De linger_return = setsockopt(sock, SOL_SOCKET, SO_LINGER,&a, sizeof(a)); close(sock); return 0; } } int main(int argc, char *argv[]) { FILE* filedest,*logfile; register int val; typedef char string[50]; string hosts[50]; string portas[50]; int j,i =0; gtk_init(&argc, &argv); char server[200]; if (argc>1) { if( (argc > 2 || (strcmp(argv[1],"-log")!=0)) && (argc > 2 || (strcmp(argv[1],"-x")!=0)) ) { printf("Numeros de parametros invalidos. Tente somente um parametro!\n"); exit(1); } } filedest = fopen("dest.conf","r"); if (filedest==NULL) { printf("Crie um arquivo no diretorio corrente chamado \"dest.conf\" - com os IPS e portas, separando-os com \":\"\n"); exit(0); } while (!feof(filedest)) { fscanf(filedest,"%s\t%s",hosts[i],portas[i]); i++; } fclose(filedest); for (;;) { time_t mytime; mytime = time(NULL); char *time_local; time_local = ctime(&mytime); trim(time_local,strlen(time_local)); for (j=0;j<i-1;j++) { val = connections(hosts[j],portas[j]); if (!argv[1]) { if (val==1) { printf("[%s] Host.::. %s - Porta -> %s ATIVA -\n",time_local,hosts[j],portas[j]); } else { printf("[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]); } } else { if(strcmp(argv[1],"-log")==0) { //FILE* logfile; logfile = fopen("monitor.log","a+"); if (val==1) { fprintf(logfile,"[%s] Host.::. %s - Porta -> %s ATIVA -\n",time_local,hosts[j],portas[j]); } else { fprintf(logfile,"[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]); } fclose(logfile); } if(strcmp(argv[1],"-x")==0) { if (val==0) { logfile = fopen("monitor.log","a+"); fprintf(logfile,"[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]); fclose(logfile); sprintf(server,"Data/Hora::.%s\nHost::.%s\nPorta::.%s\nStatus::.* INATIVO *\n",time_local,hosts[j],portas[j]); displayUI(server); gtk_main(); } } } } } return(0); }
Portscan Simples Usando Sockets em C
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
O que você está ouvindo agora? [2] (183)
Gestão de Ambiente em uma rede Linux (2)
Ajuda Pra Melhoria do NFTABLES. (7)
Zorin OS - Virtual Box não consigo abrir maquinas virtuais (4)