Programa em C para monitorar IPs e portas ativas
Publicado por Lauro Salmito Pinheiro 30/07/2009
[ Hits: 10.305 ]
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
Robo HTTP usando socket e código multiplataforma
Usando sockets para monitorar servidores
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Necessário autenticar ao imprimir - Ubuntu X Windowns (1)
O que houve com slackware ??? (11)
O Free Download Manager não abre no Fedora 43 KDE Plasma (2)









