0x00 背景


about me:写过外挂,做过破解,对电脑管家也有比较长时间的逆向分析积累,现在整理下投出来,求邀请码和WB。

TAV有自己的优势和特点的,比如杀毒之后能够还原一部分被病毒破坏的注册表和文件。另外它的内存查杀也不错,可以扫描内存、创建和病毒一样的互斥,防止病毒再次运行。

TAV相比其他杀毒软件还是有很多不足,最明显的缺陷是免杀比较简单,由于TAV引擎用的是字符串明文检测,很容易通过分析病毒库或者是MYCCL等进行黑盒免杀。另一方面,TAV的效率比较低,包括特征数据结构弱, 特征复用等方面的问题,后面会有详细分析。

值得一说的是,逆向TAV的特征库可以看到,外挂特征比病毒、后门特征都多,排在了特征数量的第二名,说腾讯电脑管家是“外挂杀手”一点都不夸张。盗号木马则是TAV另一个重点打击的对象,在特征库占比也不低。至于感染型病毒、后门、下载者、蠕虫、恶意脚本等其它类型的木马病毒,还需要OEM的小红伞引擎或者云引擎来补位,否则单靠TAV肯定是无能为力的。

0x01 结构与功能初析


引擎结构和功能如下。不难看出,TAV引擎属于基础的传统特征引擎。特征数量较少,与主流杀软相比还处于初级阶段。

1. 引擎内部功能一览


内存扫描

匹配指定的进程和内存串,如果匹配到就终止进程

匹配文件是否存在

创建一个和病毒相同的互斥体,防止病毒再次运行

内存清理

解包

字符串多模式匹配

虚拟机:

模拟了ntdll、kernel32、gdi32、user32、advapi32、shell32、wsock32、ole32、oleaut32、msvcrt、version、urlmon这几个系统DLL

对于不常用的API采用同一个函数统一处理:

对于关键函数,使用单独的模拟代码实现:

2. 病毒库分析:


A).病毒库算法:

只是简单的ZLIB。

解密后内容如下:

B). 病毒库结构:

virinfo.def:名称表,包括壳名、包名、特征名 c++
structVirInfo
{
DWORD dwID;
BYTE btLength;
char VirName[btLength];
};

C). 病毒库规模:

特征数量整体非常少,以PE为例只有8135条特征。分布见下图。从特征分布和类型来看,TAV主要查杀目标为外挂、盗号程序。对于动辄百万级规模的恶意程序家族其实只覆盖了冰山一角,远远达不到一个杀毒引擎的程度,仅仅停留在外挂、盗号专杀的层面。更让人捉急的是TAV维护了大量的脱壳解包特征,直接暴露了开发者框架设计方面的缺陷。与此形成鲜明对比的是国际知名的卡巴和BD引擎,通常在一个“膨胀”的过程中,维护较多的同家族特征,随后再在“收缩”过程中,用一条obj通杀,显得章法自如、张弛有度。

D). 病毒库更新:

病毒库的更新有2种方式:

1 直接更新扩展名为.def的病毒库,适用于查杀现有引擎可以支持的木马和病毒。

2 更新替换tpktt.dll,适用于现有引擎无法解决的复杂样本,将特征和查杀方法通过分析员写代码实现,然后整个引擎更新替换,类似于专杀方式。

0x02 PE查杀过程逆向分析:


1.病毒库描述:


virpeXX.def:(PE库)

#!c++
struct VirpeHeader
{
 WORD wUnknown;
 DWORD dwHeadSize;
 DWORD dwSize;
 WORD wTable1Count;
    WORD wdMaskCount;//表示共有多少条PE特征
    WORD wdUnknown4;
    DWORD dwTable1Off;
    DWORD dwTable2Off;
    DWORD dwTable3Off;
    DWORD dwTable4Off;
    DWORD dwTable5Off;//传统特征
    DWORD dwTable6Off //多模式特征
};

