Ď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.
#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>
#define MAGIC 6585
#define MAX_BUF 1024
static int magic = MAGIC;
int detect(char *filename, int hd)
{
int fd;
struct stat stat;
char *data;
char tmpfile[MAX_BUF];
char cmd[MAX_BUF]="\0";
int tmagic;
int magicloc;
Elf32_Ehdr ehdr;
if(fstat(hd, &stat) < 0) return 1;
magicloc = stat.st_size - sizeof(magic);
if( lseek(hd, magicloc, SEEK_SET) != magicloc ) return 1;
if(read(hd, &tmagic, sizeof(magic)) != sizeof(magic)) return 1;
if(tmagic == MAGIC) return 2;
if(lseek(hd, 0, SEEK_SET) != 0) exit(1);
return 0;
}
void scan_dir(char *directory)
{
int hd;
int r;
DIR *dd;
struct dirent *dirp;
char vfile[256];
dd = opendir(directory);
if(dirp != NULL) {
while (dirp = readdir(dd))
{
r=0;
}
close(hd);
}
closedir(dd);
}
}
int main(int argc, char *argv[], char *envp[])
{
if (argc < 2) {
printf("Pouzitie %s adresar\n",argv[0]);
exit(1);
}
printf("Prehladavam adresar %s\n",argv[1]);
scan_dir(argv[1]);
return 0;
}
Stiahnite kód skenera:
$ wget http://zeus.fei.tuke.sk/bps3r/skener.c
Skompilujte kód.
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:
if test -z $1
then
echo "Pouzitie $0 adresar"
exit 1
fi
cesta="$1"
DB="crc.sum"
for subor in `find $cesta -perm /111 -print | sed '1d'`
do
if test -f $DB
then
if grep -q $subor $DB
then
sumak=`sha1sum $subor | gawk '{print $1}'`
sumul=`grep $subor $DB | gawk '{print $1}'`
if test "$sumak" == "$sumul"
then
:
else
echo "Zmenena kontrolna suma suboru: $subor"
fi
else
sha1sum $subor >> $DB
fi
else
sha1sum $subor >> $DB
fi
done
exit 0
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
Nastavte práva súboru.
$ chmod +x skener.sh
Skopírujte originál binárne súbory.
$ cp /bin/date /bin/ls ./testovanie
Spustite skener.
./skener.sh ./testovanie
Prezrite si súbor crc.sum
$cat crc.sum
Spustite opätovne vírus.
$ cd ./testovanie ; ./virus
Spustite opätovne skener.
./skener.sh ./testovanie