[Previo por Fecha] [Siguiente por Fecha] [Previo por Hilo] [Siguiente por Hilo]

[Hilos de Discusión] [Fecha] [Tema] [Autor]

Re: [Ayuda] antivirus para Linux



Bueno muchachos.
Les envio un poquito de spam a pedido de varios amigos de la lista.

Es el programa en C prometido

Instrucciones básicas:

1. Crear para sendmail una cuenta denominada michivirus.
2. Incluir esa cuenta a su manejador de correo preferido. No usar windows.
3. Usar el cron como root para invocar al programa, digamos cada 10 minutos.
4. Podrán recibir en la cuenta michivirus todos los mensajes maliciosos que 
tanto dolor de cabeza les dan a los administradores :(
5. El resto de las cuentas quedarán libres de esos bichos :o
6. Espero sus valiosas críticas :)

Vladimir

> Un pequeño comentario a propósito del Subject:
>
> 1. Sabian que el 99.9444444% de los emails con adjuntos cuyo nombre termina
> en estas cuatro variantes: .exe .bat .pif .src SI son virus?
> 2. Y que el resto de los mensajes que no cumplen esta regla NO lo son?
>
> Algunas especulaciones:
>
> 1. No será que la solución inclusive para los antivirus en los sistemas
> Windows XXX es mas simple de lo que parece?
> 2. No será que NORTON y MCAFEE se están haciendo ricos con nuestra
> inocencia? 
> 3. Asi se escribe MCAFEE?
>
> Algunas Promesas:
>
> 1. Quiero ver cuantos valientes los comprueban y me lo cuentan :)
> 2. Al que lo desee le mando un programa hecho en C para filtrar los
> susodichos.
>
> Vladimir
>
/*
michivirus. Filtrado de virus que se aprovechan de la inocencia de la gente. Versión v2002
Vladimir E. Flores C. La Paz - Bolivia
*/

#include	<fcntl.h>
#include	<stdio.h>
#include	<unistd.h>
#include	<stdlib.h>
#include	<dirent.h>
#include	<string.h>
#include	<sys/stat.h>
#include	<sys/types.h>

#define		USUARIOS_MAX		100
#define		NOMBRE_MAX			256
#define		CANTIDAD_MAX		10000000
#define		INDICE_MAX			1000
#define		UID_MICHIVIRUS		3028

struct usuario
	{
	unsigned	char nombre[NOMBRE_MAX];
	off_t		tamano;
	time_t		tiempo;
	};

struct		usuario usuarios[USUARIOS_MAX];
unsigned	char directorio_00[]="/home/";
unsigned	char directorio_01[]="/var/spool/mail/";
unsigned	char archivo_00[]="/home/michivirus/usuarios";
unsigned	char archivo_01[]="michivirus";
unsigned	char archivo_02[]="/var/spool/mail/michivirus";
unsigned	char patron_01[]="From ";
unsigned	char patron_02[]="name=";

unsigned	char *buffer;
int			indice[INDICE_MAX][3];
int			usuario_,puntero,indice_,cantidad,virus,viruses;

int	main();
int lectura_usuarios();
void escritura_usuarios();
int lectura_mail();
void procesar_virus();
int buscar_cabeza();
void buscar_virus();
void registro();
void actualizar_usuarios();

int	main()
	{
	int		i;
	
	if((i=lectura_usuarios())==-1) return 0;
	if(lectura_mail()) escritura_usuarios(i);
	return 0;
	}

int lectura_usuarios()
	{
	int			i,j,h;
    DIR			*dp;
    struct 		dirent *ep;
	
	for(i=0;i<USUARIOS_MAX;i++)
		{
		bzero(usuarios[i].nombre,NOMBRE_MAX);
		usuarios[i].tamano=0;
		usuarios[i].tiempo=0;
		}
		
	if((dp=opendir(directorio_00))==NULL) return -1;i=0;
	while((ep=readdir(dp)))	
		{
		if(strlen(ep->d_name)<3) continue;
		if(!strcmp(ep->d_name,archivo_01)) continue;
		strcpy(usuarios[i].nombre,directorio_01);
		strcat(usuarios[i].nombre,ep->d_name);i++;
		}
	closedir(dp);
	
	if((h=open(archivo_00,O_RDWR))!=-1)
		{
		j=lseek(h,0,SEEK_END);lseek(h,0,SEEK_SET);
		if(sizeof(struct usuario)*i==j)
			{
			read(h,usuarios,sizeof(struct usuario)*USUARIOS_MAX);
			close(h);return i;
			}
		close(h);
		}

	
h=creat(archivo_00,S_IRUSR|S_IWUSR);
	write(h,usuarios,sizeof(struct usuario)*i);
	close(h);return i;
	}

void escritura_usuarios(int i)
	{
	int		h;
		
	
h=creat(archivo_00,S_IRUSR|S_IWUSR);
	write(h,usuarios,sizeof(struct usuario)*i);
	close(h);
	}
	
