第12章 隐蔽的恶意代码启动
1.启动器
启动器是一种设置自身或其他恶意代码片段以达到即使或将来秘密运行的恶意代码。
启动器的目的是安装一些东西,以使恶意行为对用户隐蔽。
启动器经常包含它要加载的恶意代码。最常见的情况是在它的资源节中包含一个可执行文件或者dll。
正常情况下,Windows pe文件格式中的资源节是供可执行程序使用的,但并不应该是可执行程序的
组成代码。正常资源节的内容包括图标,图片,菜单,以及字符串。启动器通常在资源节存储恶意
代码,当启动器运行时,它在运行嵌入可执行程序或者DLL程序之前,从资源节将恶意代码提取出来。
恶意代码启动器通常需要管理员权限运行,或者通过提取拥有这些权限。普通的用户进程不能执行
我们本章讨论的技术。
2.进程注入
隐藏启动最流行技术是进程注入。顾名思义,这种技术是将代码注入到另外一个正在运行的进程中,
而被注入的进程会不知不觉的运行注入的代码。恶意代码编写者通过进程注入技术隐藏代码的行为,
有时他们也试图使用通过进程注入技术绕过基于主机的防火墙和那些针对进程的安全机制。
某些Windows api通常被用来执行进程注入。例如,virtualAllocEx函数用来在另外一个进程中分配
一块内存空间。writeProcessMemorty函数用来向virtualAllocEx函数分配的地址空间写数据。
1.DLL注入,DLL注入是进程注入的一种形式,强迫远程进程加载恶意DLL程序,同时它也是最常
使用的秘密加载技术。DLL注入代码将代码注入到一个远程进程,并让远程进程调用loadLibrary,
从而强制远程进程加载一个DLL程序到它的进程上下文。一旦被感染的进程加载了恶意代码,操作
系统就会自动地调用DLLMain函数,DLLMai'n函数由DLL作者编写。
2.直接注入,同DLL注入一样,直接注入也涉及在远程进程的内存空间中分配和插入代码。
直接注入同DLL注入类似,它们都使用了许多相同的Windows api函数。不同的是,它并
不用单独编写一个DLL并且强制远程进程载入它,而是直接将恶意代码注入到远程进程中。
直接注入比DLL注入更加灵活,但是要想注入的代码在不对宿主进程产生副作用的前提下
成功运行,直接注入需要大量的定制代码。这种技术更多的是用来注入shell code。
3.进程替换,除了注入代码到一个宿主程序外,一些恶意代码还会使用进程替换,将一个
可执行文件重写到一个运行进程的内存空间。当恶意代码编写者想要将恶意代码伪装成了
一个合法进程,并且不会产生DLL注入让进程崩溃的危险,他们也会使用进程替换技术。
4.钩子(HOOK)注入,钩子是利用Windows钩子加载恶意代码的方法,恶意代码拦截发往
某个应用程序的的消息。恶意代码编写者可以用挂钩注入,来完成以下俩种事情。
- 保证无论何处拦截一个特殊消息,恶意代码都会被运行。
- 保证一个特殊的DLL被载入到受害进程的内存空间。
1.本地和远程钩子
- 本地钩子被用来观察和操纵发往进程内部的消息。
- 远程钩子被用来观察和操纵发往一个远程进程的消息(系统中的另一个进程).
5.Detours。Detours是微软研究院1999年开发的一个代码库。它的初衷是作为一个来扩展已
有操作系统和应用程序功能的简单工具。Detours开发库让开发人员对二进制应用程序进行修
改变得简单可行。
6.APC注入 在本章的前面,我们看到通过createRemoteThread函数创建一个线程就可以使用远
程进程中的一个函数。Windows的异步过程调用(APC)可以满足这种要求。
APC可以让一个线程在它正常的执行路径运行之前执行一些其他的代码。每一个线程都有一个附加
的APC队列,它们在线程处于可警告的等待状态时被处理。
APC有俩种存在形式
- 为系统或者驱动生成的APC,内核模式APC
- 为应用程序生成的APC,用户模式APC
实验
Lab12-1
分析在Lab12-01.exe和Lab12-01.dll文件中找到的恶意代码,并确保在分析时这些文件在同一目录中。
问题
1.在你运行恶意代码可执行文件时,会发生什么?
弹出恶意窗口,无法关闭。
2.那个进程会被注入?
推测会注入explorer.exe
3.你如何能够让恶意代码停止弹出窗口?
重启 explorer.exe进程,点击之后关闭窗口。
4.这个恶意代码样本如何工作的?
将lab12-01.dll注入 explorer.exe,dll会创建每隔60s创建一个线程,创建对话框。
Lab12-2
分析在Lab12-02.exe文件中找到的恶意代码。
问题
1.这个程序的目的是什么?
加载一个恶意资源
2.启动器恶意代码是如何隐蔽执行的?
使用进程替换技术
3.恶意代码的负载存储在那里?
真是功能代码保存在资源节中
4.恶意负载是如何被保护的?
恶意程序的真实功能的代码是经过异或运算加密的。
5.字符串列表是如何被保护的?
字符串也是经过异或加密的。
Lab12-3
分析在Lab12-2实验抽取的恶意代码样本,或者使用Lab12-03.exe文件
问题
1.这个恶意代码负载的目的是什么?
键盘记录器
2.恶意负载如何注入自身的?
程序运行失败
3.这个程序还创建了那些其他文件?
程序运行成功之后会创建.log文件用来保存键盘记录的信息。
Lab12-4
分析在Lab12-04.exe文件中找到的恶意代码。
问题
1.位置 0x401000的代码完成了什么功能?
str2 “winlogon.exe”,接下来程序dwprocessid传openprocess,用来获取进程的句柄
2.代码注入了那些进程?
使用loadlibrary装载sfc_os.dll这个动态链接库,并且利用向winlogin进行远程注入。
3.使用loadlibraryA装载如了那个DLL程序?
sfc_os.dll负责Windows 文件的保护机制,她有一系列运行在winlogon.exe里面的线程。
4.传递给CreateRemoteThread调用的第4个参数是什么?
第四个参数是一个函数指针,指向sfc_os.dll中的一个未命名序号为2的函数,其实它的名字是sfcterminatewatcherThread.
5.二进制主程序释放出了那个恶意代码?
如果程序成功注入进程,就会将\system32\wupdmgr.exe进行组合,并且保存在ExistingFileName里面。程序会讲提取出来的文件写入到wupdMgr.exe文件。由于正常情况下,Windows保护机制会探测到文件的改变,但是恶意程序已经禁用了这项功能,所以这里可以实现对受保护的Windows文件的修改。
6.释放出恶意代码的目的是什么?
使用URLDownloadToFileA函数,下载更新wupdmgrd.exe,判断返回值,决定是否运行下载的程序。