#!c++
struct Sig //特征结构
{
    DWORD dwRecordID;//特征ID,用于关联特征名
    DWORD dwOffset;//特征偏移,用于定位病毒代码具体位置
    BYTE btLength;//特征长度,用于扫描匹配病毒代码长度
    BYTE btOffsetBaseAddress;//特征基地址,用于定位特征起始位置
BYTE btVirMask[btLength];//病毒特征具体内容
};

2. 静态查杀方式:


a). 二进制全文匹配。(二进制特征存放在virpe01.def库解密后的tbl5中)

将数十字节的病毒代码二进制,记录在病毒库中,与待检测样本进行全文匹配。

b). 多模匹配。(多模特征存放在tbl6中)

将恶意程序的明显字符串信息提取出,记录在病毒库中,与待检测样本进行多模匹配。

3. 静态扫描流程:


见下图

4. 设计缺陷分析:


传统杀软最容易出现的几个问题:效率低、体积庞大、对抗门槛低。这几个问题在TAV身上尤为明显。只是现阶段TAV特征数量极低,暂时未大规模展现而已。

a) 体积大。

现有的查杀方式设计会导致病毒库臃肿,庞大的二进制数据和字符串数据记录在病毒库中,随着特征增加,病毒库体积会急速膨胀。在同等特征数量的情况下,TAV病毒库将会比卡巴、BD等杀软大上数十倍。

b) 效率低。

逐个匹配特征的方式,会随着病毒库膨胀而使得效率变得越来越低。卡巴、BD等杀软为解决此问题,设计出了多索引的方式,只有在最后一层才匹配几个特征,效率非常高。

c) 对抗门槛低。

匹配代码在内存中明文存在。

使得无论木马作者通过分析病毒库来免杀还是通过MYCCL等黑客工具进行黑盒免杀都极为容易。

d) 特征无复用。

下图为TAV的TOP50特征,可见出现大量重复二进制。特征之间基本无复用。

例:Virus.Win32.DiskGen

以此家族为例,描述TAV设计缺陷导致的效率问题。

TAV查杀Virus.Win32.DiskGen病毒从a变种到最后的an变种,多次匹配了这条特征:

18 8B 8E 30 0A 00 00 03 C8 40 40 8A 11 F6 D2 88 11 3B 05 3F 3F 3F 3F 7C

特征含义是病毒自解密代码

尽管使用了索引复用,但并没有优化。从病毒库中可以看到,这条相同的特征出现了20次。也就意味着,为了匹配这个家族的所有变种,当前待扫描文件需要扫描20次才行。因为目前TAV特征只有数千条,效率低下的问题感受不明显,倘若哪天TAV特征达到竞品平均水平的数百万条,不难想象扫描一个文件将会是何等的慢。

0x03 其他类型分析:


virscrXX.def:脚本库,直接存储的字符串,用于挂马的查杀。为了避免误报自身内存,采用了异或的方式,将特征加载到内存中。

virdexXX.def:安卓特征库

virsrcXX.def:脚本库,用于查杀HTML\JAVA\PDF\OLE\JS\NSIS

vircmpinfo.def:壳、编译器识别

0x04 实战对抗


1.TAV虚拟机对抗


当文件被加UPX壳后,会调用GetProcAddress动态获得API地址,TAV可以模拟GetProcAddress的结果,并且可以执行到下一条EIP所在位置,使得程序能够正常模拟下去,而不至于触发异常返回。

文件的真实调试结果:

不过TAV的虚拟执行能力比较弱,比较适用于对压缩壳进行脱壳,如常见的UPX壳,而对于动态行为查杀却无能为力。

比如某个非常简单的Downloader木马,作者调用了URLDownloadToFileW下载一个木马,然后调用WinExec执行木马。整个过程非常简单,只用到2个Windows API,并且没有额外的代码来对抗虚拟机,而TAV引擎却无法查杀:

同样的样本,扫描对比国外知名杀软,则可以通过虚拟机动态检出

2.MYCCL黑盒对抗:


以某盗QQ木马测试。

特征码地址如下:

使用C32ASM查看特征码:

随便改改: