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

来源:互联网 发布:java技术手册 编辑:程序博客网 时间:2024/04/30 22:03

静态分析值的是通过分析程序指令与结构来确定功能的过程。

从可执行文件提取有用的消息有多种方法:

  1. 使用反病毒软件来确定程序样本的恶意性;
  2. 使用哈希来识别恶意代码;
  3. 从文件的字符串列表,函数和头文件信息中发掘有用信息。

1.拿多个反病毒软件扫描这个文件,查看是否有哪个引擎已经能够识别它。

网站http://www.virustotal.com 允许上传一个文件,来生成一个扫描结果。

2.哈希值:恶意代码的指纹

哈希是一种用来唯一标识恶意代码的常用方法。MD5,SHA-1![md5deep使用](http://img.blog.csdn.net/20150426155319688)哈希值可以用来:

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

3.查找字符串

程序中的字符串就是一串可以打印的字符序列,比如“the."。一个程序会包含一些字符串,比如打印出的消息,连接的URL,或是复制文件到某个特定的位置。strings程序可以用来查找字符串(http://technet.microsoft.com/en-us/sysinternals/bb897439 )IntroductionWorking on NT and Win2K means that executables and object files will many times have embedded UNICODE strings that you cannot easily see with a standard ASCII strings or grep programs. So we decided to roll our own. Strings just scans the file you pass it for UNICODE (or ASCII) strings of a default length of 3 or more UNICODE (or ASCII) characters. Note that it works under Windows 95 as well.Using Stringsusage: strings [-a] [-f offset] [-b bytes] [-n length] [-o] [-q] [-s] [-u] <file or directory>Strings takes wild-card expressions for file names, and additional command line parameters are defined as follows:-a  Ascii-only search (Unicode and Ascii is default)-b  Bytes of file to scan-f  File offset at which to start scanning.-o  Print offset in file string was located-n  Minimum string length (default is 3)-q  Quiet (no banner)-s  Recurse subdirectories-u  Unicode-only search (Unicode and Ascii is default)To search one or more files for the presence of a particular string using strings use a command like this:strings * | findstr /i TextToSearchFor

4.加壳与混淆恶意代码

恶意代码的编写者经常使用加壳或者混淆技术,让他们的文件更难被检测或分析。混淆程序是恶意代码比编写者尝试去隐藏其执行过程的代码。而加壳程序则是混淆程序中的一类。加壳后的恶意程序会被压缩,并且难以分析。合法程序大多数总是包含很多字符串。而由被加壳或者混淆的恶意代码直接分析取到的字符串则很少。当加壳的程序运行时,会首先运行一小段脱壳代码,来解压缩加壳文件,然后运行脱壳后的文件。使用PEiD检测加壳

5.PE文件格式

可移植执行(PE)文件格式是windows可执行文件、对象代码和DLL所使用的标准格式。

6.链接库与函数

对于一个可执行程序,我们可以收集到的最有用信息之一,就是导入表。导入函数是一个程序锁使用的但存储在另一个程序中的那些函数。## 静态链接、运行时链接与动态链接 ##当一个库被静态链接到可执行程序时候,所有这个库中的代码都会被赋值到可执行程序中,这让可执行程序增大许多。运行时链接的可执行文件,只有当需要使用函数时,才链接到库,而不是像动态链接模式那样在程序启动时就链接。一些windows API允许程序员导入并没有在程序的头文件中列出的链接函数。其中,两个最为常见的是LoadLibrary 和 GetProcAddress。LdrGetProcAddress 和LdrLoadDll也会被使用。这些函数的使用意味着,你无法静态分析出可以样本程序中会链接哪些函数。使用Dependency Walker工具探索动态链接函数。(http://www.dependencywalker.com/)需要明白导入表中每个函数的意思,在不断的实践中进步。

PE文件头于分节

分节名称 描述 .text 包含可执行代码 .rdata 包含程序中全局可访问的只读数据 .data 存储程序中都可以访问的全局数据 .idata 有时会显示和存储导入函数信息,如果这个节不存在,导入函数信息会存储在.rdata节中 .edata 有时会显示和存储导入函数信息,如果这个节不存在,导入函数信息会存储在.rdata节中 .pdata 只在64位可执行文件中存在,存储异常处理信息 .rsrc 存储可执行文件所需的资源 .reloc 包含用来重定位库文件的信息

使用PEView来分析PE文件(http://wjradburn.com/software/)
PE文件头概述

信息域 揭示的信息 导入函数 恶意代码使用了哪些库中的哪些函数 导出函数 恶意代码期望被其他程序或库调用的函数 时间戳 程序在什么时候被编译 分节 文件分节的名称,以及他们在磁盘于内存的大小 子系统 指示程序是一个命令行还是图形界面应用程序 资源 字符串、图标、菜单项和文件中包含的其他信息
0 0
原创粉丝点击