基于数据科学的恶意软件分析(一)

系列文章目录

  • 《基于数据科学的恶意软件分析(一)》:通过四种方法静态分析恶意软件
  • 《基于数据科学的恶意软件分析(二)》: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

反汇编技术

旨在利用先进反汇编技术的局限性,向恶意软件分析师隐藏代码,或使恶意软件分析师认为存储在磁盘上的代码块中包含了与其实际指令不同的指令

动态下载数据

从外部获得数据和代码。例如恶意软件样本在恶意软件启动时,从外部服务器动态加载代码。

发布了291 篇原创文章 · 获赞 105 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/AcSuccess/article/details/104952004
今日推荐