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
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
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
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
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
Plik z chomika:
SOLARIX33
Inne pliki z tego folderu:
2006.01_Koder plików w formacie OGG_[Programowanie].pdf
(722 KB)
2007.06_Piękno fraktali_[Programowanie].pdf
(1778 KB)
2008.11_GanttProject_[Programowanie].pdf
(1014 KB)
2007.04_USB Device Explorer_[Programowanie].pdf
(1134 KB)
2006.09_QT, PyQT – szybkie tworzenie baz danych_[Programowanie].pdf
(1319 KB)
Inne foldery tego chomika:
Administracja
Aktualnosci
Audio
Bazy Danych
Bezpieczenstwo
Zgłoś jeśli
naruszono regulamin