2008.02_Polowanie na wirusy – GUI dla programu ClamAV_[Programowanie].pdf

(773 KB) Pobierz
439031750 UNPDF
Programowanie
GUI
Polowanie na wirusy
ClamAV
Marek Sawerwain
Od początku swojego istnienia Linux był i jest przykładem system operacyjnego, w którym problem
wirusów jest problemem marginalnym. Należy, naturalnie, odnotować, iż istnieje kilkanaście wirusów,
a niektóre źródła podają, że istnieje nawet sto wirusów. Jednakże w porównaniu do systemu Microsoft
Windows jest to wielkość znikoma. Co więcej, aby w praktyce spotkać program, który jest zainfekowany,
naprawdę trzeba mieć wiele szczęścia albo ogromnego pecha.
programów antywirusowych, których
zadaniem jest wykrywanie wirusów np.
w poczcie albo w plikach systemu Win-
dows, szczególnie jeśli nasz system pełni rolę serwe-
ra plików dla użytkowników systemu Windows. A pro-
blem wirusów w przypadku użytkowników popularnych
„okienek” jest szczególnie istotny.
Jednym z dostępnych programów antywirusowych
jest ClamAV. Jest to aplikacja OpenSource, czyli z peł-
nym kodem źródłowym na licencji GNU GPL. Stoso-
wanie tego programu w praktyce sprowadza się do wy-
woływania poszczególnych komend z linii poleceń.
Za skanowanie katalogu odpowiedzialne jest polece-
nie clamscan . Nie jest to wygodny sposób, szczególnie
dla początkujących użytkowników. Warto byłoby dys-
ponować jakimś programem działającym w środowi-
sku graficznym np.: w GNOME. Istnieją dwa programy
tego typu korzystające z aplikacji ClamAV o nazwach
ClamTK oraz AVScan. Jednak my spróbujemy opraco-
wać własny tego typu program, co – jak się za chwilę
okaże - nie jest zadaniem trudnym.
Schemat blokowy programu
Nasz program nie jest dużym projektem. Mimo to pierw-
szy krok jaki warto wykonać to przygotowanie diagramu
najważniejszych zdarzeń, które pojawiają się w programie.
Wykonanie takiego diagramu albo schematu ułatwi dal-
sze tworzenie programu. Rysunek 1 przedstawia tego typu
schemat. Odzwierciedla on również podstawową własność
naszego programu, czyli rekurencyjne przeszukiwanie kata-
logu w poszukiwaniu wirusów.
Pierwsze czynności są związane z inicjalizacją bi-
bliotek GTK+ oraz ClamAV, co zostało odzwierciedlo-
ne w diagramie. Następnie wchodzimy w główną pę-
tlę zdarzeń GTK+, co powoduje iż nasza aplikacja bę-
dzie reagować, mówiąc bardzo kolokwialnie, na przesu-
wający się kursor myszki i kliknięcia przycisków mysz-
ki. Naturalnie po wybraniu przycisku uruchamiającego
proces skanowania, zgodnie z diagramem, będziemy re-
kurencyjne przeszukiwać katalogi. Podczas tego proce-
su nadal będzie aktywne główna pętla zdarzeń, co ozna-
cza, że będziemy mogli przerwać proces skanowania al-
bo tylko go wstrzymać, aby po chwili ponownie konty-
nuować skanowanie.
64
luty 2008
– GUI dla programu
M imo braku zagrożenia istnieje wiele
439031750.032.png 439031750.033.png 439031750.034.png 439031750.035.png
 
