ClamAV是一款由Sourcefire組織開發的開源殺毒引擎,Sourcefire同時也是Snort入侵檢測引擎的全部者。ClamAV提供了一種更爲快速靈活的框架用以檢測惡意代碼和軟件產品。能夠做爲現有的臺式機、文件服務器、郵件服務器以及其餘須要殺毒掃描軟件場景中殺毒掃描軟件的補充工具或者替代產品。另外ClamAV程序包中還包含了libclamav庫以及命令行可執行文件接口。同時也提供了freshclam命令行工具用以保證特徵庫的更新。服務器
ClamAV的最新版本能夠在http://www.clamav.net/download/sources/得到。也能夠經過程序管理器自動安裝。在Ubuntu系統中,輸入一下命令便可自動安裝:框架
$ apt-get install clamav clamav-freshclam函數
下面說一說ClamAV的安裝過程(使用clamav-0.98.6版本):工具
(1) 下載並解壓clamav-0.98.6.tar.gz:編碼
# tar vxf clamav-0.98.6.tar.gz.net
(2) 添加用戶組clamav和組成員clamav:命令行
# groupadd clamav指針
# useradd –g clamav clamavcode
(3) 進入解壓後的目錄(源文件放在/usr/local/src中),並以下配置軟件:接口
# ./configure --prefix=/usr/local/clamav
出現一個錯誤:OpenSSL not found
openssl的開發包沒有安裝,安裝便可:
apt-get install libssl-dev
(4) 編譯,安裝:
make
make install
此時,還不能使用./clamscan去掃描能夠文件,由於尚未特徵庫可加載到系統中,程序默認在share目錄下的clamav文件夾中加載特徵庫,須要手動在上述路徑下添加一個clamav文件夾,而且保證clamav用戶可以對文件夾進行讀寫。
(5) 在/var/log/目錄下添加兩個log文件:clam.log和clam-update.log,全部者爲clamav用戶,並保證可讀寫權限。
(6) 修改/usr/local/clamav /etc/clam.conf將開始的有"Example"的那行用#註釋掉。
(7) 修改/usr/local/clamav /etc/freshclam.conf將開始的有"Example"的那行用#註釋掉。修改UpdateLogFile /var/log/freshclam.log 爲UpdateLogFile /var/log/clam-update.log
(8) 用freshclam升級病毒庫:
$ freshclam
freshclam運行之後,share目錄下的clamav文件夾中已經存在了最新的特徵庫文件,下面就能夠用clamscan命令進行文件的掃描了
Libclamav庫API
libclamav庫API提供了病毒掃描的各類函數接口。libclamav庫使用的是病毒掃描法(Virus Scanner)。從病毒中提取的特徵字符串被用必定的格式組織在一塊兒並加上簽名保護就造成了病毒庫,clamav使用的病毒庫通常後綴爲.cvd文件。
在使用libclamav以前,必須調用cl_init()函數來初始化,初始化成功之後,能夠調用cl_engine_new()函數來建立一個新的掃描引擎。掃描結束之後,須要調用cl_engine_free()這個函數來釋放這個引擎結構。這三個函數的原型以下:
int cl_init(unsigned int options);
struct cl_engine *cl_engine_new(void);
int cl_engine_free(struct cl_engine *engine);
cl_init()和cl_engine_free()兩個函數若是調用成功,將返回CL_SUCCESS,若是返回其餘code,說明函數調用失敗。
cl_init函數的實參傳入CL_INIT_DEFAULT便可。
Cl_engine_new()若是調用成功將返回一個指向struct cl_engine結構體的指針,若是失敗將返回NULL。
獲得新的掃描引擎之後,須要進行特徵庫的加載,clamav提供了兩個函數:
const char *cl_retdbdir(void);
int cl_load(const char *path, struct cl_engine *engine,
unsigned int *signo, unsigned int options);
cl_retdbdir返回ClamAV特徵庫的默認路徑。
cl_load函數根據給出的具體特徵庫路徑,加載單個特徵文件,或者幾個特徵文件(給出的實參是文件夾)。第二個參數傳入cl_engine_new獲得的engine,第三個參數傳出加載的特徵碼的條數,最後一個參數爲加載的選項,通常傳入CL_DB_STDOPT便可。
以上的步驟完成之後,須要調用cl_engine_compile()函數作最後的文件掃描前的準備,給函數原型爲:
int cl_engine_compile(struct cl_engine *engine);
如今,能夠進行文件的掃描了,文件掃描的函數爲cl_scanfile,函數原型爲:
int cl_scanfile(const char *filename, const char **virname,
unsigned long int *scanned, const struct cl_engine *engine,
unsigned int options);
該函數須要注意的一點是,virname在函數中指向了engine結構的表示目標掃描文件名稱的內存,不能被直接釋放。最後一個參數傳入CL_SCAN_STDOPT,默認配置便可。
還有一個函數沒有介紹:
cl_strerror(),能夠將相關函數返回的不爲CL_SUCCESS值的錯誤代碼轉換爲說明錯誤相關的字符串。
如下是利用libclamav的API函數掃描文件的一個示例程序,只是展現瞭如何利用API進行文件掃描的最簡單的流程,路徑之類的採用的都是硬編碼,實際使用時能夠進行相應的修改。
利用一個樣本文件進行試驗,編譯時加上參數-lclamav,並保證能夠找到須要的.so文件和clamav.h文件,獲得結果以下:
更多詳情後續更新