\SymantecScanEngine_5.2.4_Win32_IN\Tools\Java\Win32\jre-1_5_0_15-windows-i586-p.exe
SymantecScanEngine_5.2.4_Win32_IN\Scan_Engine\Win32\ScanEngine.exe
あんまり参考にならない「Symantec Scan Engine ソフトウェア開発者ガイド」といい加減な Javadoc ( SymantecScanEngine_5.2.4_Win32_IN\Scan_Engine_SDK\Java\Docs\SymJavaAPIDocs ) を参考にざざっとプログラムを書くと以下のようになる
package com.snail.example; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Vector; import org.apache.commons.beanutils.BeanUtils; import com.symantec.scanengine.api.Policy; import com.symantec.scanengine.api.Result; import com.symantec.scanengine.api.ScanEngine; import com.symantec.scanengine.api.ScanException; import com.symantec.scanengine.api.StreamScanRequest; public class AVExam { private static final String SCAN_SERVER = "172.16.121.64"; // Win2003 Server on VMWare Fusion private static final int SCAN_PORT = 1344; private static final String SCAN_FILE = "/Users/atsushi/Downloads/eicar.com"; public static void main(String[] args) { // 1) Scan Engine Server の IP アドレスと Port 番号を定義 // 複数台の Scan Engine Server で負荷分散をすることが可能 Vector<ScanEngine.ScanEngineInfo> scEngInfo = new Vector<ScanEngine.ScanEngineInfo>(); ScanEngine.ScanEngineInfo scInfo = new ScanEngine.ScanEngineInfo(SCAN_SERVER,SCAN_PORT); scEngInfo.add(scInfo); try{ // 2) Scan Engine Client を作成する // 接続待ち 1000ms でエラー / 応答待ち 3000ms でエラー ScanEngine scEngine = ScanEngine.createScanEngine(scEngInfo); // 3) Scan Engine に、ウイルス検査を要求する // // 検査後のファイルの扱いを設定する必要がある // Policy.DEFAULT : Scan Engine サーバの設定を利用する // Policy.SCAN : Scan のみをする // Policy.SCANDELETE : ウイルスが検出されたらファイルを削除する // Policy.SCANREPAIR : ウイルスが検出されたらウイルスを除去する // Policy.SCANREPAIRDELETE : ウイルス除去を試み、できなかったらファイルを削除する // // ※ scEngine.createFileScanRequest() は、Scan Engine サーバと // ※ クライアントが同じマシンの場合のみ使える・・・・何日無駄にしたことか・・・orz OutputStream out = new FileOutputStream("/tmp/output"); StreamScanRequest req = scEngine.createStreamScanRequest(SCAN_FILE, SCAN_FILE, out, Policy.SCAN); Result res = req.scanFile(); out.close(); // 4) 結果を標準出力に出力 Map resMap = BeanUtils.describe(res); List keys = new ArrayList(resMap.keySet()); for(Object key : keys){ System.out.println(key + "=" + resMap.get(key)); } } catch( ScanException ex ) { ex.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
とりあえず動く物を作るだけなら簡単にできる
threatInfo=com.symantec.scanengine.api.ThreatInfo@13e4a47e definitionDate=Sun Jun 14 00:00:00 JST 2009 status=INFECTED_REPLACED fileStatus=null definitionRevNumber=004 IPTries=com.symantec.scanengine.api.ConnectionAttempt@3fe2670b class=class com.symantec.scanengine.api.Result totalInfection=0
サンプルウイルスを Scan Engine に検査させると、無事に INFECTED_REPLACED(感染している) というステータスが帰ってきた
CLEAN | |
FILE_ACCESS_FAILED | |
INFECTED_REPLACED | 感染している_除去に成功 |
INFECTED_UNREPLACED | 感染している_除去に失敗 |
INTERNAL_SERVER_ERROR | |
NO_AV_LICENSE | Scan Engine のライセンス切れ |
StreamScanRequest req = scEngine.createStreamScanRequest(SCAN_FILE, SCAN_FILE, out, Policy.SCAN); Result res = req.scanFile();
の代わりに、
byte[] byteArray = readFile(); StreamScanRequest req = scEngine.createStreamScanRequest(SCAN_FILE, SCAN_FILE, out, Policy.SCAN); req.send(byteArray); Result res = req.finish();
を使う。
なんか、キモい API だなぁ・・・
scEngine.createStreamScanRequest(actualFileName, originalFileName, out, policy);
scEngine.createFileScanRequest()
は、クライアントとサーバが同一筐体な時しか使えない(Javadoc にも明記されている)。
普通の開発者は、scEngine を作るときに、サーバーの IP アドレスとポート番号を渡しているんだから、そうは思わないだろう・・・ちゃんとドキュメントを読まない私が悪いんですが・・・