Programowanie
GUI
Podczas skanowania interesować będą nas
przede wszystkim informacje o wykrytych wi-
rusach, stąd też na naszym diagramie pojawiło
się odpowiednie zapytanie. Wyjście z procesu
skanowania może nastąpić w dwóch przypad-
kach. W pierwszym przypadku proces skano-
wania zostanie zakończony, ponieważ wszyst-
kie pliki i katalogi zostaną sprawdzone. Dru-
ga sytuacja to przerwanie procesu skanowania
przez użytkownika.
Schemat może zostać uzupełniony o
dodatkowe zdarzenia, np. czasowe wstrzy-
manie procesu skanowania, jednakże przy
pierwszym tworzeniu schematu warto spró-
bować przedstawić tylko najważniejsze zda-
rzenia.
mieszczać samodzielnie. Zakładając tak-
że, że okno aplikacji nie będzie zmieniać
swojego rozmiaru, to korzystanie z kontrol-
ki GtkFixed jest wygodniejsze. Poszczegól-
ne widgety powinny także posiadać znaczą-
ce nazwy, szczególnie te, które służą bezpo-
średnio do komunikacji z użytkownikiem.
Uzyskamy w ten sposób bardziej czytelny
kod źródłowy.
W podobny sposób uzyskamy odniesienia do
pozostałych widgetów, jakie są nam potrzeb-
ne. Kolejna czynność to wykonanie połączeń
między sygnałami a obsługą tych sygnałów,
generowanych np. w sytuacji, gdy użytkownik
przyciskiem Start rozpocznie skanowanie. Po-
nieważ nasza aplikacja została w dość specjal-
ny sposób skompilowana (więcej informacji w
ramce pt. „Kompilacja projektu”), to nie musi-
my samodzielnie podłączać sygnałów, wystar-
czy skorzystać z funkcji:
Podstawowe
czynności w funkcji main
W dalszych punktach zostaną przedstawio-
ne inne szczegóły naszego programu, jed-
nak mimo wszystko trzeba zacząć od po-
czątku, czyli od zawartości funkcji ma-
in . Pierwsza czynność, jaką należy bez-
warunkowo wykonać, to inicjalizacja bi-
blioteki GTK+ za pomocą funkcji gtk_in-
it . Potem, możemy wczytać plik z opisem
interfejsu:
glade_xml_signal_autoconnect(xml);
Do wykonania zostały jeszcze dwie czynności.
Pierwsza czynność odnosi się do przycisków
Stop oraz Pauza – staną się one nieaktywne, po
wykonaniu dwóch poniższych instrukcji:
Interfejs użytkownika
Rysunek 2. pokazuje proces projektowa-
nia interfejsu naszego programu. Ponieważ
program tworzymy dla środowiska GTK+,
to zastosujemy program GLADE w naj-
nowszej wersji 3.x.x. Jednak nie będziemy
potrzebować żadnych specjalnych widge-
tów, więc i starsza wersja programu GLA-
DE 2.x.x może zostać z powodzeniem uży-
ta. Ma ona jedną przewagę nad nowszą, bo-
wiem można za jej pomocą wygenerować
kod źródłowy programu, który utworzy za-
projektowane okno. Jednakże my nie korzy-
stamy z tej funkcjonalności, gdyż interfejs
będziemy wczytywać dynamicznie za po-
mocą biblioteki libglade .
Sam interfejs, jak potwierdza to Rysu-
nek 2, to typowe okno. Znajdują się na nim
cztery przyciski, za pomocą których użyt-
kownik będzie mógł uruchomić proces ska-
nowania lub wstrzymać ten proces na chwi-
lę, albo go zatrzymać. Mamy także pole
edycyjne, gdzie można wpisać ścieżkę do-
stępu do katalogu, który wraz z podkatalo-
gami zostanie przeskanowany.
Mamy także widget o nazwie GtkNo-
tebook. Ponieważ chcemy, aby informacje
o wirusach były umieszczane w oddziel-
nej kontrolce, to widget GtkNotebook bę-
dzie posiadał dwie zakładki. W pierwszej
umieszczane będą informacje o kolejnych
przeskanowanych plikach, natomiast w dru-
giej zakładce znajdować się będą informa-
cje o plikach, w których wykryto obecność
wirusów.
W oknie znajdują się także etykiety oraz
pewne elementy ozdobne oraz pasek statu-
su. Ważną rolę pełni kontrolka, której nie
widać bezpośrednio – kontrolka GtkFixed .
Jest to tzw. kontrolka rozmieszczenia, po-
nieważ projektujemy okno aplikacji, które-
go poszczególne elementy będziemy roz-
gtk_widget_set_sensitive(PauseSearchB
TN, FALSE);
gtk_widget_set_
sensitive(StopSearchBTN, FALSE);
xml = glade_xml_new( "mainwin.glade",
NULL, NULL );
Działania jakie podejmujemy w dalszej części
programu wymagają uzyskania referencji np.
do kontrolki GtkTextView , w której będziemy
umieszczać komunikaty o wykrytych wiru-
sach. Uzyskanie odniesienia jest bardzo proste
i realizujemy je w następujący sposób:
Druga czynność odnosi się do dwóch kontro-
lek GtkTextView , w których umieszczamy in-
formacje pojawiające się podczas skanowania.
Należy utworzyć bufory, do których będziemy
wprowadzać informacje. Dla kontrolki o na-
zwie LogTextView utworzenie bufora przed-
stawia się następująco:
LogTextViewInfectedFiles = glade_xml_
get_widget ( xml, "LogTextViewInfecte
dFiles" );
buffer = gtk_text_buffer_new( NULL );
gtk_text_view_set_buffer( GTK_TEXT_
VIEW ( LogTextView ), buffer );
Rysunek 1. Diagram podstawowych zdarzeń występujących w aplikacji ClamAV-GUI
www.lpmagazine.org
65
439031750.001.png 439031750.002.png 439031750.003.png 439031750.004.png 439031750.005.png 439031750.006.png 439031750.007.png 439031750.008.png 439031750.009.png 439031750.010.png 439031750.011.png 439031750.012.png
 
Programowanie
GUI
Ostatnim elementem związanym z interfej-
sem jest wyświetlenie wszystkich kontrolek
za pomocą funkcji gtk_widget_show_al-
l(mainwin); . Jednakże, nie są to wszyst-
kie wstępne czynności jakie trzeba wyko-
nać. Należy jeszcze uruchomić system Cla-
mAV, który będzie służył do wykrywania wi-
rusów w plikach.
W pierwszej kolejności deklarujemy trzy
podstawowe zmienne:
struct cl_engine *clav_engine = NULL;
struct cl_limits limits;
unsigned int sigs = 0;
W naszym programie są to zmienne global-
ne, każda funkcja ma do nich bezpośredni do-
stęp. Uruchomienie systemu ClamAV wymaga
w pierwszej kolejności załadowania bazy z sy-
gnaturami wirusów:
Rysunek 2. Projektowanie interfejsu w programie GLADE-3
ret = cl_load(cl_retdbdir(), &clav_
engine, &sigs, CL_DB_STDOPT);
Listing 2. Funkcja testująca, czy plik został zainfekowany wirusem
Funkcja cl_retdbdir wskazuje na domyśl-
ny katalog z bazą wirusów. Ważna jest rów-
nież zmienna clav_engine , bowiem to ona
będzie reprezentować system antywirusowy.
Przydatna, w celach informacyjnych jest tak-
że zmienna sigs , gdyż w niej znajdzie się in-
formacja o tym, ile sygnatur wirusów zawie-
ra załadowana baza.
Poprawne załadowanie bazy oznacza, że
możemy ostatecznie uruchomić system za
pomocą funkcji cl_build: cl_build(c-
lav_engine); .
Przed wejściem do głównej pętli GTK+,
dzięki wywołaniu gtk_main , istotna jest
jeszcze jedna czynność, a mianowicie wy-
pełnienie struktury limits np. w następują-
cy sposób.
void scanile_for_virus ( const char * ile_name , struct cl_engine * engine ) {
char tmp [ 512 ]; const char * virus_name ;
int fd , ret_code ; unsigned long int size = 0 ;
static long lines = 0 ; GtkTextIter start_iter , end_iter ;
if ( engine == NULL ) {
sprintf ( & tmp [ 0 ] , "Błąd wewnętrzny, system ClamAV nie został poprawnie
zainicjalizowany! \n " );
gtk_text_buffer_insert_at_cursor ( buffer , & tmp [ 0 ] , strlen (& tmp [ 0 ]));
return ; }
ret_code = CL_CLEAN ;
ret_code = cl_scanile ( ile_name , & virus_name , & size , engine , & limits ,
CL_SCAN_STDOPT );
if ( ret_code == CL_VIRUS ) {
sprintf ( & tmp [ 0 ] , "plik o nazwie %s jest zainfekowany wirusem %s \n " ,
ile_name , virus_name );
gtk_text_buffer_insert_at_cursor ( buffer_infected_iles , & tmp [ 0 ] ,
strlen (& tmp [ 0 ])); }
if ( ret_code == CL_CLEAN ) {
sprintf ( & tmp [ 0 ] , "plik o nazwie %s wydaje sie bezpieczny \n " , ile_
name );
gtk_text_buffer_insert_at_cursor ( buffer , & tmp [ 0 ] , strlen (& tmp [ 0 ]));
lines ++;
if ( lines > log_size ) {
lines = 0 ;
gtk_text_buffer_get_start_iter ( buffer , & start_iter );
gtk_text_buffer_get_end_iter ( buffer , & end_iter );
gtk_text_buffer_delete ( buffer , & start_iter , & end_iter ); }}
iile ++;
sprintf (& tmp [ 0 ] , "%d / %d (%d KB)" , iile , iles , space );
gtk_label_set_label ( GTK_LABEL ( FilesCountLBL ) , & tmp [ 0 ]);
}
limits.maxiles = 1000;
limits.maxilesize = 10 * 1048576;
limits.maxreclevel = 5;
limits.maxmailrec = 64;
limits.maxratio = 200;
Wartości w tej zmiennej odnoszą się do pli-
ków z archiwami oraz do plików z pocztą.
Określamy, ile plików może maksymalnie
zawierać archiwum, wielkość skanowanych
plików, oraz co ważne określamy maksymal-
ny poziom rekursji dla archiwów oraz plików
z pocztą. Oznacza to, że przypadku występo-
wania wielu podkatalogów, niestety system
ClamAV nie przeskanuje pewnych elemen-
tów, ale z drugiej strony zyskamy na czasie.
Strukturę limits będziemy wykorzystywać
66
luty 2008
439031750.013.png 439031750.014.png 439031750.015.png
 
Programowanie
GUI
podczas skanowania, więc można ją tworzyć
również w innym miejscu programu albo po-
traktować jej elementy jako pola do konigu-
racji z poziomu interfejsu użytkownika, co
byłoby bardzo dobrym rozwiązaniem.
Proces skanowania katalogów
Skanowaniem zajmuje się funkcja o nazwie
virus_dir_search . Jej zadanie to rekuren-
cyjne przeszukiwanie katalogów w poszuki-
waniu wirusów. Przy czym za wykrycie wi-
rusa odpowiedzialna jest inna funkcja o na-
zwie scanile_for_virus , ale o tej funkcji
więcej szczegółów zostało podanych w dal-
szej części artykułu.
Funkcja virus_dir_search posiada
trzy parametry, pierwszy o nazwie dir_na-
me – to nazwa katalogu do sprawdzenia czy
zawiera pliki z wirusami. Drugi argument,
engine , reprezentuje bibliotekę ClamAV,
która odpowiada za wykrycie, czy podany
plik zawiera wirusa. Ostatni, trzeci argu-
ment depth , jest potrzebny, aby śledzić po-
ziom rekurencji.
Po deklaracji potrzebnych zmiennych
dotyczących struktury katalogowej spraw-
dzamy wartość parametru depth. Parametr
ten, jak powiedziano przed chwilą, oznacza
głębokość rekurencji, jeśli jego wartość jest
większa niż wartość zmiennej max_depth ,
to nastąpi powrót z funkcji. Oznacza to, iż
nasza funkcja nie będzie skanować plików
leżących poniżej pewnej głębokości. Spraw-
dzenie drugiej zmiennej, tym razem global-
nej is_stop , jest potrzebne aby sprawdzić,
czy użytkownik klawiszem Stop nie prze-
rwał procesu skanowania. Jeśli tak się stało,
to ponownie opuszczamy funkcję.
Zanim zaczniemy skanować
Choć program jaki piszemy jest raczej nie-
wielki (około 12kb kodu źródłowego), to
niestety nie możemy opisać wszystkich
szczegółów, dlatego pokrótce przedstawimy
czynności jakie są wykonywane przed roz-
poczęciem procesu skanowania.
Jeśli użytkownik za pomocą klawisza Start
rozpocznie proces skanowania, to uruchamia
funkcję on_StartSearchBTN_clicked . Funk-
cja ta inicjuje proces skanowania, jednakże nim
zostanie przeprowadzone skanowanie, pierwszą
czynnością jest uzyskanie nazwy katalogu, któ-
ry będzie skanowany:
Listing 1. Funkcja przeszukująca rekurencyjnie wskazany katalog
void virus_dir_search ( const char * dir_name , struct cl_engine * engine ,
unsigned int depth ) {
DIR * dd ;
struct dirent * dent ;
struct stat statbuf ;
char * fname ;
if ( depth > max_depth ) return ;
if ( is_stop == _YES_ ) return ;
depth ++;
if (( dd = opendir ( dir_name )) != NULL ) {
while (( dent = readdir ( dd ))) {
if ( dent -> d_ino ) {
if ( strcmp ( dent -> d_name , "." ) && strcmp ( dent -> d_name , ".." ) )
{
fname = malloc ( strlen ( dir_name ) + strlen ( dent -> d_name ) +
2 );
sprintf ( fname , "%s/%s" , dir_name , dent -> d_name );
if ( lstat ( fname , & statbuf ) != - 1 ) {
if ( S_ISDIR ( statbuf . st_mode ) && ! S_ISLNK ( statbuf . st_
mode )) {
virus_dir_search ( fname , engine , depth );
}
else {
if ( S_ISREG ( statbuf . st_mode ))
scanile_for_virus ( fname , engine );
}
}
free ( fname );
}
}
while ( gtk_events_pending ())
gtk_main_iteration ();
while ( gtk_events_pending () || is_pause == _YES_ )
gtk_main_iteration ();
if ( is_stop == _YES_ ) break ;
}
}
closedir ( dd );
}
strcpy( &beg_dirname[0], gtk_entry_
get_text(GTK_ENTRY(StartDirectoryEDT
)));
Przed właściwym skanowaniem uruchamia-
na jest funkcja o nazwie disk_usage . Zada-
niem tej funkcji jest wyznaczenie liczby pli-
ków, jakie zostaną przeskanowane. Umożli-
wi to użytkownikowi śledzenie postępów w
skanowaniu.
Do innych zadań funkcji on_StartSe-
archBTN_clicked należy zablokowanie dzia-
łania pewnych klawiszy. Po uruchomieniu
skanowania przyciskiem Start wszystkie sta-
ją nieaktywne, a wykonujemy to np. dla przy-
cisku Start w następujący sposób:
gtk_widget_set_sensitive(StartSearchB
TN, FALSE);
Po zebraniu potrzebnych informacji za po-
mocą wywołania disk_usage , aktywne bę-
dą przyciski Pauzy oraz Stop. Informację o
tym, iż rozpoczęto skanowanie umieszczamy
w dwóch miejscach, w kontrolce GtkViewText
o nazwie LogTextViewInfectedFiles :
sprintf( &tmp[0], ".: Skanowanie
rozpoczęte :.\n");
gtk_text_buffer_insert_at_
cursor(buffer_infected_iles, &tmp[0],
strlen(&tmp[0]));
oraz na pasku statusu:
gtk_statusbar_push(GTK_
STATUSBAR(StatusBar), 0, "szukanie
wirusów ...");
www.lpmagazine.org
67
439031750.016.png 439031750.017.png 439031750.018.png 439031750.019.png 439031750.020.png 439031750.021.png 439031750.022.png 439031750.023.png 439031750.024.png 439031750.025.png 439031750.026.png 439031750.027.png 439031750.028.png
 
Programowanie
GUI
Jeśli obydwa warunki nie były prawdzi-
we, to następuje zwiększenie wartości para-
metru depth. Następnie za pomocą opendir
próbujemy uzyskać dostęp do wskazanego
katalogu – jeśli to się nie uda, to opuszcza-
my spory fragment kodu i w rzeczywistości
nie wykonamy żadnych istotnych czynno-
ści. W przeciwnym przypadku przy pomo-
cy pętli while i funkcji readdir odczytuje-
my poszczególne wpisy z katalogu, o na-
zwie zapisanej w zmiennej dir_name. Na-
leży jednak zwrócić baczną uwagę na to,
czy badana nazwa nie jest przypadkiem po-
jedynczą kropką oznaczającą katalog aktu-
alny, bądź czy nie są to dwie kropki, ozna-
czające katalog nadrzędny. Te dwa przypad-
ki trzeba pominąć.
Jeśli nazwa jest właściwa, to nale-
ży sprawdzić dwie kolejne możliwości. Po
pierwsze, nazwa może reprezentować plik.
Jeśli tak jest, to plik ten zostanie przeska-
nowany. Nazwa może być również katalo-
giem, w tym przypadku następuje ponow-
ne wywołanie funkcji virus_dir_search ,
co należy rozumieć jako rekurencyjne wy-
wołanie. W omawianej funkcji mamy jesz-
cze taką oto pętlę:
przerwać skanowanie. Jest to spowodowane
faktem, iż w katalogu może znajdować się
wiele plików, i w takim przypadku może mi-
nąć wiele czasu, aż nastąpi kolejne wywoła-
nie rekurencyjne, czyli sprawdzenie warto-
ści zmiennej is_stop :
Natomiast argument trzeci jest wyko-
rzystywany do wpisania wielkości przeska-
nowanego pliku. Argument czwarty to kilka
razy już wspominany wskaźnik na struktu-
rę systemu ClamAV. W kolejnym argumen-
cie podajemy ograniczenia zawiązane z ar-
chiwami. W ostatnim argumencie możemy
określić jakie typy plików możemy skano-
wać. Podanie wartości CL_SCAN_STDOPT
określa typowy zestaw plików.
Wynik działania tej funkcji zostanie za-
pisany do zmiennej ret_code . Jeśli wartość
tej zmiennej będzie równa CL_CLEAN , to sys-
tem ClamAV nie wykrył wirusa. Jednak w
przypadku otrzymania wartości CL_VIRUS
mamy pewność, iż wskazany plik zawiera
wirusa, a jego nazwa zostanie umieszczona
w zmiennej virus_name .
W tym przypadku do jednej z kontrolek
GtkTextView , poprzez bufor buffer_infec-
ted_iles , wpisujemy odpowiedni komuni-
kat. Zwróćmy też uwagę, że w przypadku
plików niezainfekowanych co pewien czas
kasujemy zawartość okna z komunikata-
mi, aby nie obciążać nadto kontrolki Gtk-
TextView .
Wielkość ta, a dokładniej ilość linii jest
zapisana w zmiennej log_size. Ostatnim
elementem jest uaktualnienie etykiety o na-
zwie FilesCountLBL . W niej wyświetlamy,
ile plików zostało już przeskanowanych jak
również całkowitą ilość plików.
if (is_stop == _YES_) break;
Test na obecność wirusa
Poprzednia omawiana funkcja przeglądając
strukturę katalogową znajduje pliki, które
należy sprawdzić, czy zostały zainfekowa-
ne przez wirusa. Tym zadaniem zajmuje się
funkcja scanile_for_virus . Listing 2 za-
wiera pełny kod źródłowy tej funkcji. Przyj-
muje ona dwa argumenty. W pierwszym
zgodnie z nazwą podajemy nazwę pliku,
a w drugim wskaźnik reprezentujący sys-
tem ClamAV.
Pierwsza czynność jest bardzo istot-
na, należy sprawdzić czy argument engine
jest równy NULL . Jeśli tak jest, to niestety
system ClamAV, nie może zostać zastoso-
wany do sprawdzenia, czy w pliku znajdu-
je się wirus. Dlatego za pomocą słowa klu-
czowego return opuszczamy funkcję scan-
ile_for_virus . Gdy opisana sytuacja nie
występuje, możemy sprawdzić czy plik jest
bezpieczny. Do zmiennej ret_code wpi-
sujemy wartość CL_CLEAN . Potem jeste-
śmy gotowi to wywołania funkcji o nazwie
cl_scanile , która sprawdzi, czy plik jest
bezpieczny:
while(gtk_events_pending() || is_pause
== _YES_)
gtk_main_iteration();
Oznacza ona, iż jeśli pojawiły się jakieś
zdarzenia GTK+, to zostaną one obsłużo-
ne. Jest to potrzebne, aby nasza aplikacja re-
agowała na uaktualnienia etykiet, np. licz-
bę przeskanowanych plików. Powyższa pę-
tla while będzie też czekać, jeśli użytkow-
nik wybrał przycisk Pauzy – skanowanie
w tym przypadku zostanie wstrzymane do
czasu, aż zmienna is_pause zmieni swo-
ją wartość.A Należy także ponownie spraw-
dzić, czy użytkownik przyciskiem Stop chce
Podsumowanie
Wiele istotnych elementów można dodać do
naszego programu. Przede wszystkim wię-
cej opcji związanych z koniguracją. np.
maksymalna głębokość rekursji podczas
skanowania.
Warto także dodać możliwość śledze-
nia tego parametru, np. w sposób jak śledzi-
my liczbę przeskanowanych plików, czyli za
pomocą prostej etykiety. Jak już wspomnia-
no w artykule, struktura limits również jest
świetnym kandydatem do koniguracji przez
użytkownika.
Możemy również tworzyć log, czyli za-
pisywać wszystkie informacje o przeskano-
wanych plikach do pliku tekstowego.
Możliwości dodatkowych unowocze-
śnień jest wiele, możemy zaimplemento-
wać możliwość kasowania plików zarażo-
nych przez wirusy, lub wprowadzić opcję
przenoszenia ich do specjalnego archi-
wum.
Dlatego, jak zawsze na koniec, zachę-
cam do wprowadzania własnych, nawet naj-
mniejszych innowacji do przedstawionego
programu.
ret_code = cl_scanile( ile_name,
&virus_name, &size, engine, &limits,
CL_SCAN_STDOPT);
Jej poszczególne argumenty są następujące:
pierwszy to nazwa pliku do sprawdzenia, dru-
gi argument będzie zawierał nazwę wirusa, je-
śli jakiś zostanie wykryty.
W Sieci
• Program antywirusowy ClamAV – http://www.clamav.org
• Strona domowa projektu GTK+ – http://www.gtk.org
• Strona programu GLADE-3 – http://www.glade.gnome.org
O autorze
Autor zajmuje się tworzeniem oprogramowania dla WIN32 i Linuksa. Zainteresowania: teo-
ria języków programowania oraz dobra literatura.
Kontakt z autorem: autorzy@linux.com.pl .
68
luty 2008
439031750.029.png 439031750.030.png 439031750.031.png
Zgłoś jeśli naruszono regulamin