利用AI+大数据的方式分析恶意样本(一)

文章目录

    • 系列文章目录
    • 本文主旨
    • 声明
      • 环境及工具安装
      • 使用pefile查看exe文件的结构
        • 输出结果:
      • 使用pefile输出PE文件的导入函数列表
        • 输出结果
      • 使用icoutils提取PE文件的图像
        • 下面为提取出的图标文件
      • strings工具查看PE文件中的字符串
      • 使用pefile和capstone线性反汇编PE文件
        • 代码如下:
        • 输出结果如下:
      • 限制静态分析的因素
        • 加壳
        • 资源混淆
        • 反汇编技术
        • 动态下载数据

系列文章目录

  • 《利用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

原作者若认为有侵犯知识产权,可随时联系我,我的邮箱地址为[email protected],欢迎各位技术大咖来信交流切磋

环境及工具安装

  • 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,上面有详细的参数介绍和示例。

下面为提取出的图标文件

利用AI+大数据的方式分析恶意样本(一)_第1张图片

  • 可以看出该恶意软件伪造为pdf图标诱骗用户进行点击。

strings工具查看PE文件中的字符串

strings ircbot.exe > 1.txt
//将输出结果重定向输入至1.txt文件中
more 1.txt
//分页查看1.txt文件

利用AI+大数据的方式分析恶意样本(一)_第2张图片

利用AI+大数据的方式分析恶意样本(一)_第3张图片

  • 可以很清楚的看到该文件有明显的网络行为

使用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)

输出结果如下:

利用AI+大数据的方式分析恶意样本(一)_第4张图片

  • 个人感觉线性反汇编还是存在一定的偏差

限制静态分析的因素

加壳

是一种以压缩、加密或以其他方式破坏其恶意程序主题的过程,当恶意软件运行时,它会自行解包,然后开始执行。

资源混淆

一种对抗检测和分析的技术,混淆了例如字符串和图形图像等程序资源存储在磁盘上的方式,然后在恶意软件运行时对它们进行混淆还原,以便恶意程序可以使用。

例如一个简单的混淆操作是将值1添加到存储在PE资源部分的图像和字符串中的所有字节,然后在运行时从所有数据中都减去1

反汇编技术

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

动态下载数据

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

你可能感兴趣的:(基于深度学习的恶意代码检测,分类实战)