sysksy 发表于 2015-4-26 17:09

代码分析

(大神勿喷,但渴望鼓励,让我有一条道走到黑的动力)
基本信息

报告名称:             恶意代码分析学习笔记
作者:                   淘气鬼/精灵(^_^)
报告更新日期:       2015/4/26
样本发现日期:
样本类型:             Lab.exe       .sys
样本文件大小:         
被感染文件变化长度:
样本文件的MD5校验值:(.exe)795F093A536F118FB4C34FCEDFA42165
                                 (.sys )3D3D1A8145E3237183984FAED04E052E
样本的SHA1校验值   :(.exe)C83624B0C3C65ABEA42305143DB7C8619443DF3A
                                 (.sys )58B739D182DFF8F2A9B0472B10AA7C7B652FB675
壳信息                      :PEID:(.exe) Microsoft Visual C++ 6.0(空壳)      
                                 PEID:(.sys ) Nothing found * (空壳)   
可能受威胁的系统   :win xpl
相关漏洞                  :未曝
已知检测名称            :在线查杀,未查出有报病毒结果,如图1:


简介

被感染的网络症状   :无

系统文件变化         :多生成一个Lab10-01.sys文件,禁用防火墙

注册文件变化         :防火墙的注册表键值被改变

网络症状               :

详细分析/功能介绍
(当样本运行后会出现的操作)
   1.用IDA打开Lab10-01.exe文件。首先检查Import列表,查看Lab10-01.exe文件导入的API函数。发现比较有价值的API函数只有如图2:

    说明它的主要任务是生成并调用某函数服务。
来到IDA试图界面,浏览他的流程图,结果改程序确实主要目的是创建服务进程,调用某个.sys文件。如图3。


   详细查看各函数的命令流程:
首先执行OpenSCManagerA(确定指定计算机上的服务控制管理器连接并打开指定的服务控制管理器数据库)
==》0x00401046:CreateServiceA(创建服务)/0x0040105d:(OpenServiceA)如果已经创建服务进程,将终止创建服务进程然后打开服务进程。
==》0x0040106e:StartServiceA(开启服务)
==》0x00401080:ControlService (控制服务,用于停止服务)

这就留下了疑问:创建的是什么进程呢?要创建,总得有服务进程文件名和创建文件存放的路径吧?为了找到相关的信息,因此只能再次详细查看CreateServiceA函数范围的指令。查看到函数头的相关指令如下:
00401021      push    0               ; lpPassword
00401023      push    0               ; lpServiceStartName
00401025      push    0               ; lpDependencies
00401027      push    0               ; lpdwTagId
00401029      push    0               ; lpLoadOrderGroup
0040102B      push    offset BinaryPathName ;
"C:\\Windows\\System32\\Lab10-01.sys"

00401030      push    1               ; dwErrorControl
00401032      push    3               ; dwStartType
00401034      push    1               ; dwServiceType
00401036      push    0F01FFh         ; dwDesiredAccess
0040103B      push    offset ServiceName ; "Lab10-01"
00401040      push    offset ServiceName ; "Lab10-01"
00401045      push    edi             ; hSCManager
00401046      call   ds:CreateServiceA

由此可知创建服务进程的二进制文件名路径为:"C:\\Windows\\System32\\Lab10-01.sys"
服务名字为                              :"Lab10-01"
因为这需要涉及到.sys文件,所以需要使用windbg进行内核调试,以了解调用Lab10-01.sys时系统内核的变化。但在内核调试之前先用IDA调试查看Lab10-01.sys文件的初步信息,以了解它的大概功能。
先用strings.exe扫描一下Lab10-01.sys文件。看看有什么有价值的信息!得到的结果如图4:

这很明显,就是修改注册表的键值,还是防火墙的的键值。很明显就是对防火墙禁用或者修改其配置以弱化防火墙的防护能力(恶意软件对防火墙的常见行为)。结合注册表路径上边的EnableFirewall,就可以很肯定的判断确实是禁用防火墙。
还发现字符串里边存在ntoskrnl.exe ,经百度搜索其是 Windows 操作系统的一个重要进程文件,在系统经过预启动和启动阶段后进入内核调用阶段时由 Ntldr 调用 ntoskrnl.exe,

(Lab0-01.sys文件的试图流程很简单)
先打开IDA的inport界面,得到他只调用内核的三个函数:
RtlCreateRegistryKey    ntoskrnl   创建注册表键值
KeTickCount         ntoskrnl   如果规定时间收不到信息,将会调用此函数关闭服务进程(处理异常)
RtlWriteRegistryValue   ntoskrnl    写入键值

