第一章:恶意软件静态分析基础


前言

  静态分析可以帮助我们更好地理解恶意软件二进制文件在攻击目标后为攻击者提供的好处,以及攻击者可以隐藏并继续攻击受感染计算机的方式。


1、数据集

数据集下载地址

ircbot.exe : 互联网中继聊天(Internet Relay Chat)机器人。当连接到IRC服务器时,程序被设计常驻在目标计算机中,在ircbot.exe控制目标后,攻击者可以通过IRC控制目标计算机,执行控制指令,例如打开网络摄像头偷偷捕获视频、提取目标的地理位置和桌面的截图,以及从目标机器中提取相关文件等。

fakepdfmalware.exe:此样本使用Adobe Acrobat图标诱骗用户认为它是一个Adobe Acrobat文档,而实际上它是一个恶意的PE可执行文件。

2、Windows可移植可执行文件格式

  Windows PE文件格式描述了如.exe、.dll和.sys等当今Windows程序文件的结构,并定义了它们存储数据的方式。PE文件包含x86指令、图像和文本等数据,以及程序运行所需要的元数据。Windows使用这些安全数据来确保代码出自受信任的来源。下图为PE文件格式

  PE文件格式包括一系列的header,用来告诉操作系统如何将程序加载到内存中。它还包括一系列的节用来包含实际的程序数据。Windows将这些节加载到内存中,使其在内存中的偏移量与他们在磁盘上的显示位置向对应。
  1. PE头
    定义了程序的一般属性,如二进制代码、图像、压缩数据和其它程序属性。告诉我们程序是针对32位或64位系统而设计的。头里包括了时间戳字段,可以给出恶意软件作者编译文件的时间, 通常恶意软件作者会使用伪造的值替代这个字段。

  2. 可选头
    定义了PE文件中程序入口的位置,该位置指的是程序加载后运行的第一个指令,还定义了Windows在加载PE文件、Windows子系统、目标程序时加载到内存中的数据的大小,以及有关该程序其他的高级详细信息。

  3. 节头
    节头描述了PE文件中包含的数据节。PE文件中的一个节是一块数据,它们在操作系统加载程序时将被映射到内存中,或者包含有关如何将程序加载到内存中的指令。节头还告诉Windows应该授予哪些权限,例如x86代码的.text节通常是可读和可执行的,但不可写,防止程序代码在执行过程中意外修改自身。

  4. .text节
    每一个PE程序在其节头中包含了至少一个标记为可执行的x86代码节;这些节几乎总是命名为.text,在执行程序反汇编和逆向工程时,将反汇编.text节中的数据。

  5. .idata节
    被称为导入节,包含导入地址表(IAT), 它列出了动态链接库和它们的函数。IAT是最重要的PE结构之一,在对PE二进制文件进行最初的分析时需要查看它,因为它指出了程序所调用的库,这些调用反过来又可能会泄露恶意软件的高级功能。

  6. .rsrc节
    .rsrc节包含了程序用于将文本呈现为字符串的可打印字符串。

  7. .reloc节
    PE二进制文件的代码并非是与位置独立的,这意味着如果将它从预期的内存位置移动到新的内存位置,它将无法正确执行。.reloc节在不破坏代码的情况下通过允许移动代码来解决这个问题。

3、使用pefile解析PE文件格式

代码如下:

import pefile


#实例化pefile.PE,通过调用PE构造函数,加载并解析指定的PE文件
pe = pefile.PE("ircbot.exe")


#遍历PE文件的各个节点并打印有关它们的信息
for section in pe.sections:
	print (section.Name, hex(section.VirtualAddress), 
	hex(section.Misc_VirtualSize), section.SizeOfRawData)

'''
输出

b'.text\x00\x00\x00' 0x1000(加载节的虚拟内存地址基址,也可以视为节的内存地址基址) 0x32830(指定了节被加载后所需的内存大小) 207360(该节将在该内存块中所占用的数据量)
b'.rdata\x00\x00' 0x34000 0x427a 17408
b'.data\x00\x00\x00' 0x39000 0x5cff8 10752
b'.idata\x00\x00' 0x96000 0xbb0 3072
b'.reloc\x00\x00' 0x97000 0x211d 8704
'''



#使用pefile列出二进制文件将加载的DLL文件, 以及它将在这些DLL文件中所请求的函数调用。

#从ircbot.exe中提取导入信息
for entry in pe.DIRECTORY_ENTRY_IMPORT:
	print (entry.dll)
	for function in entry.imports:
		print ('\t', function.name)

