第十一章 OAV代码分析与使用配置上海交通大学信息安全工程学院本章学习目标
了解杀毒引擎的框架
掌握 OAV使用方法
OAV简介
OAV( OpenAntiVirus)项目
( http://www.openantivirus.org)是在 2000
年 8月 30日由德国开源爱好者发起,旨在为开源社区的反病毒开发者提供一个交流和项目管理的资源平台。
该项目具有明确的路线图:
– 为网络 (邮件服务器,internet网关、文件服务器等 )终端用户和企业客户提供病毒防护的开源解决方案。
– 为网络终端用户和企业客户提供计算机和网络安全的开源解决方案。
– 研发开源的扫描引擎,从而使未来的安全需求不再依赖于商业提供商。
– 通过开源系统和软件产品,为系统管理员提供系统恢复能力。
– 建立网站,提供最新的病毒和安全信息。
– 建立 How-To项目提供相关信息和白皮书,用户和系统管理员可以通过该项目提供的信息,利用开源安全解决方案,从而确定反病毒策略。
项目组成:
– ScannerDaemon,VirusHammer和 PatternFinder是符合 GPL规范的病毒扫描器的一个简单而基础的实现,
用 Java语言写成。
– squid-vscan可以利用 Squid Http-Proxy扫描网络流量,
从而侦测病毒。
– samba-vsan利用 samba服务器提供 on-access病毒扫描。最新的 SUSE Linux已经包含了该工具。
– 此外,很多开源爱好者还开发了很多小工具,详细情况参见 http://www.openantivirus.org/projects.php
ScannerDaemon架构
ScannerDaemon基本上可以分为如下几个模块:
– 扫描引擎模块
– 扫描配置模块
– 病毒签名文件解析模块
– 文件系统支持模块(扫描目标文件 /文件夹时所需要)
用 户 接 口扫 描 引 擎扫 描 配 置 病 毒 签 名文 件 系统 支 持目 标 文 件 / 文件 夹
S c a n n e r D a e m o n 框 架客 户 端服 务 器 端
Main-class类
主要包括两个重要的类:
– RequestHandler
– ScannerDaemon
扫描配置模块
该模块(源代码的组织结构看,可归入到扫描引擎模块中,这里单独拿出来分析)。
该模块主要包括两个类:
– WriteableScanConfiguration
这个类放了一些扫描引擎的属性名。
– DefaultScanConfiguration
该类是默认的属性配置类,其构造函数就是对扫描引擎的属性赋以默认值。
病毒签名模块
这个模块中涉及到的类 /接口包括 CredoFile
类,CredoEntry类,PositionFoundEvent
类,PositionFoundListener接口、
StringFoundListener类,StringsParser类、
WildcardPattern类,StringFinder类等,其中 StringsParser类,WildcardPattern类和
StringFinder类尤为重要。
病毒签名文件
– 首先看看病毒签名文件到底是什么形式。下载
VirusSignatures-latest.zip,然后解压缩,可以看到里面包括 clamav.strings和 clamav2.strings
两个子文件,这两个子文件可以用 notepad文本工具打开。
– 摘取 clamav2.strings文件中的一段内容如下 (一行 ):
Oror-fam
(Clam)[1*0*3*0*3]=495243*56697275*5345585933
0F5455*4B617A61*536E617073686F
摘取 clamav.strings文件中的一段内容如下(一行):
– Eicar-Test-
Signature[32]=58354F2150254041505B345C505A58
353428505E2937434329377D2445494341522D5354
414E4441
– 从这段代码大致可以认为,Oror-fam(Clam)、
VBS.Kristen等为病毒名称,
[1*0*3*0*3]=495243*56697275*53455859330F5455*
4B617A61*536E617073686F等字串为该病毒的一段特征模式串。
CredoFile类
– 该类只是把普通文件包装成 jar格式输入流
CredoEntry类
– 根据(病毒签名文件)的介绍,病毒签名文件,credo文件是一个 jar package,这个
package里的每一个文件就用一个 credoEntry
类实例来表示。这个类十分简单,此处不做进一步分析。
CredoParser类
– 这个类的作用是:在指定的目录下查找,credo文件,供
StringsParser类解析,credo文件的具体内容。
StringsParser类
– 这个类具体完成对,strings文件的解析。
WildcardPattern类
– 这个类是用来处理不包含,*”字符的模式串,即模式串具有统一的形式,无须用,*”字符分隔开,例如
( 5.StringsParser类)节中文本行 2和 3中,=”后面的模式串。该类是病毒签名模块中的一个重要类。
StringFinder类
– 这个类是病毒签名模块中的核心类,该类具体保存了各种病毒的名称和特征串,并给每个相应的病毒加上了一个侦听器。
扫描引擎模块
这个模块是 ScannerDaemon的中心模块,
先简单看看对几个与事件侦听器有关的类 /
接口,然后按着扫描的整个过程逐个对相关类分析。主要包括 PositionFoundEvent类、
PositionFoundListener接口和
StringFoundListener类 。
MatchArray类
这个类包括两方面的功能。
– 第一,根据病毒签名文件,建立模式串 hash表,
在 ScanEngine类的初始化函数中,调用函数
loadCredoFiles(scanConfiguration),这个函数经过层层调用,最终调用 MatchArray类的
addString函数建立 hash表。
– 第二,通过调用 createCensor函数返回
MatchArrayCensor类实例,而
MatchArrayCensor类提供对文件的扫描。
文件系统支持模块
文件系统支持模块主要包括 VfsEnty类、
FileVfsEntry类,VfsContainerFactory接口、
ScanEngine类和容器类等。
VfsEntry类
– 这是个抽象类,表示一个文件 /文件夹节点。
FileVfsEntry类
– 该类是 VfsEntry抽象类的子类。该类实现了
VfsEntry中为定义的抽象函数。
测试实例
test1.txt(不含病毒 ):
It's a good day!
test2.txt(含 Eicar-Test-Signature病毒):
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICA
R-STANDARD-ANTIVIRUS-TEST-
FILE!$H+H*
test3.txt(含 W32.GriYo病毒):
Coded by GriYo 29A W32.GriYo
test4.txt(不含病毒):
29A Coded by GriYo W32.GriYo
test5.txt(含 Eicar-Test-Signature和 W32.GriYo病毒):
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-
ANTIVIRUS-TEST-FILE!$H+H*
Coded by GriYo 29A W32.GriYo
test6.zip(含含 Eicar-Test-Signature和 W32.GriYo病毒):
包含 test2.txt和 test3.txt两个子文件
test7.zip(不含任何病毒):
包含 test1.txt和 test4.txt两个子文件
1.对不含病毒模式串文件的测试
– 测试文件名为 test1.txt(放在项目文件夹下),
内容为:
– It's a good day!
– 客户端和服务器建立 telnet连接后,输入
– scan test1.txt
– 就会在客户端命令行窗口中输出:
– OK
– 表明未发现任何病毒。
2.对第一类模式串的测试
– 测试文件名为 test2.txt(放在项目文件夹下),内容为:
– X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-
ANTIVIRUS-TEST-FILE!$H+H*
– 其中
– X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDA
– 是 Eicar-Test-Signature[32]病毒的模式串
– 58354F2150254041505B345C505A58353428505E2937434329
377D2445494341522D5354414E4441
– 翻译后得到的字符串(每两个 16进制码翻译成一个 ascii字符,例如 58—X,35—5),运行 ScannerDaemon,然后客户端连接
telnet localhost 8127
– 之后输入 scan test2.txt,就会输出 Found ‘Eicar-Test-Signature’
in ‘test2.txt’。
– 说明匹配成功。
3.对第三类模式串的测试
– 测试文件名为 test3.txt(放在项目文件夹下),内容为:
– Coded by GriYo 29A W32.GriYo
– 其中 Coded by GriYo和 29A是 W32.GriYo病毒的两个顺序子串
– 436F64656420627920477269596F和 323941的 ascii码翻译串,
同样测试后,客户端会输出:
– Found ‘W32.GriYo(Clam)’in ‘test3.txt’。
– 说明匹配成功。
– 为了说明第三类模式串必须按模式字串的顺序得到匹配,另测试 文件 test4.txt,内容为:
– 29A Coded by GriYo W32.GriYo
– 运行后,客户端输出:
– OK。
– 说明子串顺序改变后,匹配未成功。
4.对含多个病毒模式的文件的测试
– 测试文件名为 test5.txt,内容如下:
– X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-
STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
– Coded by GriYo 29A W32.GriYo
– 输出为:
–Found ‘Eicar-Test-Signature’ in ‘test5.txt’。
– 说明扫描并未发现 W32.GriYo病毒。
5.对含多个病毒的 zip压缩包的测试
– 测试的压缩包文件为 test6.zip,包含 test2.txt和
test3.txt两个子文件。其中 test2.txt含有 Eicar-
Test-Signature病毒,test3.txt含有 W32.GriYo
病毒,扫描的输出结果是:
– FOUND 'W32.GriYo (Clam)' in 'test6.zip >>
zip:test3.txt'
– 说明只发现了一个病毒。
6.对不含任何病毒的 zip压缩包的测试
– 测试的压缩包文件为 test7.zip,包含 test1.txt和
test4.txt两个子文件,不含任何病毒,扫描后,
客户端的输出为:
– OK
– 表明未发现任何病毒。
ScannerDaemon配置
在 %ScannerDaemonDir%目录下建立 credo目录和 temp目录,把 VirusSignatures-latest.zip解压缩得到的 VirusSignatures.credo文件放到 credo目录下,temp目录为扫描压缩包文件所必须。
用 wordpad(或 notepad)工具打开
ScannerDaemon-settings.properties文件,要使该文件中的配置信息起作用,只要去掉属性名前的,#”(以,#”字符开头表示注释行)字符便可。
ScannerDaemon使用说明
服务器端启动 ScannerDaemon
– 1) 启动命令说明
– 启动 ScannerDaemon时可以接受的参数列表为:
– –nosignature:表示病毒签名文件无需检查签名
( VirusSignatures-latest.zip中的病毒签名文件是没有签名的,所以运行 ScannerDaemon必须加上此参数)
– –configfile filename:指定配置文件,为指定该参数,
默认的配置文件为
%ScannerDaemonDir%\ScannerDaemon-
settings.properties。
– –name_of_property value_of_property:指定属性名和属性值。
– 使命令行的当前工作目录进入 %ScannerDaemonDir%,一般只要运行
– java –jar ScannerDaemon.jar –nosignature
– 便可按照默认配置启动 ScannerDaemon。
– 如果执行
– java –jar ScannerDaemon.jar –nosignature –configfile
configure.txt
– 表示将按照 configure.txt文件配置启动 ScannerDaemon。
– java –jar ScannerDaemon.jar –nosignature –
engine.tempdirectory tempfile
– 表示临时文件夹名为 tempfile。
2)配置属性的优先级
– 总共有多种方法配置 ScannerDaemon的方法:
默认属性,在命令行参数中指定某个属性的值,
默认配置文件,自定义配置文件。
– 各种配置方式的优先级关系如下:
– 命令行指定属性 >自定义配置文件 >默认配置文件 >默认属性 。
2.客户端连接
– ScannerDaemon服务器的端口是 8127,在客户端 telnet连接到服务器端的 8127端口,便可执行客户端的扫描命令。
– telnet server_ip 8127
– 客户端可以执行的命令(命令大小写不敏感)
包括:
scan filename
这个命令扫描目标文件,文件名可以是文件或者目录,也可以是 ScannerDaemon支持的各种压缩包,如 zip,tar,gzip等,对于某些压缩包,
需要服务器端环境的支持,例如 tar包,需要服务器端环境的支持。如果待扫描的文件中含有某病毒,则在客户端就会输出相应的信息。如下图:
如果扫描之后未发现任何病毒,则输出,OK。
command shutdown
– 该命令关闭服务器。
另外,filter和 post命令在 0.6.0版本的源代码中被注释掉了。
了解杀毒引擎的框架
掌握 OAV使用方法
OAV简介
OAV( OpenAntiVirus)项目
( http://www.openantivirus.org)是在 2000
年 8月 30日由德国开源爱好者发起,旨在为开源社区的反病毒开发者提供一个交流和项目管理的资源平台。
该项目具有明确的路线图:
– 为网络 (邮件服务器,internet网关、文件服务器等 )终端用户和企业客户提供病毒防护的开源解决方案。
– 为网络终端用户和企业客户提供计算机和网络安全的开源解决方案。
– 研发开源的扫描引擎,从而使未来的安全需求不再依赖于商业提供商。
– 通过开源系统和软件产品,为系统管理员提供系统恢复能力。
– 建立网站,提供最新的病毒和安全信息。
– 建立 How-To项目提供相关信息和白皮书,用户和系统管理员可以通过该项目提供的信息,利用开源安全解决方案,从而确定反病毒策略。
项目组成:
– ScannerDaemon,VirusHammer和 PatternFinder是符合 GPL规范的病毒扫描器的一个简单而基础的实现,
用 Java语言写成。
– squid-vscan可以利用 Squid Http-Proxy扫描网络流量,
从而侦测病毒。
– samba-vsan利用 samba服务器提供 on-access病毒扫描。最新的 SUSE Linux已经包含了该工具。
– 此外,很多开源爱好者还开发了很多小工具,详细情况参见 http://www.openantivirus.org/projects.php
ScannerDaemon架构
ScannerDaemon基本上可以分为如下几个模块:
– 扫描引擎模块
– 扫描配置模块
– 病毒签名文件解析模块
– 文件系统支持模块(扫描目标文件 /文件夹时所需要)
用 户 接 口扫 描 引 擎扫 描 配 置 病 毒 签 名文 件 系统 支 持目 标 文 件 / 文件 夹
S c a n n e r D a e m o n 框 架客 户 端服 务 器 端
Main-class类
主要包括两个重要的类:
– RequestHandler
– ScannerDaemon
扫描配置模块
该模块(源代码的组织结构看,可归入到扫描引擎模块中,这里单独拿出来分析)。
该模块主要包括两个类:
– WriteableScanConfiguration
这个类放了一些扫描引擎的属性名。
– DefaultScanConfiguration
该类是默认的属性配置类,其构造函数就是对扫描引擎的属性赋以默认值。
病毒签名模块
这个模块中涉及到的类 /接口包括 CredoFile
类,CredoEntry类,PositionFoundEvent
类,PositionFoundListener接口、
StringFoundListener类,StringsParser类、
WildcardPattern类,StringFinder类等,其中 StringsParser类,WildcardPattern类和
StringFinder类尤为重要。
病毒签名文件
– 首先看看病毒签名文件到底是什么形式。下载
VirusSignatures-latest.zip,然后解压缩,可以看到里面包括 clamav.strings和 clamav2.strings
两个子文件,这两个子文件可以用 notepad文本工具打开。
– 摘取 clamav2.strings文件中的一段内容如下 (一行 ):
Oror-fam
(Clam)[1*0*3*0*3]=495243*56697275*5345585933
0F5455*4B617A61*536E617073686F
摘取 clamav.strings文件中的一段内容如下(一行):
– Eicar-Test-
Signature[32]=58354F2150254041505B345C505A58
353428505E2937434329377D2445494341522D5354
414E4441
– 从这段代码大致可以认为,Oror-fam(Clam)、
VBS.Kristen等为病毒名称,
[1*0*3*0*3]=495243*56697275*53455859330F5455*
4B617A61*536E617073686F等字串为该病毒的一段特征模式串。
CredoFile类
– 该类只是把普通文件包装成 jar格式输入流
CredoEntry类
– 根据(病毒签名文件)的介绍,病毒签名文件,credo文件是一个 jar package,这个
package里的每一个文件就用一个 credoEntry
类实例来表示。这个类十分简单,此处不做进一步分析。
CredoParser类
– 这个类的作用是:在指定的目录下查找,credo文件,供
StringsParser类解析,credo文件的具体内容。
StringsParser类
– 这个类具体完成对,strings文件的解析。
WildcardPattern类
– 这个类是用来处理不包含,*”字符的模式串,即模式串具有统一的形式,无须用,*”字符分隔开,例如
( 5.StringsParser类)节中文本行 2和 3中,=”后面的模式串。该类是病毒签名模块中的一个重要类。
StringFinder类
– 这个类是病毒签名模块中的核心类,该类具体保存了各种病毒的名称和特征串,并给每个相应的病毒加上了一个侦听器。
扫描引擎模块
这个模块是 ScannerDaemon的中心模块,
先简单看看对几个与事件侦听器有关的类 /
接口,然后按着扫描的整个过程逐个对相关类分析。主要包括 PositionFoundEvent类、
PositionFoundListener接口和
StringFoundListener类 。
MatchArray类
这个类包括两方面的功能。
– 第一,根据病毒签名文件,建立模式串 hash表,
在 ScanEngine类的初始化函数中,调用函数
loadCredoFiles(scanConfiguration),这个函数经过层层调用,最终调用 MatchArray类的
addString函数建立 hash表。
– 第二,通过调用 createCensor函数返回
MatchArrayCensor类实例,而
MatchArrayCensor类提供对文件的扫描。
文件系统支持模块
文件系统支持模块主要包括 VfsEnty类、
FileVfsEntry类,VfsContainerFactory接口、
ScanEngine类和容器类等。
VfsEntry类
– 这是个抽象类,表示一个文件 /文件夹节点。
FileVfsEntry类
– 该类是 VfsEntry抽象类的子类。该类实现了
VfsEntry中为定义的抽象函数。
测试实例
test1.txt(不含病毒 ):
It's a good day!
test2.txt(含 Eicar-Test-Signature病毒):
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICA
R-STANDARD-ANTIVIRUS-TEST-
FILE!$H+H*
test3.txt(含 W32.GriYo病毒):
Coded by GriYo 29A W32.GriYo
test4.txt(不含病毒):
29A Coded by GriYo W32.GriYo
test5.txt(含 Eicar-Test-Signature和 W32.GriYo病毒):
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-
ANTIVIRUS-TEST-FILE!$H+H*
Coded by GriYo 29A W32.GriYo
test6.zip(含含 Eicar-Test-Signature和 W32.GriYo病毒):
包含 test2.txt和 test3.txt两个子文件
test7.zip(不含任何病毒):
包含 test1.txt和 test4.txt两个子文件
1.对不含病毒模式串文件的测试
– 测试文件名为 test1.txt(放在项目文件夹下),
内容为:
– It's a good day!
– 客户端和服务器建立 telnet连接后,输入
– scan test1.txt
– 就会在客户端命令行窗口中输出:
– OK
– 表明未发现任何病毒。
2.对第一类模式串的测试
– 测试文件名为 test2.txt(放在项目文件夹下),内容为:
– X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-
ANTIVIRUS-TEST-FILE!$H+H*
– 其中
– X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDA
– 是 Eicar-Test-Signature[32]病毒的模式串
– 58354F2150254041505B345C505A58353428505E2937434329
377D2445494341522D5354414E4441
– 翻译后得到的字符串(每两个 16进制码翻译成一个 ascii字符,例如 58—X,35—5),运行 ScannerDaemon,然后客户端连接
telnet localhost 8127
– 之后输入 scan test2.txt,就会输出 Found ‘Eicar-Test-Signature’
in ‘test2.txt’。
– 说明匹配成功。
3.对第三类模式串的测试
– 测试文件名为 test3.txt(放在项目文件夹下),内容为:
– Coded by GriYo 29A W32.GriYo
– 其中 Coded by GriYo和 29A是 W32.GriYo病毒的两个顺序子串
– 436F64656420627920477269596F和 323941的 ascii码翻译串,
同样测试后,客户端会输出:
– Found ‘W32.GriYo(Clam)’in ‘test3.txt’。
– 说明匹配成功。
– 为了说明第三类模式串必须按模式字串的顺序得到匹配,另测试 文件 test4.txt,内容为:
– 29A Coded by GriYo W32.GriYo
– 运行后,客户端输出:
– OK。
– 说明子串顺序改变后,匹配未成功。
4.对含多个病毒模式的文件的测试
– 测试文件名为 test5.txt,内容如下:
– X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-
STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
– Coded by GriYo 29A W32.GriYo
– 输出为:
–Found ‘Eicar-Test-Signature’ in ‘test5.txt’。
– 说明扫描并未发现 W32.GriYo病毒。
5.对含多个病毒的 zip压缩包的测试
– 测试的压缩包文件为 test6.zip,包含 test2.txt和
test3.txt两个子文件。其中 test2.txt含有 Eicar-
Test-Signature病毒,test3.txt含有 W32.GriYo
病毒,扫描的输出结果是:
– FOUND 'W32.GriYo (Clam)' in 'test6.zip >>
zip:test3.txt'
– 说明只发现了一个病毒。
6.对不含任何病毒的 zip压缩包的测试
– 测试的压缩包文件为 test7.zip,包含 test1.txt和
test4.txt两个子文件,不含任何病毒,扫描后,
客户端的输出为:
– OK
– 表明未发现任何病毒。
ScannerDaemon配置
在 %ScannerDaemonDir%目录下建立 credo目录和 temp目录,把 VirusSignatures-latest.zip解压缩得到的 VirusSignatures.credo文件放到 credo目录下,temp目录为扫描压缩包文件所必须。
用 wordpad(或 notepad)工具打开
ScannerDaemon-settings.properties文件,要使该文件中的配置信息起作用,只要去掉属性名前的,#”(以,#”字符开头表示注释行)字符便可。
ScannerDaemon使用说明
服务器端启动 ScannerDaemon
– 1) 启动命令说明
– 启动 ScannerDaemon时可以接受的参数列表为:
– –nosignature:表示病毒签名文件无需检查签名
( VirusSignatures-latest.zip中的病毒签名文件是没有签名的,所以运行 ScannerDaemon必须加上此参数)
– –configfile filename:指定配置文件,为指定该参数,
默认的配置文件为
%ScannerDaemonDir%\ScannerDaemon-
settings.properties。
– –name_of_property value_of_property:指定属性名和属性值。
– 使命令行的当前工作目录进入 %ScannerDaemonDir%,一般只要运行
– java –jar ScannerDaemon.jar –nosignature
– 便可按照默认配置启动 ScannerDaemon。
– 如果执行
– java –jar ScannerDaemon.jar –nosignature –configfile
configure.txt
– 表示将按照 configure.txt文件配置启动 ScannerDaemon。
– java –jar ScannerDaemon.jar –nosignature –
engine.tempdirectory tempfile
– 表示临时文件夹名为 tempfile。
2)配置属性的优先级
– 总共有多种方法配置 ScannerDaemon的方法:
默认属性,在命令行参数中指定某个属性的值,
默认配置文件,自定义配置文件。
– 各种配置方式的优先级关系如下:
– 命令行指定属性 >自定义配置文件 >默认配置文件 >默认属性 。
2.客户端连接
– ScannerDaemon服务器的端口是 8127,在客户端 telnet连接到服务器端的 8127端口,便可执行客户端的扫描命令。
– telnet server_ip 8127
– 客户端可以执行的命令(命令大小写不敏感)
包括:
scan filename
这个命令扫描目标文件,文件名可以是文件或者目录,也可以是 ScannerDaemon支持的各种压缩包,如 zip,tar,gzip等,对于某些压缩包,
需要服务器端环境的支持,例如 tar包,需要服务器端环境的支持。如果待扫描的文件中含有某病毒,则在客户端就会输出相应的信息。如下图:
如果扫描之后未发现任何病毒,则输出,OK。
command shutdown
– 该命令关闭服务器。
另外,filter和 post命令在 0.6.0版本的源代码中被注释掉了。