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
(2) 添加用戶組clamav和組成員clamav:
# groupadd clamav
# useradd –g clamav clamav
(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文件,得到結果如下:
更多詳情后續更新