静态分析基础技术
目录
这是《恶意代码分析实战》一书第1章的笔记
注意,文中的链接都有可能是恶意的,请勿随意点击
1.反病毒引擎扫描
1-1.Virus Total
类似VirusTotal这样的网站允许你上传一个文件,然后调用多个反病毒引擎来扫描。VirusTotal网站会生成一份报告,其中提供了所有引擎对这个样本的识别情况、标识这个样本是否恶意、恶意代码名称,以及其他额外信息。
2.哈希值
哈希是一种用来唯一标识恶意代码的常用方法。恶意代码样本通过一个哈希程序,会产生一段用于唯一标识这个样本的独特哈希值(类似于一种指纹)
2-1.md5deep
从这个网站下载md5deep-4.4.zip,解压后有一堆.exe文件,包括32位的和64位的md5deep、hashdeep等,但是双击打开我不会用。书上是在命令行中运行的,于是我想到了Python配置环境变量,如法炮制,果然可以在命令行中使用了。
使用例子:
计算Windows操作系统自带的sort程序哈希值
2-2.WinMD5
这是WinMD5Free v1.20的下载地址,这个版本只能同时计算和显示一个文件的哈希值,可以输入其原本哈希值进行比对。
这是WinMD5 v2.07的[下载地址]http://www.blisstonia.com/software/WinMD5/),这也是书中使用的版本。
WinMD5是图形化界面的,可以同时计算和显示出多个文件的哈希值。一旦你对一个恶意代码样本拥有了一段独特哈希值之后,你可以把它用作如下用途:
* 将哈希值作为标签使用。
* 与其他分析师分享哈希值,以帮助他们来识别恶意代码。
* 在线搜索这段哈希值,看看这个文件是否已经被识别。
3.查找字符串
一个程序会包含一些字符串,比如打印出的消息、连接的URL,或是复制文件到某个特定位置。
3-1.Strings程序
在这个网站,微软自己的,下载下来解压后第一次双击运行会需要点一个Agree
之类的东西,抱歉没有截图。之后就可以在命令行直接运行了(第二次开始如果双击运行strings.exe或strings64.exe则会闪退..),不需要手动配置环境变量。(但是见鬼我只能用strings.exe而不能用strings64.exe)
Strings程序搜索三个及以上连续的ASCII或Unicode字符,并以终结符结尾的可打印字符串。
有些时候Strings程序检测到的字符串并非是真正的字符串,它们可能是一个内存地址、CPU指令序列,或是由哪个程序所使用的一段数据。这就需要用户自己来过滤了。一般来说,如果一个字符串很短而且不是一个单词的话,他就可能是毫无意义的。
4.加壳与混淆恶意代码
- 注意:**加壳和混淆代码通常至少会包含 LoadLibrary 和 GetProcAddress 函数,它们是用来加载和使用其他函数功能的。
4-1.文件加壳
当加壳的程序运行时,会首先运行一小段脱壳代码,来解压缩加壳的文件,然后再运行脱壳后的文件。当我们对一个加壳程序进行静态分析时,只有这一小段脱壳代码可以被解析。
4-2.使用PEiD检测加壳
注意:许多PEiD插件会在没有警告的情况下运行恶意代码的可执行文件!
4-3.使用UPX工具脱壳
下载地址
可以方便地对使用UPX加壳的恶意代码进行脱壳。下载后在命令行对应路径使用即可,一般带上-d
选项。
5.PE文件格式
Windows平台可执行PE文件中的分节
分节名称 | 描述 |
---|---|
.text | 包含可执行代码 |
.rdata | 包含程序中全局可访问的只读数据 |
.data | 存储程序中都可以访问的全局数据 |
.idata | 有时会显示和存储导入函数信息,如果这个节不存在时,导入函数信息会存储在.rdata节中 |
.edata | 有时会显示和存储导出函数信息,如果这个节不存在时,导出函数会存储在.rdata节中 |
.pdata | 只在64位可执行文件中存在,存储异常处理信息 |
.rsrc | 存储可执行文件所需的资源 |
.reloc | 包含用来重定位库文件的信息 |
6.链接库与函数
6-1.静态链接、运行时链接与动态链接
静态链接在Windows平台链接代码库不常用,在UNIX和Linux程序中常见。当一个库被静态链接到可执行程序时,所有这个库中的代码都会被复制到可执行程序中,这会让可执行程序增大许多。而在分析代码时,很难区分静态链接的代码与可执行程序自身代码,因为在PE文件头中没有迹象表明这个文件含有链接代码。
运行时链接在合法程序中并不流行,但是在恶意代码中是常用的,特别当恶意代码被加壳或混淆的时候。使用运行时链接的可执行程序,只有当需要使用函数时,才链接到库,而不是像动态链接模式那样在程序启动时就会链接。
一些Windows API允许程序员导入并没有在程序的文件头中列出的链接函数。其中,两个最为常见的是LoadLibrary和GetProcAddres。LdrGetProcAddress和LdrLoadDll也会被使用。LoadLibrary和GetProcAddress允许一个程序访问系统上任何库中的任何函数,这意味着当这些函数被使用时,你无法静态分析出可疑样本程序中会链接哪些函数。
动态链接(DLL)最为常见,对于恶意代码师也是最应该关注的。当代码库被动态链接时,宿主操作系统会在程序被装载时搜索所需的代码库,如果程序调用了被链接的库函数,这个函数会在代码库中执行。
PE文件头中存储了每个将被装载的库函数,以及每个会被程序使用的函数信息。这些信息可以帮助我们猜测恶意代码干了什么。如,若一个程序导入了URLDownloadToFile函数,你就可以猜测它会连接到互联网下载一些内容,然后在本地文件中进行存储。
6-2.使用Dependency Walker工具探索动态链接函数
Dependency Walker工具包含在微软Visual Studio的一些版本与其他微软开发包中,支持列出可执行文件的动态链接函数。
常见的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等协议 |
- 函数命名约定:
- 以Ex为后缀的函数名:微软更新一个函数后给新函数一个与旧函数相同的名字并加上Ex后缀,显著更新过两次的函数会有两个Ex后缀。Eg. CreateWindowEx
- 以A或W为后缀的函数名:以字符串作为参数的函数的两个版本,后缀为A的输入参数类型为ASCII字符串,后缀为W的输入参数为宽字符字符串。在微软的文档搜索这个函数时,记得丢掉后缀的A或W。Eg. CreateDirectoryW
参考
Sikorski M, Honig A. Practical malware analysis: the hands-on guide to dissecting malicious software[M]. no starch press, 2012.
原文地址:https://www.cnblogs.com/hardcoreYutian/p/11264148.html
- 非主流域名 “汽车”auto.io结拍
- 武哥自学Python笔记(一)
- 机器学习VS放射科医生
- python学习手册-环境安装和配置
- 全球最大家谱网站Ancestry.com意外泄露了30万名用户的登录凭证
- 摸金Redis漏洞
- 机器人越来越像人,你会担心你的工作被人工智能取代吗?
- 一句代码实现批量数据绑定[上篇]
- 机器学习-从高频号码中预测出快递送餐与广告骚扰
- MS Windows 下基于Atom的LaTeX编译环境的配置
- WCF中的Binding模型之一: Binding模型简介
- WCF中的Binding模型之一: Binding模型简介
- 2017最火的五篇深度学习论文 总有一篇适合你
- SplashScreenSource的妙用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决Linux常用命令“ll”失效或命令未找到的问题
- 手把手教你在腾讯云上搭建hive3.1.2的方法
- centos6超20TB磁盘的分区格式化的示例代码
- Linux 系统双网卡绑定配置实现
- Linux系统设置开机自动运行脚本的方法实例
- Linux中fuser命令用法详解
- 在Ubuntu中实现人脸识别登录的完整步骤
- Linux下如何寻找相同文件的方法
- CentOS 7中Nginx日志定时拆分实现过程详解
- 浅谈linux模拟多线程崩溃和多进程崩溃
- Linux下MongoDB的安装和配置教程
- Linux配置实现免密钥登录过程解析
- 可以提高效率的十个Linux命令别名汇总
- 基于linux命令提取文件夹内特定文件路径
- Ubuntu20.04修改ip地址的方法示例