#输出 列出了恶意软件声明和将引用的丰富的函数数组
'''
b'KERNEL32.DLL'
	 b'GetLocalTime'
	 b'ExitThread'
	 b'CloseHandle'
	 b'WriteFile' 
	 b'CreateFileA'
	 b'ExitProcess'
	 b'CreateProcessA'
	 b'GetTickCount'
	 b'GetModuleFileNameA'
	 b'GetSystemDirectoryA'
	 b'Sleep'
	 b'GetTimeFormatA'
	 b'GetDateFormatA'
	 b'GetLastError'
	 b'CreateThread'
	 b'GetFileSize'
	 b'GetFileAttributesA'
	 b'FindClose'
	 b'FileTimeToSystemTime'
	 b'FileTimeToLocalFileTime'
	 b'FindNextFileA'
	 b'FindFirstFileA'
	 b'ReadFile'
	 b'SetFilePointer'
	 b'WriteConsoleA'
	 b'GetStdHandle'
	 b'LoadLibraryA'
	 b'GetProcAddress'
	 b'GetModuleHandleA'
	 b'FormatMessageA'
	 b'GlobalUnlock'
	 b'GlobalLock'
	 b'UnmapViewOfFile'
	 b'MapViewOfFile'
	 b'CreateFileMappingA'
	 b'SetFileTime'
	 b'GetFileTime'
	 b'ExpandEnvironmentStringsA'
	 b'SetFileAttributesA'
	 b'GetTempPathA'
	 b'GetCurrentProcess'
	 b'TerminateProcess'
	 b'OpenProcess'
	 b'GetComputerNameA'
	 b'GetLocaleInfoA'
	 b'GetVersionExA'
	 b'TerminateThread'
	 b'FlushFileBuffers'
	 b'SetStdHandle'
	 b'IsBadWritePtr'
	 b'IsBadReadPtr'
	 b'HeapValidate'
	 b'GetStartupInfoA'
	 b'GetCommandLineA'
	 b'GetVersion'
	 b'DebugBreak'
	 b'InterlockedDecrement'
	 b'OutputDebugStringA'
	 b'InterlockedIncrement'
	 b'HeapAlloc'
	 b'HeapReAlloc'
	 b'HeapFree'
	 b'HeapDestroy'
	 b'HeapCreate'
	 b'VirtualFree'
	 b'VirtualAlloc'
	 b'WideCharToMultiByte'
	 b'MultiByteToWideChar'
	 b'LCMapStringA'
	 b'LCMapStringW'
	 b'GetCPInfo'
	 b'GetACP'
	 b'GetOEMCP'
	 b'UnhandledExceptionFilter'
	 b'FreeEnvironmentStringsA'
	 b'FreeEnvironmentStringsW'
	 b'GetEnvironmentStrings'
	 b'GetEnvironmentStringsW'
	 b'SetHandleCount'
	 b'GetFileType'
	 b'RtlUnwind'
	 b'SetConsoleCtrlHandler'
	 b'GetStringTypeA'
	 b'GetStringTypeW'
	 b'SetEndOfFile'
b'USER32.dll'
	 b'MessageBoxA'
'''


# 3、使用pefile解析PE文件格式


## 2.读入数据

<font color=#999AAA >代码如下(示例):



```c
data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

4、获取恶意软件的图像

  要了解恶意软件如何设计来捉弄攻击目标,就可以查看它的.rsrc节中所包含的图标。使用wrestool(0.32.3)从fakepdfmalware.exe中提取图像资源保存为.icon格式,并使用icotool转换为png图像。
在这里插入图片描述在这里插入图片描述

5、获取恶意软件的字符串

  字符串是程序二进制文件中可打印字符的序列。这些字符串通常包含下载网页和文件的HTTP和FTP命令,用来告诉你恶意软件连接到的地址的IP地址和主机名等类似信息。有时,即使用来编写字符串的语言也有可能暗示恶意软件二进制文件的来源国,尽管可能是伪造的。甚至可以在一个字符串中找到一些文本,它们用网络用语解析了恶意二进制文件的用途。
  字符串还可以显示有关二进制文件的更多技术信息。例如,创建二进制文件的编译器、编写二进制文件所使用的编程语言、嵌入式脚本或HTML等信息。虽然恶意软件作者可以对所有这些痕迹进行混淆、加密和压缩等处理,但是即便是高水平的恶意软件作者也经常会暴露并留下一些痕迹。
将ircbot.exe中的字符串镜像到ircbotstring.txt文件中。
在这里插入图片描述

6、反汇编技术

  反汇编是将恶意软件的二进制代码转换为有效的x86汇编语言的过程。恶意软件作者通常使用C/C++等高级语言编写恶意软件程序,然后使用编译器将源代码进行编译成x86二进制代码。但是,反汇编并非易事,因为恶意软件作者经常使用一些技巧来阻挠逆向工程。由于目前要达到完美的反汇编是不可能的,我们必须使用不完善的方法来完成这项任务,使用的方法是线性反汇编,这涉及到PE文件中识别哪些与其x86程序代码相对应的连续字节序列,然后解码这些字节。这种方法主要的局限性是它忽略了CPU在程序执行过程中如何解码指令的细微差别。此外,它也无法解析恶意软件作者有时使用的使程序更难分析的各种混淆。

6.1、使用pefile和capstone反汇编ircbot.exe

使用开源python库pefile和capstone,这是一个可以反汇编32位x86二进制代码的开源反汇编库。反汇编ircbot.exe汇编代码的前100个字节。

#!usr/bin/python3
#-*- coding:utf-8 -*-
import pefile
from capstone import *

#反汇编ircbot.exe

#加载目标PE文件
pe = pefile.PE("ircbot.exe")

#从程序头中获取程序入口点的地址
entrypoint = pe.OPTIONAL_HEADER.AddressOfEntryPoint

#计算入口代码被加载到内存中的内存地址
entrypoint_address = entrypoint + pe.OPTIONAL_HEADER.ImageBase

#从PE文件对象获取二进制代码
binary_code = pe.get_memory_mapped_image()[entrypoint:entrypoint+100]

#初始化反汇编程序以反汇编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))

#结果
'''
dec	ecx
add	byte ptr [ebx + 0x494634], ah
mov	eax, dword ptr [0x494634]
shr	eax, 8
and	eax, 0xff
mov	dword ptr [0x494640], eax
mov	ecx, dword ptr [0x494634]
and	ecx, 0xff
mov	dword ptr [0x49463c], ecx
mov	edx, dword ptr [0x49463c]
shl	edx, 8
add	edx, dword ptr [0x494640]
mov	dword ptr [0x494638], edx
mov	eax, dword ptr [0x494634]
shr	eax, 0x10
and	eax, 0xffff
mov	dword ptr [0x494634], eax
push	0
call	0x414190
add	esp, 4
test	eax, eax
jne	0x412224
push	0x1c
'''

7、限制静态分析的因素

加壳、资源混淆、反汇编技术、动态下载数据。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值