代码分析
(大神勿喷,但渴望鼓励,让我有一条道走到黑的动力)基本信息
报告名称: 恶意代码分析学习笔记
作者: 淘气鬼/精灵(^_^)
报告更新日期: 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]