# 腾讯电脑管家TAV引擎逆向分析

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-02-13T01:29:00Z
Canonical: https://wepostx.com/topics/713

> 乌云历史资料归档
>
> **原始作者：** Variable
> **原始编号：** superkieran-wooyundrops:471
> **原始发布时间：** 2015-02-13 09:29
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 背景

about me：写过外挂，做过破解，对电脑管家也有比较长时间的逆向分析积累，现在整理下投出来，求邀请码和WB。
TAV有自己的优势和特点的，比如杀毒之后能够还原一部分被病毒破坏的注册表和文件。另外它的内存查杀也不错，可以扫描内存、创建和病毒一样的互斥，防止病毒再次运行。
TAV相比其他杀毒软件还是有很多不足，最明显的缺陷是免杀比较简单，由于TAV引擎用的是字符串明文检测，很容易通过分析病毒库或者是MYCCL等进行黑盒免杀。另一方面，TAV的效率比较低，包括特征数据结构弱, 特征复用等方面的问题，后面会有详细分析。
值得一说的是，逆向TAV的特征库可以看到，外挂特征比病毒、后门特征都多，排在了特征数量的第二名，说腾讯电脑管家是“外挂杀手”一点都不夸张。盗号木马则是TAV另一个重点打击的对象，在特征库占比也不低。至于感染型病毒、后门、下载者、蠕虫、恶意脚本等其它类型的木马病毒，还需要OEM的小红伞引擎或者云引擎来补位，否则单靠TAV肯定是无能为力的。

# 0x01 结构与功能初析

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

![原文图片](/media/2016/06/0e3a57e06e179aa650fb306afef34715)

## 1. 引擎内部功能一览

### 内存扫描
匹配指定的进程和内存串，如果匹配到就终止进程

![原文图片](/media/2016/06/4c2c1681c58a65d9dc02ae93be504c3b)

### 匹配文件是否存在

![原文图片](/media/2016/06/43c0cfd4ee40c4aec3f222e67f671a3b)

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

![原文图片](/media/2016/06/0a4b579b23235ca4fa75dc430e24e504)

### 内存清理

![原文图片](/media/2016/06/45bac672c381778dd048c7777e1201fc)

### 解包

![原文图片](/media/2016/06/ce28d80acbdb60e6a05e83d10029fcd8)

### 字符串多模式匹配

![原文图片](/media/2016/06/489a912302bfa4d208877dddd5cc2933)

### 虚拟机:

![原文图片](/media/2016/06/3783554a9aac5528506f8144bbc3a034)

模拟了ntdll、kernel32、gdi32、user32、advapi32、shell32、wsock32、ole32、oleaut32、msvcrt、version、urlmon这几个系统DLL
对于不常用的API采用同一个函数统一处理：
![原文图片](/media/2016/06/759e9654667a05344e29a5fae86d7a15)

对于关键函数，使用单独的模拟代码实现：
![原文图片](/media/2016/06/d756d440fe8bb0803382630955d8a31b)

## 2. 病毒库分析：

### A).病毒库算法:
只是简单的ZLIB。

![原文图片](/media/2016/06/5cea92e8c268b73b19110c7aa3d0e9d8)

解密后内容如下：

![原文图片](/media/2016/06/20550c45318eee95d9bb76d3944c32a8)

### B). 病毒库结构:
virinfo.def：名称表，包括壳名、包名、特征名 c++ structVirInfo { DWORD dwID; BYTE btLength; char VirName[btLength]; };

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

![原文图片](/media/2016/06/0c25256051e34fc96e59923743d42077)

### D). 病毒库更新：
病毒库的更新有2种方式：
1 直接更新扩展名为.def的病毒库，适用于查杀现有引擎可以支持的木马和病毒。
2 更新替换tpktt.dll，适用于现有引擎无法解决的复杂样本，将特征和查杀方法通过分析员写代码实现，然后整个引擎更新替换，类似于专杀方式。

# 0x02 PE查杀过程逆向分析：

## 1.病毒库描述：

virpeXX.def：（PE库）

```text
#!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 //多模式特征 };
```

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

## 2. 静态查杀方式：

### a). 二进制全文匹配。（二进制特征存放在virpe01.def库解密后的tbl5中）
将数十字节的病毒代码二进制，记录在病毒库中，与待检测样本进行全文匹配。

### b). 多模匹配。（多模特征存放在tbl6中）
将恶意程序的明显字符串信息提取出，记录在病毒库中，与待检测样本进行多模匹配。

## 3. 静态扫描流程：

见下图
![原文图片](/media/2016/06/bb3825ca281e822bb404fda1cfd2a735)

## 4. 设计缺陷分析：

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

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

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

### c) 对抗门槛低。
匹配代码在内存中明文存在。

![原文图片](/media/2016/06/cb08d3859320a51e0d1c544ffc54cc92)

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

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

![原文图片](/media/2016/06/8aa8833ec9de6eeb6845dbc678bc29cf)

例：Virus.Win32.DiskGen
以此家族为例，描述TAV设计缺陷导致的效率问题。
TAV查杀Virus.Win32.DiskGen病毒从a变种到最后的an变种，多次匹配了这条特征：

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

![原文图片](/media/2016/06/286909cdf74f0ceb679ce17dddf0ad3c)

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

![原文图片](/media/2016/06/060fc0102c74ecf85c04b922756ad5ae)

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

# 0x03 其他类型分析：

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

![原文图片](/media/2016/06/c3583de3e5d3f655ed0e969ef7b27f60)

virdexXX.def：安卓特征库

![原文图片](/media/2016/06/8673c49eb45a9c0c50f42b560ba83fa1)

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

![原文图片](/media/2016/06/cca412d177e9f859bf2bd553408a4d3b)

vircmpinfo.def：壳、编译器识别

![原文图片](/media/2016/06/18c40b9d7e1709b6b622b0f19aa73051)

![原文图片](/media/2016/06/f06231321af4b051a96e32b898c50e2a)

# 0x04 实战对抗

## 1.TAV虚拟机对抗

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

![原文图片](/media/2016/06/e1970dcf5253d3dd1b2ea8f370f639c3)

文件的真实调试结果：

![原文图片](/media/2016/06/29da8451c35575e880f500ae83e3fc9b)

不过TAV的虚拟执行能力比较弱，比较适用于对压缩壳进行脱壳，如常见的UPX壳，而对于动态行为查杀却无能为力。
比如某个非常简单的Downloader木马，作者调用了URLDownloadToFileW下载一个木马，然后调用WinExec执行木马。整个过程非常简单，只用到2个Windows API，并且没有额外的代码来对抗虚拟机，而TAV引擎却无法查杀：

![原文图片](/media/2016/06/6de7c3efe844779dc026a41b9b667638)

![原文图片](/media/2016/06/58cf086005e188ffe462b952ee1a566b)

![原文图片](/media/2016/06/83048fdff06e67beb6836e06307fc267)

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

![原文图片](/media/2016/06/2f2539971eab92cc1f943438698cadb6)

## 2.MYCCL黑盒对抗：

以某盗QQ木马测试。

![原文图片](/media/2016/06/cb3d806341a15e44c0fe641606236ee6)

特征码地址如下：

![原文图片](/media/2016/06/171e110a8ff7bcf105a3a647b9db0ede)

使用C32ASM查看特征码：

![原文图片](/media/2016/06/92dadf45983c2298d0a0aae0f831be84)

随便改改：

![原文图片](/media/2016/06/1924263058f94bbc5fa3e65e8edd4625)

## Replies
