文章目录
系列文章目录
- 《利用AI+大数据的方式分析恶意样本(一)》:通过四种方法静态分析恶意软件
- 《利用AI+大数据的方式分析恶意样本(二)》:x86架构反汇编基本原理及实践
- 《利用AI+大数据的方式分析恶意样本(三)》:通过动态运行恶意软件来解析其功能
- 《利用AI+大数据的方式分析恶意样本(四)》:通过提取特征来构建恶意代码样本相互关联关系
- 《利用AI+大数据的方式分析恶意样本(五)》:一些常用的机器学习方法
- 《利用AI+大数据的方式分析恶意样本(六)》:以多种测试标准的评价方法
- 《利用AI+大数据的方式分析恶意样本(七)》:构建基于机器学习的恶意代码检测器
- 《利用AI+大数据的方式分析恶意样本(八)》:可视化恶意软件的趋势
- 《利用AI+大数据的方式分析恶意样本(九)》:介绍深度学习基础
- 《利用AI+大数据的方式分析恶意样本(十)》:基于卷积神经网络的恶意代码家族标注
- 《利用AI+大数据的方式分析恶意样本(十一)》:关于利用卷积神经网络进行恶意代码检测的一些改进方法
- 《利用AI+大数据的方式分析恶意样本(十二)》:通过AI对抗攻击来混淆基于机器学习的恶意样本检测
- 《利用AI+大数据的方式分析恶意样本(十三)》:Cuckoo沙箱的搭建教程
- 《利用AI+大数据的方式分析恶意样本(十四)》:二进制样本分析之脱壳方法研究
本文主旨
本文提供四种静态分析恶意软件的方法
(笔者水平有限,如有错误,在所难免,望读者加以指正,并且笔者是一个热爱研究技术的小学生,谦虚且爱学习,博客文章欢迎指正,若有侵犯知识产权,务必联系我)
声明
在此先说明一点:
本系列文章是以理论+实践的形式,面向大数据时代,解析恶意软件中的种种神秘。 本系列文章主要为 《基于数据科学的恶意软件分析》 一书,辅以 《恶意代码分析实战》 一书以及 《windows核心编程》 一书的读后笔记及本人在恶意代码分析领域的一些案例讲解。
本系列文章中的内容如果涉及原作者的内容较多,则我设为免费,如果其中我添加的内容居多,则为栏目收费内容,请大家理解。
本系列文章的发表主要是为了激励自己,面向大佬编程,尤其是想为安全行业做些力所能及的事情,带一带二进制刚入门的同学更好的学习恶意样本分析。
同时本系列文章旨在打造精品文章,希望引导大家尊重知识,尊重安全领域的从业人士,设置9.9元是想为自己挣一碗拉面钱更贴进步,吃饱了才好继续读书进步。
本栏目系列的地址为https://blog.csdn.net/acsuccess/category_9818048.html
原作者若认为有侵犯知识产权,可随时联系我,我的邮箱地址为mzgao@njnet.edu.cn,欢迎各位技术大咖来信交流切磋
环境及工具安装
- 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
反汇编技术
旨在利用先进反汇编技术的局限性,向恶意软件分析师隐藏代码,或使恶意软件分析师认为存储在磁盘上的代码块中包含了与其实际指令不同的指令
动态下载数据
从外部获得数据和代码。例如恶意软件样本在恶意软件启动时,从外部服务器动态加载代码。