[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Marcin W

5/4/2007 12:35:00 PM

W nawi?zaniu do mojego postu dotycz?cego skanowania bufora z wykorzystaniem
funkcji bibliotecznych clamav'a, napisa3em swoj? funkcje cl_buf, której
listing jak i przyk3adowe u?ycie poni?ej. jako argument przyjmuje bufor z
danymi, a zwraca 0 w przypadku braku wirusa i 1 je?eli znaleziono wirusa. W
przyk3adowym programie powinno zwrócia 1, a zwraca 0. Licze, ?e sie znajdzie
choa jedna osoba, która bedzie wiedzia3a jak zrobia taki myk, ?eby mi nie
wycina3o znaków "/" z definicji wirusa, który tam jest zapisany. Kompilacja:
gcc zrodlo.c -o output -lclamav

listing:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <clamav.h>

int cl_buf(char *buffer)
{
int fd, old, msg, status;
old = dup(1); // deskryptor stdout
FILE *tmp = tmpfile();
int err; // kod bledu odczytu bazy
struct cl_engine *engine; // struktura, do ktorej bedzie ladowana baza
struct cl_limits limits; // limity zwiazane ze skanowaniem
const char *virname; // nazwa znalezionego wirusa
char *filename; // nazwa pliku do skanowania
unsigned int sigs; // poczatkowa wartosc licznika bazy sygnatur
engine = NULL; // zerowanie struktury
sigs = 0; // poczatkowo 0

memset(&limits, 0, sizeof(struct cl_limits));
limits.maxfiles = 1000; // maksymalna ilosc plikow do skanowania
limits.maxfilesize = 10 * 1048576; // Maksymalna wielkosc pliku w bajtach
limits.maxreclevel = 5; // jak gleboko ma skanowac, dotyczy plikow archiwum
limits.maxratio = 200; // maksymalny stopien kompresji

printf ("Sciezka do bazy programu Clamav: %s\n", cl_retdbdir());
printf ("Proba zaladowania bazy z powyzszej sciezki...\n");
err = cl_load(cl_retdbdir(), &engine, &sigs, CL_DB_STDOPT);

// obsluga bledu odczytu bazy
if (err != 0)
{
printf ("Blad odczytu bazy w podanej lokalizacji: %s\n", cl_strerror
(err));
exit(1);
}
else
{
printf ("Poprawnie zaladowano baze, przygotowanie systemu
detekcji...\n");
err = cl_build(engine);
if (err != 0)
{
printf ("Nie udalo sie uruchomic systemu detekcji: %s\n",
cl_strerror(err));
cl_free(engine);
}
else printf ("Udalo sie uruchomic system detekcji\n");
}

fd = fileno(tmp); // deskryptor pliku tmp
dup2 (fd, 1); // zmieniamy stdout -> deskryptor pliku tmp
puts (buffer); // zapisujemy bufor do tmp
fflush (stdout);
dup2 (old, 1); // zmieniamy output na ekran

// reszta zwiazane z dzialaniem na buforze/pliku: skanowanie antywirusem itd.
status = cl_scandesc(fd, &virname, NULL, engine, &limits, CL_SCAN_STDOPT);

if (status == CL_VIRUS)
{
msg = 1;
}
else msg = 0;

fclose (tmp); // kasujemy plik tmp
return (msg);
}

int main()
{
char *bufor="X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!
$H+H*";
int out;

out = cl_buf(bufor);

printf ("Status: %d\n", out);
return (0);
}


--
Wys3ano z serwisu OnetNiusy: http://niu...
3 Answers

Marcin 'Qrczak' Kowalczyk

5/4/2007 1:02:00 PM

0

Dnia 04-05-2007, pia o godzinie 14:34 +0200,
marcinWYTNIJTO@marcin-wroblewski.com napisal(a):

> zeby mi nie
> wycinalo znaków "/" z definicji wirusa,

Nie / tylko \. Znak \ w stringu w C ma specjalne znaczenie (np. \n to
koniec linii). Zeby uzyskac \ w wyniku, napisz \
> fd = fileno(tmp); // deskryptor pliku tmp
> dup2 (fd, 1); // zmieniamy stdout -> deskryptor pliku tmp
> puts (buffer); // zapisujemy bufor do tmp
> fflush (stdout);
> dup2 (old, 1); // zmieniamy output na ekran

Zamiast tak rzezbic, uzyj fputs zamiast puts.

--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.p...

marcin

5/4/2007 1:11:00 PM

0

> fputs zamiast puts.
Ale fputs cokolwiek zmieni? Bawi3em sie z fputs wcze?niej wi te? mi wycina
wszystkie znaki formatowania, rece opadaj?.

Czy ten problem jest nierozwi?zywalny?

Chyba odszukam ?ród3a oryginalnej funkcji T. Kojma...

:-/

--
Wys3ano z serwisu OnetNiusy: http://niu...

Marcin 'Qrczak' Kowalczyk

5/4/2007 1:27:00 PM

0

Dnia 04-05-2007, pia o godzinie 15:10 +0200,
marcin@marcin-wroblewski.com napisal(a):
> > fputs zamiast puts.
> Ale fputs cokolwiek zmieni?

Nie trzeba bedzie rzezbic z dup.

> Bawilem sie z fputs wczesniej wi tez mi wycina
> wszystkie znaki formatowania, rece opadaja.

Litosci, przeciez o tym napisalem. Przeczytaj jeszcze raz mojego posta.
To ma sie nijak do wypisywania na ekran, to jest kwestia skladni stalych
stringowych w "" w C/C++.

--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.p...