打开export界面,得到如下信息:
001048E         mov   esi, ds:RtlCreateRegistryKey
00010494      push    edi
00010495      xor   edi, edi
00010497      push    offset Path   ; "\\Registry\\Machine\\SOFTWARE\\Policies"...
0001049C      push    edi             ; RelativeTo
0001049D   mov   , edi
000104A0   call   esi ; RtlCreateRegistryKey               ;创建键
000104A2   push    offset aRegistryMach_0 ; "\\Registry\\Machine\\SOFTWARE\\Policies"...
000104A7   push    edi             ; RelativeTo
000104A8   call   esi ; RtlCreateRegistryKey
000104AA   push    offset aRegistryMach_1 ; "\\Registry\\Machine\\SOFTWARE\\Policies"
000104AF   push    edi             ; RelativeTo
000104B0   all      esi ; RtlCreateRegistryKey
000104B2movebx, offset aRegistryMach_2 ; "\\Registry\\Machine\\SOFTWARE\\Policies"...
000104B7   push    ebx             ; Path
000104B8   push    edi             ; RelativeTo
000104B9   call   esi ; RtlCreateRegistryKey
000104BB   mov   esi, ds:RtlWriteRegistryValue
000104C1   push   4               ; ValueLength
000104C3   ea      eax,
000104C6   push    eax             ; ValueData
000104C7   push    4               ; ValueType
000104C9   mov   edi, offset ValueName
000104CE   push    edi             ; ValueName
000104CF   push    offset aRegistryMach_1 ; "\\Registry\\Machine\\SOFTWARE\\Policies"...
                                                         ;
000104D4               push    0               ; RelativeTo
000104D6               call    esi ; RtlWriteRegistryValue   ; 写入键值

这也进一步证实在strings中搜集到的字符串而初步判断出的结果。
接下来可使用准备好初步的动态分析工具:Regshot(注册表快照),Process Monitor(系统文件,注册表,进程活动监测工具),Process explorer(任务管理器),Autoruns(自启动位置列表工具)。
打开windbg,载入可执行文件Lab10-01.exe程序。(连接成功)
先要查看Lab10-01.exe文件创建的服务具体内核用途,就需要在其调用ControlService(停止并卸载服务)前执行断点,也就是0x00401080。为什么会选择这个位置下断点呢?选择在这下断点是因为到了这整个Lab10-01.exe程序已将完成他的目的,在这下断点正好可以全面的了解他的所有行为。
==》 来到设置断点界面框,在0x00401080设置int 3中段(非常感谢15PB薛老师指点)如图5所示:

回到指令框
==》g
得到结果如图6所示:

接下来离开虚拟机回到了内核调试主机,查找虚拟机正在运行的驱动服务进程。但是那么多进程,究竟怎样找呢?还记得在IDA分析Lab10-01.exe文件得出的ServiceName 的值什么吗?Lab10-01。所以使用!drvobj 指令。
==》!brvobj Lab10-01      得到了该驱动的起始地址8263b418。得到结果如下所示:
Kd>!Drvobj Lab10-01
Diver object (8263b418)is for:
Loading symbols for f7c4700   Lab10-01.sys ->   Lab10-01.sys
Driver Extension List :(id,addr)

由此得到驱动服务的Lab10-01地址:8263b418 ,现在首先要做的就是进入Lab10-01驱动服务进程里边查看详细的属性成员及其数据。因此需要使用:dt _DRIVER_OBJECT 指令进行分析。
==》dt _DRIVER_OBJECT8263b418展开该驱动的各成员属性。如下结果:
nt! _DRIVER_OBJECT
+0x000 Type            :4
+0x002 Size            :168
+0x004 DeviceObject       :0
+0x008 Flags            :0x12
+0x00c DriverStart         :0xf7c47000             ;这是驱动快的起始地址
+0x010 DriverSize         :0xe80                  ;驱动块大小
+0x014 DriverSection       :0x826b2c88            ;驱动块地址
+0x018 DriverExtention   :0x82634c0 _DRIVER_EXTENSION;驱动扩展地址
+0x01c DriverName      :_UNICODE_STRING “Lab10-01”;驱动名
+0x024 HardwareDatabase   :0x80670ae0_UNICODE_STRING “REGISTRY\MACHINE\
HAEDWARE\DESCRIPTION\SYSTEM”            ;硬件数据库地址
+0x028 FastIoDispath       :0
+0x02c DriverInit          :0xf7c47959   long+0
+0x030 DriverStartIo       :0
+0x034 DriverUnload       :0xf7c477486    void+0;驱动卸载地址
+0x038 MajorFuntion       :0x804f354a   long nt!IopIvalidDeviceRequest+0

