Asp Forum
Home
|
Login
|
Register
|
Search
Forums
>
pl.comp.programming
cl_buf
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...
Servizio di avviso nuovi messaggi
Ricevi direttamente nella tua mail i nuovi messaggi per
cl_buf
Inserendo la tua e-mail nella casella sotto, riceverai un avviso tramite posta elettronica ogni volta che il motore di ricerca troverà un nuovo messaggio per te
Il servizio è completamente GRATUITO!
x
Login to ForumsZone
Login with Google
Login with E-Mail & Password