int lectura_mail()
	{
	int			j,h;
	struct		stat id;
	
	for(usuario_=j=0;usuario_<USUARIOS_MAX;usuario_++)
		{
		if(usuarios[usuario_].nombre[0]==0) continue;
		if(stat(usuarios[usuario_].nombre,&id)==-1) continue;
		if((usuarios[usuario_].tamano==id.st_size)&&
			(usuarios[usuario_].tiempo==id.st_mtime)) continue;
		usuarios[usuario_].tamano=id.st_size;usuarios[usuario_].tiempo=id.st_mtime;j=1;
		if((h=open(usuarios[usuario_].nombre,O_RDWR))==-1) continue;
		cantidad=lseek(h,0,SEEK_END);lseek(h,0,SEEK_SET);
		if(cantidad==0) {close(h);continue;}
		if(cantidad>CANTIDAD_MAX) 
			{
			printf("Michivirus: Archivo muy grande %s\n",usuarios[usuario_].nombre);
			close(h);continue;
			}
		buffer=calloc(1,cantidad);read(h,buffer,cantidad);close(h);
		procesar_virus();free(buffer);
		}
	return j;
	}
	
void procesar_virus()
	{
	virus=viruses=indice_=indice[0][0]=0;
	for(puntero=0;puntero<cantidad;puntero++)
		{buscar_virus();if(buscar_cabeza()) registro();}
	registro();if(viruses) actualizar_usuarios();
	}
	
int buscar_cabeza()
	{
	int		i;
	
	if(strncmp(buffer+puntero,patron_01,strlen(patron_01))) return 0;
	for(i=puntero;i<cantidad;i++) if(*(buffer+i)==0xa) break;
	if(*(buffer+i-2)!='0') return 0;
	if(*(buffer+i-3)!='0') return 0;
	if(*(buffer+i-4)!='2') return 0;
	if(*(buffer+i-5)!=' ') return 0;
	if(*(buffer+i-8)!=':') return 0;
	if(*(buffer+i-11)!=':') return 0;
	if(*(buffer+i-14)!=' ') return 0;
	if(*(buffer+i-17)!=' ') return 0;
	if(*(buffer+i-21)!=' ') return 0;
	return puntero;
	}
	
void buscar_virus()
	{
	int		i;
	
	if(strncmp(buffer+puntero,patron_02,strlen(patron_02))) return;
//	if(*(buffer+puntero-1)!=0x9) return; // tabulador
	for(i=puntero;i<cantidad;i++) if(*(buffer+i)==0xa) break;
	if(!strncmp(buffer+i-4,".bat",4)) {virus=viruses=1;return;}
	if(!strncmp(buffer+i-4,".pif",4)) {virus=viruses=1;return;}
	if(!strncmp(buffer+i-4,".scr",4)) {virus=viruses=1;return;}
	if(!strncmp(buffer+i-4,".exe",4)) {virus=viruses=1;return;}
	if(*(buffer+i-1)!=0x22) return; // comillas
	if(!strncmp(buffer+i-5,".bat",4)) {virus=viruses=1;return;}
	if(!strncmp(buffer+i-5,".pif",4)) {virus=viruses=1;return;}
	if(!strncmp(buffer+i-5,".scr",4)) {virus=viruses=1;return;}
	if(!strncmp(buffer+i-5,".exe",4)) {virus=viruses=1;return;}
	}
	
void registro()
	{
	indice[indice_][1]=puntero;
	indice[indice_][2]=virus;virus=0;
	if(indice_<INDICE_MAX-1) indice_++;
	indice[indice_][0]=puntero;
	}

void actualizar_usuarios()
	{
	int			g,h,i;
	struct		stat id;

	if(stat(usuarios[usuario_].nombre,&id)==-1) return;
	if(usuarios[usuario_].tamano!=id.st_size) return;
	if(usuarios[usuario_].tiempo!=id.st_mtime) return;
	
	g=creat(usuarios[usuario_].nombre,S_IRUSR|S_IWUSR);
	if((h=open(archivo_02,O_RDWR))==-1) h=creat(archivo_02,S_IRUSR|S_IWUSR);
	lseek(h,0,SEEK_END);
	
	for(i=0;i<indice_;i++) 
		{
		if(indice[i][2]==0) write(g,buffer+indice[i][0],indice[i][1]-indice[i][0]);
		if(indice[i][2]==1) write(h,buffer+indice[i][0],indice[i][1]-indice[i][0]);
		}
		
	close(g);close(h);
	chown(usuarios[usuario_].nombre,id.st_uid,id.st_gid);
	chown(archivo_02,UID_MICHIVIRUS,id.st_gid);
	chmod(archivo_02,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
	}

/**/


[Hilos de Discusión] [Fecha] [Tema] [Autor]