本文提供四种静态分析恶意软件的方法
(笔者水平有限,如有错误,在所难免,望读者加以指正,并且笔者是一个热爱研究技术的小学生,谦虚且爱学习,博客文章欢迎指正,若有侵犯知识产权,务必联系我)
在此先说明一点:
本系列文章是以理论+实践的形式,面向大数据时代,解析恶意软件中的种种神秘。 本系列文章主要为 《基于数据科学的恶意软件分析》 一书,辅以 《恶意代码分析实战》 一书以及 《windows核心编程》 一书的读后笔记及本人在恶意代码分析领域的一些案例讲解。
本系列文章中的内容如果涉及原作者的内容较多,则我设为免费,如果其中我添加的内容居多,则为栏目收费内容,请大家理解。
本系列文章的发表主要是为了激励自己,面向大佬编程,尤其是想为安全行业做些力所能及的事情,带一带二进制刚入门的同学更好的学习恶意样本分析。
同时本系列文章旨在打造精品文章,希望引导大家尊重知识,尊重安全领域的从业人士,设置9.9元是想为自己挣一碗拉面钱更贴进步,吃饱了才好继续读书进步。
本栏目系列的地址为https://blog.csdn.net/acsuccess/category_9818048.html
原作者若认为有侵犯知识产权,可随时联系我,我的邮箱地址为[email protected],欢迎各位技术大咖来信交流切磋
pip2 install pefile
pip2 install capstone
apt-get install icountils
python模块pefile已成为解析PE文件的一个行业标准的恶意软件分析库。
可以结合看雪上这个实验做相关了解
另外关于PE文件的结构,有详细了解兴趣的可以参照武大在网易云的这门课程
import pefile
pe = pefile.PE("irbot.exe")
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
其中各个字段代表含义如下:
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
存在某些恶意软件为了诱使用户点击来运行,经常使用常用软件的图标来伪装自己
使用安装好的icoutils工具包进行提取,命令如下:
wrestool -x -t 14 -o . fakepdfmalware.exe
//将pe文件的图标信息提取出来
// -x代表提取,-t 14代表提取类型为14,也就是图标ico类型,-o代表输出目录为当前目录
icotool -x *.ico
// -x代表在ico文件中提取为图片
关于wrestool的命令参数可参考该url,上面有详细的参数介绍和示例。
strings ircbot.exe > 1.txt
//将输出结果重定向输入至1.txt文件中
more 1.txt
//分页查看1.txt文件
静态分析就需要反汇编二进制文件,但要达到完美的反汇编效果是不可能的,所以我们只能通过不完善的方法来完善这项工作。
我们在这里使用线性反汇编技术,这涉及在可移植可执行文件中识别那些与其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
旨在利用先进反汇编技术的局限性,向恶意软件分析师隐藏代码,或使恶意软件分析师认为存储在磁盘上的代码块中包含了与其实际指令不同的指令
从外部获得数据和代码。例如恶意软件样本在恶意软件启动时,从外部服务器动态加载代码。