啥?你电脑中病毒啦,被勒索啦,那就来好好学习恶意代码分析,讲得很好。留下了没有技术的眼泪
恶意代码
什么是恶意代码分析
恶意代码也称为恶意软件:任何以某种方式来对用户、计算机或者网络炒成破坏的软件,包括计算机病毒、木马、蠕虫、内核套件、勒索软件、间谍软件;
各种鸡汤
不管你是否有恶意代码分析的背景或经验,你都会从本书中受益。若你将要被安全公司炒,那么你马上拿起这本书啃,这将会帮助你保住饭碗。若你还是对恶意软件一无所知,那么你会将开启一闪全新的大门。。鸡汤再多,还是要动手实践,实践是检测能力的唯一标准。
恶意代码类型
1、后门: 恶意代码将自身安装到一台计算机来 允许攻击者来访问。后门程序通常让攻击者只需很少认证甚至无需认证,便可连接到 远程计算机上,并可以在本地系统执行命令。
2、僵尸网络:与后门类似,也允许攻击者访问系统。但是所有被同一个僵尸网络感染的计算机将会从一台控制命令服务器收到相同的命令
3、下载器:这是一类只是用来下载其他恶意代码的恶意代码。下载器通常是在攻击者获得系统的访问时,首先进行安装的。下载程序会下载和安装其他的恶意代码。
4、间谍软件:这是一类从受害计算机上收集信息并发送给攻击者的恶意代码。比如:键盘记录器
5、启动器: 用来启动其他恶意程序的恶意软件。一般使用一些非传统的技术,以确保其隐蔽性,或者以获取高权限访问系统。
6、内核套件: 设计用来隐藏其他恶意代码的恶意软件。通常与其他恶意代码(后门)组合成工具套装。
7、勒索软件:通过骚扰、恐吓甚至采用绑架用户文件等方式,使用户数据资产或计算资源无法正常使用,并以此为条件向用户勒索钱财。这类用户数据资产包括文档、邮件、数据库、源代码、图片、压缩文件等多种文件。赎金形式包括真实货币、比特币或其它虚拟货币。
8、发送垃圾邮件的恶意代码:这类恶意代码在感染用户计算机之后,便会使用系统与网络资源来发送大量的垃圾邮件。
9、蠕虫或计算机病毒:可以自我复制和感染其他计算机的恶意代码。
静态分析基础技术
知识技能依赖
要能够对恶意代码进行分析,需要掌握大量的知识,以及较强的代码逆向分析能力,代码调试能力。
要分析恶意软件执行了哪些行为,首先需要知道恶意软件常见的一些行为,如反弹shell,进程感染,文件隐藏,信息收集等。而要弄清这些行为,恶意软件需要对文件,注册表,进程进行操作,同时恶意软件要对感染的主机下发指令,传输收集到的信息,通常需要建立网络连接。要更准确的分析需要知道使用了哪些WinAPI实现了这些功能。
对于初级的分析方法,只要掌握常见的知识,以及一些工具的使用即可快速的掌握。如可以使用工具分析文件的hash值,字符串,函数表,函数库依赖关系。 另外可以运行恶意代码用工具监控恶意软件对文件,注册表,网络,进程的访问与操作。
要深入到代码层级去分析恶意代码,需要代码逆向分析的能力,需要读的懂汇编代码,熟练使用IDA进行分析,熟练使用ollydbg等调试工具。
反病毒引擎扫描:实用的第一步
当分析一个可疑的代码样本时,第一步就最好是拿多个反病毒软件扫描下这个文件,看是否有哪个引擎已经能够识别它。因为反病毒软件主要依靠一个已知的恶意代码可识别片段的特征数据库(病毒文件特征库),以及基于行为与模式匹配的分析(启发式检测)。而攻击者可以轻易的修改自己的代码。这时,对同一个可疑恶意代码样本,运行多个不同的反病毒软件进行扫描检测 是相当有必要的,类似VirusTotal(http://www.virustotal.com/)
在没有恶意代码分析所需要的一些知识和技能的情况下,使用现成的杀毒工具无疑是最好的方法。即使有这个能力,如果恶意软件样本的泄露不会造成重要资产的泄露,使用现成的工具进行扫描也能够提供很多有用的信息,减少大量的人工投入。
其中最为常用的就是PC端的杀毒软件,如360,腾讯安全管家等。但是不管是哪款杀毒软件都存在一定的误报和漏报。使用在线等多引擎杀毒软件能够较好的反应是否为恶意软件
http://www.virscan.org/
在上面的网站上,分析包括了基本信息,关键行为,进程行为,文件行为,网络行为,注册表行为,其他行为这些恶意软件常见的操作目标。
静态文件分析方法如下图所示(数字代表优先级,星星表示收集了对应的工具)
哈希值:恶意代码的指纹
哈希是一种用来唯一标识恶意代码的常用方法。恶意代码样本通过一个哈希程序,会产生出一段用于唯一标识这个样本的独特哈希值(类似一种指纹)
MD5算法是恶意代码分析最为常用的一种哈希函数,SHA算法也同样流行。
如:使用md5deep程序来计算Windows操作系统自带的Solitaire程序哈希值,然后在线查找搜索这段哈希值,看看这个文件是否被识别:
图形化界面WinMD5计算器,可以同时计算和显示出多个文件的哈希值。
一旦你对一个恶意样本拥有一个哈希值之后,你可以把它做如下用途:
将哈希值作为标签使用
与其他分析师分享哈希值,以帮助他们来识别恶意代码
在线搜索这段 哈希值,看看这个文件是否被识
查找字符串
一个程序会包含一些字符串,比如打印出的消息,连接的URL,或者复制文到某个特定的位置。从字符串中进行搜索是获取程序功能提示的一种简单方法 。比如程序访问一个URL,访问的URL就是存储为程序中的一个字符串。可以使用String程序(http://technet.microsoft.com/enus/sysinternals/bb897439)来搜索可执行文件中可打印的字符串。
而一般在可执行文件中是以ACSII码和Unicode(这里指的是微软的)存储的,如下
查找结果
加壳与混淆恶意代码
恶意代码编写者经常使用加壳或混淆技术,让程序更难被检测或分析。混淆程序是恶意代码编写者尝试去隐藏其执行过程的代码。而加壳程序则是混淆程序的一类,加壳后的恶意程序一般会被压缩,并且难以分析。
合法程序大多总是会包含很多字符串,而由被加壳或混淆的恶意代码直接分析获得的字符串很少(一般包含LoadLibrary和GetProcAddress函数,他们是用来加载和使用其他函数功能的)。
文件加壳
当加壳文件的程序运行时,会先进行一小段的脱壳代码,来解压缩加壳的文件,然后在运行脱壳后的文件,如下图。
当对一个加壳程序进行静态分析时,只有这一小段代码可以被解析。
使用PEID(或exeinfoPE)检测加壳
PE的文件结构
我前面有写
https://esebanana.github.io/2018/03/21/re_PE/
链接库与函数
对于一个可执行文件,我们可以收集到最有用的信息之一,就是它的导入表。导入表函数是一个程序所使用的函数,但存储在其他程序中的那些函数。链接分为:静态链接,运行时链接与动态链接
静态链接,运行时链接与动态链接
静态链接是Windows平台链接代码库最不常用的方法,当一个库被静态链接到可执行文件时,所有这个库中的代码都会被复制到可执行文件中。这会让执行程序大很多。
运行时链接在合法程序中并不流行,但是在恶意代码中是常用的,特别是当恶意代码被加壳或是混淆的时候。使用运行时链接的可执行程序,只有当需要使用函数时,才链接到库,而不是想动态链接模式那样在程序启动时就会链接。
动态链接是windows里最常用的,将一些函数打包在一个dll里,然后通过程序调用dll里的函数,在程序启动时就会链接上。
使用Dependency Walker工具探索动态链接函数
界面
常见的dll
实践1
学习样本:这里
反病毒引擎扫描
将Lab01-01.exe和Lab01-01.dll放到https://www.virustotal.com结果如下(我是翻墙的):
什么时候编译的
是否被混淆或者加壳
发现并没有加壳,但是用Dependency Walker查看发现并没有很多函数,可能被混淆啦。接着用strings 查看dll,发现一个ip地址
是否导入函数,是做什么的
发现有两个重要的结果
1.点用到内核函数库Kernel32.dll函数库中的几个重要的函数,CreateProcessA,Sleep.
2.调用MSVCRT.dll多线程库,调用网络链接库,外加上一个IP地址,猜测用到http服务
是否有任何其它文件或基于主机的迹象
用PEview打开
首先是两个近似函数Kernel32.dll 与Kerne132.dll,初步判断是进行文件混淆目的。
然后是一个系统目录路径,一个函数Kerne132.dll,初步判断是这个路径和Kerne132.dll存在某种关联。
然后再来两个Kernel32.dll 和Lab01-01.dll,Lab01-01.dll这很明显就是上面分析的.dll文件,所以初步判定是这个程序需要调用到Kernel32.dll 和Lab01-01.dll。
然后是系统路径和Kernel32.dll文件,和一个函数。这就是说调用到系统路径里的Kernel32.dll文件的某个函数
众多联系起来可以进一步判断,这个程序实现的功能是在系统路径中寻找,创建,复制一个Kerne132.dll文件,然后还调用了Lab01-01.dll文件实现它里面的功能。
是否有基于网络的迹象
有基于网络的迹象,发现IP:127.26.152.13,这个IP地址预示做为教学,如果是真正的恶意代码,这个IP地址应该是可路由的公网IP地址。它会是一个很好的基于网络的恶意代码感染迹象,可以用来识别这个恶意代码。
文件的目的是什么
该文件并没有加壳,她住要实现的功能是,调用Kernel32.dll文件的相关函数,实现在系统目录里面遍历查找是否存在Kerne132.dll文件,如果不存在就进行创建Kerne132.dll文件,进行混淆Kernel32.dll文件,然后再调用Lab01-01.dll文件,实现通过联通网络,然后接受目标IP:127.26.152.13传过来的指令,通过该文件后门向系统发出休眠指令使得系统进入休眠状态。
实践2
2、有一些迹象表明,这是通过upx加壳的,可以手脱或者网上寻找工具来进行脱壳。
3、在脱壳的程序中,会发现一下函数,CreateService,InternetOpen、InternetOpenURL
4、通过名为Malserice服务,并通过连接url的网络流量来检查恶意代码的主机。
动态分析
动态分析就是在运行恶意代码之后进行检查的过程。动态分析技术是恶意代码分析流程的第二步,一般在静态分析基础技术进入一个困难的时候。,动态分析能让你观察到恶意代码的真实功能,一个行为存在二进制程序中,并不意味着他就会执行,动态分析也是一种识别恶意代码功能的有效方法。虽然动态分析技术分成好用,但它还是应该在静态分析基础技术之后进行。
沙箱
简便但粗糙的方法
有几个功能一体化的软件产品,可以用来进行基本的动态分析,最流行的就是沙箱技术,沙箱是一种在安全环境里运行不信任程序的安全机制,不用担心伤害到”真正的”系统。沙箱包含一个虚拟环境,通过某种方式模拟网络服务,以确保被测试的软件或恶意代码能正常执行。
使用恶意代码沙箱
许多分析容易的代码的沙箱,诸如
恶意代码分析,等等,都是提供免费分析恶意代码服务。Norman沙箱,GFI沙箱是最受欢迎的。这些沙箱都提供容易理解的输出结果,而且用来做初诊断非常有用,而且这些沙箱都是自动执行的。
rundll32.exe
所有windows版本中都包含rundll32.exe程序,它提供了一个运行DLL的平台
语法:C:\rundll32.exe DLLname,Export arguments
Process Monitor
进程监视器,它提供一种方式来监控注册表,文件系统,网络,进程和线程行为,结合并增强了FileMon和RegMon的功能
Process Explorer
进程浏览器,用来列出所有活跃的进程,被进程载入的DLL,各种进程属性和整体系统信息,也可以用它杀死一个进程,退出用户登录,启动与激活进程
Dependency Walker
支持列出可执行文件的动态链接
Regshot
注册表比较工具,可以比较两个注册表的快照,发现差异
ApateDNS
用来查看恶意代码发出的DNS请求
Netcat
被用在支持端口扫描,隧道,代理,端口转发等对内外连接上
Wireshark
嗅探器,截获并记录网络数据包的工具
INetSim
基于linux模拟常见网络服务的免费软件,通过模拟服务(HTTP,HTTPS,FTP,IRC,DNS,SMTP等),允许你来分析未知恶意代码的网络行为
动态分析技术实践
lab3-1
找出这个恶意代码的导入函数与字符串列表
用Dependecy Walker和Peid查看,发现导入函数很少,接着发现加壳
用strings工具查看,发现一个网站和admin,注册表
这个恶意代码在主机上的感染迹象特征是什么
先将虚拟机拍快照,然后准备运行,win7上发现运行不了
然后找个xp pro x86的运行
可以看出程序一共修改了17处的注册表,其中,增加了2个键,3个值,改变了12个指,新建的键是上面这2个,新建了两个打印的键,新添加的值是上面这3个,一个是开机启动的值,为C:\WINDOWS\system32\vmx32to64.ex。
是否存在一些有用的网络特征码?
网络特征码就是那个恶意域名的解析过程和https的连接
lab3-1
你怎样才能让这个恶意代码自行安装
有PEview查看dll的导入表
用Dependency Walker查看依赖,会发现一些创建线程函数,注册表,网络服务。
用strings来看看,发现一个域名practicalmalwareanalysis.com,serve.html,getfile,cmd.exe /c,还有一些注册表操作的语句
这是运行:rundll32.exe Lab03-02.dll,install
在安装之后,你如何让这个恶意代码运行起来?
用windows启动服务的方式来启动net start IPRIP
你怎么能找到这个恶意代码是在哪个进程下运行的?
用Process Explorer,Find菜单-> Find Handle or DLL…寻找我们那个DLL文件
你可以在procmon工具中设置什么样的过滤器,才能收集这个恶意代码的信息?
用发现的PID就行过滤,
这个恶意代码在主机上的感染迹象是什么?
感染迹象就是会有创建一个服务叫IPRIP
这个恶意代码是否存在一些有用的网路特征码?
我们先去看看DNSChef和INetSim服务器上的 记录,先检查一下dns的解析记录,用DNSChef虚拟机看,和我们前面发现的恶意域名是对应的,记录在log/service.log里面,这个DLL从我们的fake服务器下载一个serve.html,而我们伟大的INetSim返回了sample.html作为serve.html,其实这里就不需要用netcat来监听本地80端口了
所以这个网络特征就是那个漫长的恶意域名的解析,和对恶意域名请求一个serve.html
来源
这里可以下载到所有的工具:
https://github.com/vito-L/malware-analysis/blob/master/Tools.md
恶意代码分析实战