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

Variable 2015-02-13 09:29:00

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库)

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

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查看特征码:

随便改改:

评论

我是360安全忍者小号r00t4dm 2015-02-13 10:09:24

不错,看雪也有一篇,是分析百度杀毒引擎的。
不逆向不知道,一逆向吓一跳。

A

Anymous 2015-02-13 10:16:03

这篇文章怎么在首页全文显示了

杀戮 2015-02-13 10:25:57

一定是刚发布的几个小时会这样,对,一定是这样。

H

he1renyagao 2015-02-13 10:31:07

沙发?

金枪银矛小霸王 2015-02-13 11:00:43

怎么不见有360的。求一篇360的

路人甲 2015-02-13 11:34:25

谁敢来分析分析我们超越时代宇宙第一神级杀毒引擎QVM?!

I

insight-labs 2015-02-13 18:43:32

虽然不知道什么语言写的但是大概逻辑如下:
def isVirus(file)
if md5(file) not in whitelist:
return True
else:
return False

H

haha 2015-02-13 19:11:21

哈哈,笑死我了,黑360黑的漂亮。

路人甲 2015-02-13 21:20:00

小狮子后继有人,可以死而无憾了

路人甲 2015-02-13 23:37:42

比不会扫内存的360好太多了。
360快赶上。

路人甲 2015-02-14 11:53:57

黑得漂亮。

路人甲 2015-02-14 17:14:06

我看到特征库里有qihoo360字样

L

light 2015-02-14 19:11:17

这个思路好,我也来造个361杀毒~

路人甲 2015-02-15 02:00:52

上面用的是哪个版本的OD

V

Variable

写过外挂,搞过破解,目前在某IT公司打杂,业余时间主要关注Rootkit/Anti-Rootkit方面的分析和学习

twitter weibo github wechat

随机分类

神器分享 文章:71 篇
数据分析与机器学习 文章:12 篇
密码学 文章:13 篇
企业安全 文章:40 篇
Android 文章:89 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录