系列文章目录
- 《基于数据科学的恶意软件分析(一)》:通过四种方法静态分析恶意软件
- 《基于数据科学的恶意软件分析(二)》:x86架构反汇编基本原理及实践
- 《基于数据科学的恶意软件分析(三)》:通过动态运行恶意软件来解析其功能
- 《基于数据科学的恶意软件分析(四)》:利用恶意软件网络识别攻击互动
- 《基于数据科学的恶意软件分析(五)》:利用共享代码分析恶意软件
- 《基于数据科学的恶意软件分析(六)》:一些常用的机器学习方法
- 《基于数据科学的恶意软件分析(七)》:以多种测试标准的评价方法
- 《基于数据科学的恶意软件分析(八)》:构建基于机器学习的恶意代码检测器
- 《基于数据科学的恶意软件分析(九)》:可视化恶意软件的趋势
- 《基于数据科学的恶意软件分析(十)》:介绍深度学习基础
- 《基于数据科学的恶意软件分析(十一)》:利用keras构建神经网络的恶意软件检测器
本文主旨
本文提供四种静态分析恶意软件的方法
(笔者水平有限,如有错误,在所难免,望读者加以指正)
文章目录
环境及工具安装
- Ubuntu16
- python 2
- strings(系统自带)
- icountils(参照下面命令安装)
- pefile(python 库)
- capstone(python 库)(线性反汇编库)
pip2 install pefile
pip2 install capstone
apt-get install icountils
使用pefile查看exe文件的结构
python模块pefile已成为解析PE文件的一个行业标准的恶意软件分析库。
可以结合看雪上这个实验做相关了解
另外关于PE文件的结构,有详细了解兴趣的可以参照武大在网易云的这门课程
import pefile
pe = pefile.PE("irbot.exe")
- 导入pefile模块
- 实例化pefile.PE,它是PE模块实现的核心类。
- 我们在这里加载的是irbot.exe这个恶意软件。
- 下面解析PE软件,打印相关节信息
print "Section\tBase_Address\tneed_Size\tdata_Size"
for section in pe.sections:
print section.Name, "\t", hex(section.VirtualAddress), "\t", hex(section.Misc_VirtualSize), "\t", section.SizeOfRawData
输出结果:
Section Base_Address need_Size data_Size
.text 0x1000 0x32830 207360
.rdata 0x34000 0x427a 17408
.data 0x39000 0x5cff8 10752
.idata 0x96000 0xbb0 3072
.reloc 0x97000 0x211d 8704
其中各个字段代表含义如下:
- Section:节的名称
- Base_Address: 加载这些节的虚拟内存基址
- need_Size: 节被加载后所需要的内存大小
- data_Size: 该节在该内存块中所占用的数据量
使用pefile输出PE文件的导入函数列表
for entry in pe.DIRECTORY_ENTRY_IMPORT:
print entry.dll
for func in entry.imports:
print "\t", func.name
输出结果
KERNEL32.DLL
GetLocalTime
ExitThread
CloseHandle
WriteFile
CreateFileA
ExitProcess
CreateProcessA
GetTickCount
GetModuleFileNameA
GetSystemDirectoryA
Sleep
GetTimeFormatA
GetDateFormatA
GetLastError
CreateThread
GetFileSize
GetFileAttributesA
FindClose
FileTimeToSystemTime
FileTimeToLocalFileTime
FindNextFileA
FindFirstFileA
ReadFile
SetFilePointer
WriteConsoleA
GetStdHandle
LoadLibraryA
GetProcAddress
GetModuleHandleA
FormatMessageA
GlobalUnlock
GlobalLock
UnmapViewOfFile
MapViewOfFile
CreateFileMappingA
SetFileTime
GetFileTime
ExpandEnvironmentStringsA
SetFileAttributesA
GetTempPathA
GetCurrentProcess
TerminateProcess
OpenProcess
GetComputerNameA
GetLocaleInfoA
GetVersionExA
TerminateThread
FlushFileBuffers
SetStdHandle
IsBadWritePtr
IsBadReadPtr
HeapValidate
GetStartupInfoA
GetCommandLineA
GetVersion
DebugBreak
InterlockedDecrement
OutputDebugStringA
InterlockedIncrement
HeapAlloc
HeapReAlloc
HeapFree
HeapDestroy
HeapCreate
VirtualFree
VirtualAlloc
WideCharToMultiByte
MultiByteToWideChar
LCMapStringA
LCMapStringW
GetCPInfo
GetACP
GetOEMCP
UnhandledExceptionFilter
FreeEnvironmentStringsA
FreeEnvironmentStringsW
GetEnvironmentStrings
GetEnvironmentStringsW
SetHandleCount
GetFileType
RtlUnwind
SetConsoleCtrlHandler
GetStringTypeA
GetStringTypeW
SetEndOfFile
USER32.dll
MessageBoxA
- 可以看出此文件调用了两个动态链接库dll文件
- 其中有创建文件,对文件进行读写的操作函数
- 有创建线程,进程,加载其他动态库,读取环境变量等函数接口
使用icoutils提取PE文件的图像
存在某些恶意软件为了诱使用户点击来运行,经常使用常用软件的图标来伪装自己
使用安装好的icoutils工具包进行提取,命令如下:
wrestool -x -t 14 -o . fakepdfmalware.exe
//将pe文件的图标信息提取出来
// -x代表提取,-t 14代表提取类型为14,也就是图标ico类型,-o代表输出目录为当前目录
icotool -x *.ico
// -x代表在ico文件中提取为图片
关于wrestool的命令参数可参考该url,上面有详细的参数介绍和示例。
下面为提取出的图标文件
- 可以看出该恶意软件伪造为pdf图标诱骗用户进行点击。
strings工具查看PE文件中的字符串
strings ircbot.exe > 1.txt
//将输出结果重定向输入至1.txt文件中
more 1.txt
//分页查看1.txt文件
- 可以很清楚的看到该文件有明显的网络行为
使用pefile和capstone线性反汇编PE文件
静态分析就需要反汇编二进制文件,但要达到完美的反汇编效果是不可能的,所以我们只能通过不完善的方法来完善这项工作。
我们在这里使用线性反汇编技术,这涉及在可移植可执行文件中识别那些与其x86程序代码相对应的连续字节序列,然后解码这些字节。
这种方法的局限性在于它忽略了cpu在程序执行过程中如何解码指令的细微差别,此外,它也无法解析恶意软件作者有时使用的使程序更难分析的各种混淆。
对于逆向工程的其他方法,如IDA Pro等专业级反汇编器使用的更加复杂的反汇编方法,这些方法实际上是模拟或者推理程序执行,以发现程序可能通过一系列条件分治达到哪些汇编指令,尽管这种类型的反汇编比线性反汇编更加精确,但它比线性反汇编方法占用的cpu资源要多得多。
代码如下:
import pefile
from capstone import *
#pe = pefile.PE("ircbot.exe")
pe = pefile.PE("1.exe")
#获取程序入口点的地址
entrypoint = pe.OPTIONAL_HEADER.AddressOfEntryPoint
#print hex(entrypoint)
#计算入口代码被加载到内存中的内存地址
entrypoint_address = entrypoint + pe.OPTIONAL_HEADER.ImageBase
#print hex(entrypoint_address)
#从PE文件中加载二进制代码
binary_code = pe.get_memory_mapped_image()[entrypoint:entrypoint+120]
#print binary_code
#初始化反汇编程序以反汇编32位x86的二进制代码
disassembler = Cs(CS_ARCH_X86, CS_MODE_32)
#输出反汇编代码
for instruction in disassembler.disasm(binary_code, entrypoint_address):
print "%s\t%s" %(instruction.mnemonic, instruction.op_str)
输出结果如下:
- 个人感觉线性反汇编还是存在一定的偏差
限制静态分析的因素
加壳
是一种以压缩、加密或以其他方式破坏其恶意程序主题的过程,当恶意软件运行时,它会自行解包,然后开始执行。
资源混淆
一种对抗检测和分析的技术,混淆了例如字符串和图形图像等程序资源存储在磁盘上的方式,然后在恶意软件运行时对它们进行混淆还原,以便恶意程序可以使用。
例如一个简单的混淆操作是将值1添加到存储在PE资源部分的图像和字符串中的所有字节,然后在运行时从所有数据中都减去1
反汇编技术
旨在利用先进反汇编技术的局限性,向恶意软件分析师隐藏代码,或使恶意软件分析师认为存储在磁盘上的代码块中包含了与其实际指令不同的指令
动态下载数据
从外部获得数据和代码。例如恶意软件样本在恶意软件启动时,从外部服务器动态加载代码。