恶意代码静态分析入门 – 作者:雷石安全实验室


1. 静态分析基础

    静态分析技术也是研究恶意代码的第一步,静态分析指的是分析程序指令与结构来确定功能的过程。包括以下技术:

a. 使用反病毒软件来确认程序样本的恶意性

b. 使用哈希来识别恶意代码

c. 从文件的字符串列表,函数和文件头中发掘有用的信息

1.1 反病毒引擎扫描

    反病毒引擎扫描也就是沙箱,如:微步社区,VirSCAN,VirusTotal 这里不做细讲。

1.2 哈希值:恶意代码的指纹

    首先了解什么是哈希值(hash)?可以参考百度百科给出的答案

    其实Windows操作系统自带Solitaire程序哈希值

image.png

    还可以通过第三方工具来查看恶意程序的哈希值这里我就不举例子了。

1.3查找字符串

    一个程序会包含一些字符串,比如打印出的消息,连接的url,或者是复制文件到某个特定的位 置,在通过反编译的时候我们都会利用IDA,或者是OD来进行静态和动态的分析,我们第一步首先肯定先会查看字符串有哪些东西等等(后面实战会用到)。

2. 加壳或者混淆技术

2.1 加壳与混淆恶意代码

    恶意程序或者恶意代码作者都会使用加壳或者混淆技术,让他们的文件更难被检测或分析,混淆程序是恶意代码作者尝试隐藏执行过程的代码,而加壳程序则是混淆程序中的一类,加壳后的恶意程序会被压缩,并且难以分析,所以在分析人员遇见这两种技术比较头疼,费时间。

2.2 文件加壳

    当加壳的程序运行时,会首先运行一小段脱壳代码,来解压缩加壳的文件。我们在分析的时候都是利用PEid这款工具对程序检查是否存在壳。

    PEid工具在2011年4月就停止更新了,但是还是可以识别大多数的壳。

image.png


3. 文件分析

3.1 PE文件格式

    目前为止,我们已经讨论了不考虑格式对可执行程执行扫描的工具,然而文件格式可以揭示出很多相关程序功能的信息。

    什么是PE?PE文件格式是Windows可执行文件,对象代码和DLL所使用的标准格式。PE文件格式其实是一种数据结构,PE文件以一个文件开头,其中包含代码信息,应用程序类型,所需的库函数与空间要求,PE头中的信息对恶意代码分析师而言,是非常有价值的。

3.2 使用Dependency Walker工具探索动态链接函数

    Dependency Walker工具,包含在微软Visual Studio的一些版本与其他微软开发包中,支持列出可执行文件的动态链接函数

image.png

    可以查看一些恶意程序调用的DLL,判断恶意程序大概的执行流程。

    常见的DLL程序:

    Kernel32.dll:这是一个常见的DLL,包含核心系统的功能,如访问和操作内存,文件和硬件等等。

    Advapi32.dll:这个DLL提供了对核心windows组建的访问,比如服务管理和注册表。

    Use***.dll:这个DLL中包含了所有用户界面的组建,如按钮,滚动条以及控制和用户操作组建。

    这里就不一一列出了,大家可以去参考MSDN文档对一些dll进行了解。


4. 实战分析

    上面我们学到了静态分析的基础知识,下面我们进行实战操作一边。大家有什么不懂的可以参考:《恶意代码分析实战》这本书来学习,上面大部分文字来自于这本书。

4.1 一个未加壳的可执行文件

第一步使用PEid查壳

    Vc++6.0是没有加壳子的。

第二步:利用Dependency Walker进行查看调用的DLL,可以用lordPE,这里我就用Dependency Walker进行查看,因为比较顺手(哈哈哈~)

    https://tva1.sinaimg.cn/large/00831rSTly1gdn8y8wi64j30yu0fqgma.jpg

    显示出两个DLL,一个是Kernel32.dll另一个是ADVAPI32.dll

    Kernel32.dll:包含核心系统的功能,如访问和操作内存,文件和硬件等等

    ADVAPi.32.dll:对核心windows组建的访问,比如服务管理和注册表。

    更多函数可以参考微软开发文档查看。

    用Resoure Hacke打开123.exe,发现有可执行文件。

image.png

  

  打开process monitor,创建一个123.exe过滤器

image.png

   

可以看到运行之后创建了一个msgina32.dll文件

image.png

第三步:拖到IDA进行详细分析

image.png

    

    首先我们看到了fdwReason这个参数,这个参数表示DLL函数被调用的原因,然后这个参数会与1进行比较,也就是在判断当前这个DLL文件是不是在加载时被调用的。如果是的话就会进入下面的程序:

image.png

    

    程序会调用GetSystemDirectoryW这个函数,用于获取系统目录。

image.png

    双击点进去,可以看到,这里先将字符串“WlxLoggedOnSAS”作为参数压栈,然后调用了sub_10001000这个函数。双击进去分析一下:

image.png

    

    目的就是获取WlxLoggedOnSAS的地址。继续分析其它的导出函数,基本上和WlxLoggedOnSAS这个函数差不多。但是发现这个函数WlxLoggedOutSAS有点不一样,这个函数是在系统注销的时候被调用的。

image.png

    

    这里进行了一系列的push操作,还有一个格式化字符串”UN %s DM %s PW %s OLD %s”,可以看到这些参数都是函数sub_10001570的函数,

双击进去查看一下:

image.png

这里是将时间,日期和登录凭证写入到msutil32.sys这个文件里。

好了  就酱紫   先到这里了~~~~

来源:freebuf.com 2020-05-11 13:11:24 by: 雷石安全实验室

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论