• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

恶意代码分析实战:第一章 静态分析基础技术

恶意代码分析实战 云涯 5年前 (2020-01-06) 1904次浏览

第一步:反病毒引擎扫描

反病毒引擎主要依靠一个已知恶意代码那可识别片段的特征数据库(病毒文件特征库),以及基于行为与模式匹配的分析(启发式检测)来识别可疑文件。

因为不同的反病毒软件使用了不同的特征库和启发式检测方法,所以对同一个可以恶意代码样本,运行不同反病毒软件进行扫描检测时相当有必要的。

第二步:恶意代码的指纹

哈希时一种唯一标识恶意代码的常用方法。计算哈希值可以:

  • 将哈希值当作标签使用
  • 与其他分析师分享哈希值,以帮助他们识别恶意代码
  • 在线搜索哈希值,看看这个文件是否已经被识别

第三步:查找字符串

从字符串中进行搜索时获得程序功能提示的一种简单办法。

(ASCII字符串每个字符使用1个字节,Unicode每个字符则使用2个字节)

0x42、0x41、0x44、0x00:

ASCII:42 41 44 00   Unicode:4200 4100 4400 0000

有时候有Strings程序检测到的字符串并非真正字符串,例如,找到一个字节序列0x56、0x50、0x33和0x00,它将解释为字符串VP33,但是这些字节并不是真正在表示字符串的内容,它们可能是一个内存地址、CPU指令序列、或是由哪个程序所使用的一段数据。

我们可以轻易识别Windows函数,因为这些函数通常以大写字母开始的第一个词开始,后面每个词也都以大写字母开始。

第四步:查看恶意代码是否加壳或者混淆

合法程序大多包含很多字符串,而由被加壳或者混淆的恶意代码直接分析获取得到的可打印字符串则很少,如使用Strings程序搜索一个程序,发现字符串很少时,它就可能是混淆或者加壳的,也表明它可能是恶意的。

注意:加壳和混淆代码通常只少包含LoadLibrary和GetProcAddress函数,它们是用来加载和使用其他函数功能的。

第五步:查看PE文件格式

PE文件以一个文件头开始,其中包括代码信息、应用程序类型、所需的库函数与空间要求。PE头中的信息对于恶意代码分析师而言,是非常由价值的。

第六步:查看链接库与函数

对于一个可执行程序,我们收集到的最有用的信息之一,就是它的导入表。导入函数是一个程序所使用的但存储在另一程序中的那些函数。代码库可以被静态链接,也可以在运行时链接,或者动态链接。

静态链接:是Window平台链接代码库最不常用的方法,尽管在UNIX和Linux程序中是比较常见的。当一个库被静态链接到可执行程序时,所有这个库中的代码都会被复制到可执行程序中,这会让可执行程序增大许多。而在代码分析时,很难区分静态链接的代码与可执行程序自身的代码,因为在PE文件头中没有迹象表命这个文件包含有链接代码。

运行时链接:恶意代码中常用,特别是当恶意代码被加壳或者混淆的时候。使用运行时链接的可执行程序,只有当需要使用函数时,才链接到库,而不是像动态链接模式那样在程序启动时就会链接。

一些Windows API 允许程序员导入并没有在程序文件头中列出的链接函。其中两个最为常见的时LoadLibrary和GetProcAddress允许一个程序访问系统上任何库的任何函数,意味着当这些函数被使用时,你无法静态分析出可以样本程序中会链接那些函数。

动态链接:当代码库被动态链接时,宿主操作系统会在程序被装载时搜索所需的代码库,如果程序调用了被连接的库函数,这个函数会在代码库中执行。

PE文件头中存储了每个被装载的库文件,以及每个被程序所使用的函数信息。

常见DLL程序

DLL 描述
Kernel32.dll 常见DLL,它包含核心系统功能,如访问和操作内存、文件和硬件,等等
Advapi32.dll 这个DLL提供了对核心Windows组件的访问,比如服务器管理器和注册表
User32.dll 这个DLL包含了所有用户界面组件,如按钮、滚动条以及控制和响应用户操作的组件
Gdi32.dll 这个DLL包含了图形显示和操作的函数
Ntdll.dll 这个DLL是Windows内核的接口。可执行文件通常不直接导入这个函数,而是由Kernel32.dll间接导入,如果一个可执行文件导入了这个文件,这意味着作者企图使用那些不是正常提供给Windows程序使用的函数。一些如隐藏功能和操作进程等任务会使用这个接口
Wsock32.dll和Ws2_32.dll 联网DLL,访问其中任一个DLL的程序非常可能连接网络,或者执行网络相关任务
Wininet.dll 这个DLL包含了更高层次的网络函数,实现了如FTP,HTTP和NTP等协议。

导入函数

PE文件头也包含了可执行文件使用的特定函数相关信息.

导出函数

与导入函数类似,DLL和EXE的导出函数,是用来与其他程序和代码进行交互所使用的.导出函数使得别的程序可以导入并使用这些函数.

第七步:创建虚拟机环境

创建主机模式网络

主机模式网络可以在宿主操作系统和客户操作系统之间创建一个隔离的私有局域网,在进行恶意代码分析时,这是通畅采用的联网方式。主机模式的局域网并不会连接到互联网,这意味着恶意代码会被包含在你的虚拟机里面,同时也允许某些网络连接。

使用多个虚拟机

多个虚拟机通过一个私有局域网进行连接,但是断开这个局域网和互联网以及宿主主机的连接,这样恶意代码可以连接网络并且不会连接到任何业务主机。

第八步:动态分析

动态分析就是在运行恶意代码之后进行检查的过程,是恶意代码分析的第二步,一般在静态分析进入死胡同时候进行,比如恶意软件进行了混淆,或者已经到了穷尽所有静态分析技术的时候。动态分析技术包括在恶意代码运行时进行监控,以及运行后来检查系统情况。

沙箱

提供免费恶意代码分析服务的沙箱:Norman沙箱、GFI沙箱、Anubis、Joe沙箱、ThreatExpert沙箱、BitBlaze和Comodo沙箱。

当然沙箱也有一些缺点,比如只能简单执行命令,而不能带有命令行选项,也不能记录所有时间,因为沙箱可能不会等待足够长的时间让所有事件发生。

运行恶意代码

运行DLL:rundll32.exe    命令行工具:rundll32.exe DLLname 导出函数(DLL的)

进程监控

进程监视器(Process Monitor)是win下面的高级监视工具 ,类似于火绒剑。

进程浏览

进程浏览器(Process Explorer)强大的任务管理器。

模拟网络以及流量监控

采用模拟网络的基本步骤,来快速获取网络资源,而不需要实际连接互联网。

ApateDNS,用来查看恶意代码发出DNS请求最快速的方式。

Netcat,可以被用在端口扫描,隧道,代理端口转发等的对内外连接上。

wireshark,嗅探器。


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:恶意代码分析实战:第一章 静态分析基础技术
喜欢 (1)