动态分析基础技术
动态分析基础技术
原文链接:https://hvnt3r.top/2019/01/动态分析基础技术/
知识点
与静态分析不同,动态分析是将恶意代码加载运行之后观察代码运行状态的一个过程,一般来说,对恶意代码进行分析时先进行静态分析来大致了解软件的功能再进行动态分析以了解恶意代码运行时的更多细节,静态分析与动态分析都有各自的有点以及局限性,本章重点介绍了动态分析的一些手法和技巧。
用沙箱来分析恶意代码:沙箱是一种在安全环境下运行不信任的程序的安全机制,沙箱一般包含一个虚拟的环境,并可以定制虚拟网络等“欺骗”恶意代码让恶意代码认为自己所在的沙箱是一个正常的物理机的各种虚拟功能,但是运行在沙箱中的恶意代码并不会对物理机产生任何威胁,因此沙箱是一个很好的用来动态分析恶意代码的工具。
前一段时间我使用过布谷鸟沙箱(Cuckoo),这一款沙箱的结构是首先开启一个安装有Ubuntu14.04的系统用于安装Cuckoo,然后再向这个虚拟机上安装所有Cuckoo依赖的插件,安装完成后再向Ubuntu中安装一个Vmware虚拟机来安装一个用于运行Windows等系统的虚拟机,整体相当于是一个虚拟机的嵌套结构,布谷鸟对这个在虚拟机中运行的虚拟机的运行状态的存储状态进行记录,并对比运行病毒前后的镜像区别来确定恶意代码对主机做了什么,并会生成一个十分详细的报告,总的来说这种杀向在我们对一个恶意代码进行静态分析遇到困难时还是很有帮助的,但是缺点是此系统十分难于安装,因为很多安装条件会产生冲突,而且此沙箱运行起来也是对电脑性能的极大挑战,除非你有一台安装了Ubuntu14.04的物理主机。
类似于这样的沙箱还有Norman、GFI、Anubis、Joe、ThreatExpert、BitBlaze、Comodo等沙箱。
沙箱的缺点:
- 有些恶意代码会检测运行环境是否为虚拟环境,如果是虚拟环境,则恶意代码通常不会表现出真正的功能。
- 恶意代码通常会连接C2服务器来执行特定的功能,如果恶意代码设定了一个潜伏期,则沙箱就难以探测到长时间以后恶意代码可能发生的行为。
- 沙箱不能很方便的分析一个DLL恶意代码
运行DLL文件如果碰到一个DLL恶意代码,Windows不知道如何运行DLL文件,因此我们需要使用rundll32.exe来运行DLL文件,使用命令格式如下:
rundll32.exe DLL_name, Export_arguments
Export_arguments必须是DLL文件导出函数的函数名或者是函数序号,使用函数名可以直接将函数名作为Export_arguments参数的值,如果使用函数序号需要写为井号加数字的形式来表示序号如#2
比如使用命令rundll32.exe shell32.dll,RestartDialog可以使计算机弹出重新启动窗口
进程监视器进程监视器是Windows下一款可以监视系统注册表和文件系统,进程和线程的软件,虽然此程序也可以监控网络流量,但是由于Windows不同版本可能存在不同程度的兼容问题,所以一般不采用进程管理器来监控网络行为。另外,进程监视器是使用内存来记录事件的,因此如果你在虚拟环境下调用此程序,每分钟超过5万次的调用行为可能很快就将内存耗尽,因此我们使用进程监视器来监控程序的系统调用时需要清空之前的调用记录并将监控时间缩短以避免内存空间被耗尽。
可以用进程监视器来分析恶意文档如PDF文档和Word文档,当文档被加载后,可以在进程监视器中看到文档启动的进程并通过Image字段来找到恶意代码在磁盘上的位置。
RegShotRegshot是一款注册表监视器,可以在运行恶意代码之前对注册表做一次快照,再在运行恶意代码之后做一次快照,然后通过对比运行恶意代码前后注册表内容的不同来得知恶意代码对注册表进行了哪些操作。
网络以下是几款模拟网络响应或者监视网络事件的好用软件的软件:
- ApateDNS:此软件是一款免费软件,可以很方便的发现恶意代码进行的DNS请求。
- WireShark:不必多说,神器。
- NetCat:瑞士军刀,神器。
- INetSim:INetSim是一款基于Linux的模拟网络的免费软件他可以模拟多种服务如
Http、Https、FTP、IRC、DNS、SMTP等,而且可以根据恶意代码的请求做出尽量符合恶意代码要求的返回动作从而帮助我们研究恶意代码。
关于动态分析过程中用的软件,嘶吼上有一篇文章介绍:http://www.4hou.com/technology/3022.html
课后练习
Lab3-1
使用动态分析技术来分析在Lab03-01.exe文件中发现的恶意代码
1.找出这个恶意代码的导入函数与字符串列表。
这个恶意代码只有一个导入函数函数,因此判断此程序可能是加了壳的
00400200 ExitProcess kernel32
用PEiD查壳发现此程序确实加了壳,壳为PEncrypt 3.1 Final -> junkcode,但此题不需要脱壳。
字符串列表:
Address Length Type String
.text:0040025A 0000000D C kernel32.dll
.data:00400EF7 00000005 C \b1\a1G
.data:00401087 00000007 C \n6I*h<8
.data:004010A7 00000010 C ^-m-m<|<|<|M\rM\r^
.data:00401247 00000006 C ntdll
.data:0040125E 00000007 C user32
.data:004014F7 00000008 C advpack
.data:00401623 00000008 C StubPath
.data:0040162F 00000029 C SOFTWARE\\Classes\\http\\shell\\open\\commandV
.data:0040165B 00000035 C Software\\Microsoft\\Active Setup\\Installed Components\\
.data:0040169C 00000022 C www.practicalmalwareanalysis.com
.data:004016D4 00000007 C admin\t\r
.data:004016E2 0000000B C VideoDriver
.data:004016F1 00000009 C WinVMX32-
.data:004016FD 0000000D C vmx32to64.exe
.data:00401943 00000008 C AppData
2.这个恶意代码在主机上的感染迹象特征是什么?
此题主要考察的时对应用程序在运行时动态行为的捕捉,打开Procmon捕捉当前所有事件,设置过滤器使得程序显示出与Lab03-01.exe相关的进程活动记录:

这样初步过滤后可以看到恶意代码的事件数量还是很大,我们可以通过其他过滤器来筛选出自己想看到的结果。
运行RegShot进行注册表快照时我发现Win10的注册表项目十分庞大,拍摄快照时会有很多干扰项,因此我尝试下载WindowsXP进行实验,幸运的是,在我使用WindowXP作为病毒分析环境时,很快就用RegShot分析出了病毒对注册表的改动:

3.这个恶意代码是否存在一些有用的网络特征,如果存在,他们是什么?
在分分析恶意代码中包含的字符串的过程中我们就已经发现了一个敏感的字符串www.practicalmalwareanalysis.com,看到这个网址我们八成就能猜出这个恶意代码很可能会与此域名建立连接。
使用ApateDNS,过程中发现此程序无法在我的虚拟机中正常启动,因为虚拟机的53端口被其他进程占用了,查看之后发现使svchost,kill掉此进程后ApateDNS即可正常启动
我们需要运行INetSim来捕捉恶意代码的网络请求
修改如下几处配置
- 修改
service_bind_address为安装了INetSim的虚拟机的IP地址:
#########################################
# service_bind_address
#
# IP address to bind services to
#
# Syntax: service_bind_address
#
# Default: 127.0.0.1
#
service_bind_address 192.168.60.129
- 修改
dns_default_ip为安装了INetSim的虚拟机的IP地址,以接收DNS请求:
#########################################
# service_bind_address
#
# IP address to bind services to
#
# Syntax: service_bind_address
#
# Default: 127.0.0.1
#
service_bind_address 192.168.60.129
- 接着转到接近配置文件末尾的地方,开启重定向:
#########################################
# service_bind_address
#
# IP address to bind services to
#
# Syntax: service_bind_address
#
# Default: 127.0.0.1
#
service_bind_address 192.168.60.129
- 打开TCP端口用于连接:
#########################################
# redirect_exclude_port
#
# Connections to on this port
# are not redirected
#
# Syntax: redirect_exclude_port
#
# Default: none
#
redirect_exclude_port tcp:22
#redirect_exclude_port udp:111
- 重定向外部地址:
#########################################
# redirect_external_address
#
# IP address used as source address if INetSim
# acts as a router for redirecting packets to
# external networks.
# This option only takes effect if static rules
# for redirecting packets to external networks
# are defined (see 'redirect_static_rule' below).
#
# Syntax: redirect_external_address
#
# Default: none
#
redirect_external_address 192.168.60.129
修改完以上内容后重新启动INetSim发现如下报错:
* redirect - failed! Error: Sorry, this module requires the Perlipq library (IPTables::IPv4::IPQueue)!
后来得知InetSim弃用了这个库所以这个功能暂时无法使用,那么就先不用这个了。
用WireShark抓包看一下发现了一个DNS请求的数据包:

恶意代码每30秒就会发送一次对此域名的DNS解析请求,而且会广播一个长度为256字节的随机数据:

WireShark将此数据包识别为SSL流量,但是看数据包内容可得知这并不是一个SSL数据包,而只是占用了443端口。
Lab3-2
使用动态分析技术来分析在Lab03-02exe文件中发现的恶意代码
1.您怎样才能让这个恶意代码自行安装?
这个恶意代码是一个DLL程序,因此我们需要用rundll32.exe工具来运行此DLL文件中的函数,先用IDA查看一下此DLL中的函数:
此程序的导出函数列表:
Name Address Ordinal
Install 10004706 1
ServiceMain 10003196 2
UninstallService 10004B18 3
installA 10004B0B 4
uninstallA 10004C2B 5
DllEntryPoint 10004E4D [main entry]
导入函数:
Address Ordinal Name Library
10005000 OpenServiceA ADVAPI32
10005004 DeleteService ADVAPI32
10005008 RegOpenKeyExA ADVAPI32
1000500C RegQueryValueExA ADVAPI32
10005010 RegCloseKey ADVAPI32
10005014 OpenSCManagerA ADVAPI32
10005018 CreateServiceA ADVAPI32
1000501C CloseServiceHandle ADVAPI32
10005020 RegCreateKeyA ADVAPI32
10005024 RegSetValueExA ADVAPI32
10005028 RegisterServiceCtrlHandlerA ADVAPI32
1000502C SetServiceStatus ADVAPI32
10005034 GetStartupInfoA KERNEL32
10005038 CreatePipe KERNEL32
1000503C GetCurrentDirectoryA KERNEL32
10005040 CreateProcessA KERNEL32
10005044 lstrlenA KERNEL32
10005048 SetLastError KERNEL32
1000504C OutputDebugStringA KERNEL32
10005050 CloseHandle KERNEL32
10005054 ReadFile KERNEL32
10005058 GetTempPathA KERNEL32
1000505C GetLongPathNameA KERNEL32
10005060 LoadLibraryA KERNEL32
10005064 GetProcAddress KERNEL32
10005068 CreateThread KERNEL32
1000506C GetSystemTime KERNEL32
10005070 WaitForSingleObject KERNEL32
10005074 TerminateThread KERNEL32
10005078 Sleep KERNEL32
1000507C GetLastError KERNEL32
10005080 GetModuleFileNameA KERNEL32
10005088 _chdir MSVCRT
1000508C _strnicmp MSVCRT
10005090 _adjust_fdiv MSVCRT
10005094 malloc MSVCRT
10005098 _initterm MSVCRT
1000509C free MSVCRT
100050A0 type_info::~type_info(void) MSVCRT
100050A4 _except_handler3 MSVCRT
100050A8 _CxxThrowException MSVCRT
100050AC _stricmp MSVCRT
100050B0 _EH_prolog MSVCRT
100050B4 __CxxFrameHandler MSVCRT
100050B8 strchr MSVCRT
100050BC _itoa MSVCRT
100050C0 strstr MSVCRT
100050C4 strncat MSVCRT
100050C8 strlen MSVCRT
100050CC sscanf MSVCRT
100050D0 atol MSVCRT
100050D4 operator new(uint) MSVCRT
100050D8 memset MSVCRT
100050DC wcstombs MSVCRT
100050E0 strncpy MSVCRT
100050E4 strcat MSVCRT
100050E8 strcpy MSVCRT
100050EC atoi MSVCRT
100050F0 fclose MSVCRT
100050F4 fflush MSVCRT
100050F8 operator delete(void *) MSVCRT
100050FC fwrite MSVCRT
10005100 fopen MSVCRT
10005104 strrchr MSVCRT
1000510C InternetCloseHandle WININET
10005110 InternetOpenA WININET
10005114 InternetConnectA WININET
10005118 HttpOpenRequestA WININET
1000511C HttpSendRequestA WININET
10005120 HttpQueryInfoA WININET
10005124 InternetReadFile WININET
1000512C 11 inet_addr WS2_32
10005130 WSASocketA WS2_32
10005134 3 closesocket WS2_32
10005138 4 connect WS2_32
1000513C 10 ioctlsocket WS2_32
10005140 19 send WS2_32
10005144 18 select WS2_32
10005148 151 __WSAFDIsSet WS2_32
1000514C 16 recv WS2_32
10005150 22 shutdown WS2_32
10005154 115 WSAStartup WS2_32
10005158 57 gethostname WS2_32
1000515C 116 WSACleanup WS2_32
10005160 9 htons WS2_32
程序中的字符串:
Address Length Type String
.rdata:100055C2 0000000D C KERNEL32.dll
.rdata:100056B0 0000000D C ADVAPI32.dll
.rdata:100056CC 0000000B C WS2_32.dll
.rdata:10005760 0000000C C WININET.dll
.rdata:10005886 0000000B C MSVCRT.dll
.rdata:1000595A 0000000D C Lab03-02.dll
.rdata:10005969 00000008 C Install
.rdata:10005978 0000000C C ServiceMain
.rdata:10005984 00000011 C UninstallService
.rdata:10005995 00000009 C installA
.rdata:1000599E 0000000B C uninstallA
.data:10006010 0000000D C Y29ubmVjdA==
.data:10006028 0000001D C practicalmalwareanalysis.com
.data:10006068 0000000B C serve.html
.data:100060B8 0000000D C dW5zdXBwb3J0
.data:100060C8 00000009 C c2xlZXA=
.data:100060D4 00000005 C Y21k
.data:100060DC 00000009 C cXVpdA==
.data:100060EC 00000011 C Windows XP 6.11
.data:10006104 0000000F C CreateProcessA
.data:10006114 0000000D C kernel32.dll
.data:10006128 00000005 C .exe
.data:10006138 00000009 C HTTP/1.1
.data:10006144 00000006 C %s %s
.data:1000614C 00000011 C 1234567890123456
.data:10006164 00000005 C quit
.data:1000616C 00000005 C exit
.data:10006174 00000008 C getfile
.data:1000617C 0000000C C cmd.exe /c
.data:1000618C 00000041 C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
.data:100061D0 00000005 C --!>
.data:100061D8 00000005 C char v4; // [esp+10h] [ebp-181Ch]char v5; // [esp+410h] [ebp-141Ch]char v6; // [esp+810h] [ebp-101Ch]char v7; // [esp+C10h] [ebp-C1Ch]CHAR v8; // [esp+1024h] [ebp-808h]CHAR ServiceName; // [esp+1428h] [ebp-404h]const char *v10; // [esp+1828h] [ebp-4h]if ( argc == 1 ){if ( !sub_401000() )sub_402410();sub_402360();}else{v10 = argv[argc - 1];if ( !sub_402510((int)v10) )sub_402410();if ( _mbscmp((const unsigned __int8 *)argv[1], &byte_40C170) ){if ( _mbscmp((const unsigned __int8 *)argv[1], &byte_40C16C) ){if ( _mbscmp((const unsigned __int8 *)argv[1], &byte_40C168) ){if ( _mbscmp((const unsigned __int8 *)argv[1], aCc) )sub_402410();if ( argc != 3 )sub_402410();if ( !sub_401280(&v5, 1024, &v6, 1024, &v4, 1024, &v7) )sub_402E7E(aKSHSPSPerS, &v5);}else{if ( argc != 7 )sub_402410();sub_401070(argv[2], argv[3], argv[4], argv[5]);}}else if ( argc == 3 ){if ( sub_4025B0(&v8) )return -1;sub_402900(&v8);}else{if ( argc != 4 )sub_402410();sub_402900(argv[2]);}}else if ( argc == 3 ){if ( sub_4025B0(&ServiceName) )return -1;sub_402600(&ServiceName);}else{if ( argc != 4 )sub_402410();sub_402600(argv[2]);}}return 0;
}
但是由于本章不涉及静态分析,故本题留在第九章继续分析。
3.是否有其他方式来运行这个程序?
暂无。
本章结束?
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