其中
+0x00c DriverStart         :0xf7c47000             ;这是驱动快的起始地址
+0x024 HardwareDatabase   :0x80670ae0_UNICODE_STRING “REGISTRY\MACHINE\
HAEDWARE\DESCRIPTION\SYSTEM”            ;硬件数据库地址
+0x034 DriverUnload       :0xf7c477486    void+0;驱动卸载地址
这三个信息对现在的分析目的比较重要,通常重点分析也是这几个对象。现在只是知道他的大概流程,所以现在不必每个都要进去详细分析一遍。现在只需要在调用DriverUnload(卸载驱动)函数下个断点,然后单步调试即可,这样可以清晰的去认知调试的区段指令及整个Lab10-01服务驱动进程函数调用。

内核调试中==》g      (恢复虚拟机运行)
虚拟机的可执行文件调试==》g(恢复可执行文件运行,运行到断点处)
程序运行断于内核调试设置的断点中…………
回到内核调试主机,进行单步调试,查看里边的调用的函数并记录下来(直到断点处)。
调用到的函数:
RtlCreateRegistryKey    ;创建键值
RtlCreateRegistryKey
RtlCreateRegistryKey

RtlWriteRegstryValue    ;写入键值
RtlWriteRegstryValue

而且它们的目的都是设置EnableFirewalls键值(0,关闭防火墙),这就让你联想到strings扫描出来的3个注册表路径了

再来查看Rogshot的快照结果,如下所示:
增加键:2
----------------------------------
HKLM\SYSTEM\ControlSet001\Services\Lab10-01\Enum
HKLM\SYSTEM\CurrentControlSet\Services\Lab10-01\Enum

增加值:8
----------------------------------
HKLM\SYSTEM\ControlSet001\Services\kmixer\Enum\0: "SW\{b7eafdc0-a680-11d0-96d8-00aa0051e51d}\{9B365890-165F-11D0-A195-0020AFD156E4}"
HKLM\SYSTEM\ControlSet001\Services\Lab10-01\Enum\Count: 0x00000000
HKLM\SYSTEM\ControlSet001\Services\Lab10-01\Enum\NextInstance: 0x00000000
HKLM\SYSTEM\ControlSet001\Services\Lab10-01\Enum\INITSTARTFAILED: 0x00000001
HKLM\SYSTEM\CurrentControlSet\Services\kmixer\Enum\0: "SW\{b7eafdc0-a680-11d0-96d8-00aa0051e51d}\{9B365890-165F-11D0-A195-0020AFD156E4}"
HKLM\SYSTEM\CurrentControlSet\Services\Lab10-01\Enum\Count: 0x00000000
HKLM\SYSTEM\CurrentControlSet\Services\Lab10-01\Enum\NextInstance: 0x00000000
HKLM\SYSTEM\CurrentControlSet\Services\Lab10-01\Enum\INITSTARTFAILED: 0x00000001

----------------------------------
修改值:15
----------------------------------
HKLM\SOFTWARE\Microsoft\Cryptography\RNG\Seed:
HKLM\SOFTWARE\Microsoft\Cryptography\RNG\Seed:
HKLM\SYSTEM\ControlSet001\Services\kmixer\Enum\Count: 0x00000000
HKLM\SYSTEM\ControlSet001\Services\kmixer\Enum\Count: 0x00000001
HKLM\SYSTEM\ControlSet001\Services\kmixer\Enum\NextInstance: 0x00000000
HKLM\SYSTEM\ControlSet001\Services\kmixer\Enum\NextInstance: 0x00000001
HKLM\SYSTEM\CurrentControlSet\Services\kmixer\Enum\Count: 0x00000000
HKLM\SYSTEM\CurrentControlSet\Services\kmixer\Enum\Count: 0x00000001
HKLM\SYSTEM\CurrentControlSet\Services\kmixer\Enum\NextInstance: 0x00000000
HKLM\SYSTEM\CurrentControlSet\Services\kmixer\Enum\NextInstance: 0x00000001



相关服务器信息分析



预防及修复措施

预防:
修复:来到相关的注册表路径修改EnableFirewall键值为1
Registry\Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile
Registry\Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall\domainProfile
Registry\Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall

还来到Rogshot逐个删改他的值

技术热点及总结

创建驱动服务,修改注册表,关闭防火墙。
页: [1]
查看完整版本: 代码分析