Product SiteDocumentation Site

7.3.3. Skener

Ďalšou úlohou je vytvorenie antivírusového skenera, ktorý by dokázal nájsť nami vytvorený vírus. Preštudujte si nasledujúci kód a doplnite chýbajúce riadky kódu podľa popisu. Myšlienka skenera vychádza z princípu prehľadania adresára, test na binárny súbor, najdenie špecifickej značky vírusu, vypis o infikovanosti.
/* 
  Jednoduchy antivirusovy skener
 */

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

//identifikator infikovanosti
#define MAGIC 6585
#define MAX_BUF 1024

static int magic = MAGIC;

//infikovanie suboru virusu
int detect(char *filename, int hd)
{
    //handle pre docasny subor
   int fd;
   //info subore
   struct stat stat;
   char *data;
   char tmpfile[MAX_BUF];
   char cmd[MAX_BUF]="\0";
   int tmagic;	  // Store files magic number
   int magicloc;  // Location of magic number
   Elf32_Ehdr ehdr;


/* kontrola magic(identifikator virusu) na konci suboru */
   if(fstat(hd, &amp;stat) &lt; 0) return 1;
   magicloc = stat.st_size - sizeof(magic);
   if( lseek(hd, magicloc, SEEK_SET) != magicloc ) return 1;

   //nacitanie magic znaku, infikovanosti
   if(read(hd, &amp;tmagic, sizeof(magic)) != sizeof(magic)) return 1;
   //ak je subor infikovany, znova neinfikuje
   if(tmagic == MAGIC) return 2;
   if(lseek(hd, 0, SEEK_SET) != 0) exit(1);


   return 0;
}

//prehladanie aktualneho suboru na spustitelne subory typu ELF
void scan_dir(char *directory)
{
   int hd;
   int r;
   DIR *dd;
   struct dirent *dirp;
   char vfile[256];
 
   /* otvorenie adresara */
   dd = opendir(directory);
   
   // prehladanie celeho adresara 
   if(dirp != NULL) {
	while (dirp = readdir(dd)) 
	{
	r=0;
 //DOPLNITE //postupne spracujte vsetky subory v adresari //dirp->d_name obsahuje nazov suboru //otvorte subor pomocou funkcie open viac info man open //po uspesnom otvoreni zavolajte funkciu detect //podla navratovej hodnoty vyhodnotite vysledok, infikovany/neinfikovany, zobrazte informaciu o infikovanosti na terminal 
		}
	    close(hd);
	}
	closedir(dd);
   }
   
}


int main(int argc, char *argv[], char *envp[])
{
  
   if (argc &lt; 2) {
   	printf("Pouzitie %s adresar\n",argv[0]);
	exit(1);
   }
   printf("Prehladavam adresar %s\n",argv[1]); 
   //prehladanie adresara
   scan_dir(argv[1]);
   return 0;
}


  1. Stiahnite kód skenera:
    $ wget http://zeus.fei.tuke.sk/bps3r/skener.c
  2. Doplnite chýbajúci kód podľa popisu. Viď kód Section A.1, “Antivírusový skener / Antivirus scanner”
  3. Skompilujte kód.
  4. Spustite, otestujte skener.
    $ ./skener ./testovanie
Výsledkom je skener pracujúci na princípe signatúr, kedy na základe špecifickej značky vírusu je táto postupnosť znakov vyhľadávaná v binárnych súboroch.
Ďalším typom skenera je systém sledujúci zmeny, zmeny ktoré sa vykonali z pohľadu obsahu jednotlivých sledovaných systémových objektov. Príkladom sú kontrolné sumy, ktoré využívajú kryptografické nástoje na získanie počiatočných hodnôt - odtlačkov súborov a tieto neskôr porovnávajú z aktuálnymi hodnotami. Typ skenera využívajúci hash funkcie v jazyku bash:
#!/bin/bash


#test zadania parametra z prikazoveho riadku
if test -z $1 
then
	echo "Pouzitie $0 adresar"
	exit 1
fi

cesta="$1"
DB="crc.sum"

#listovanie adresar hladanie spustitelnych suborov
for subor in `find $cesta -perm /111 -print | sed '1d'`
do
	#test existencie databazy kontrolnych sum
	if test -f $DB
	then
		if grep -q $subor $DB 
		then
			#kontrolna suma existuje, porovna sa
			#suma aktualna
			sumak=`sha1sum $subor | gawk '{print $1}'`
			#suma ulozena
			sumul=`grep $subor $DB | gawk '{print $1}'`
			
			#porovnanie hodnot
			if test "$sumak" == "$sumul"
			then
				:
			else
				echo "Zmenena kontrolna suma suboru: $subor"
			fi
		
		else
			#kontrolna suma neexistuje, ulozi sa
			sha1sum $subor >> $DB
		fi
	else		
	      #kontrolna suma neexistuje, ulozi sa
	      sha1sum $subor >> $DB
	fi	
done
exit 0
  1. Vytvorte súbor v adresári skener.sh a vložte predchádzajúci kód.
    $ wget http://zeus.fei.tuke.sk/bps3r/skener.sh
  2. Nastavte práva súboru.
    $ chmod +x skener.sh
  3. Skopírujte originál binárne súbory.
    $ cp /bin/date /bin/ls ./testovanie
  4. Spustite skener.
    ./skener.sh ./testovanie
  5. Prezrite si súbor crc.sum
    $cat crc.sum
  6. Spustite opätovne vírus.
    $ cd ./testovanie ; ./virus
  7. Spustite opätovne skener.
    ./skener.sh ./testovanie