1. 启动器(Launcher)

启动器,也叫加载器。主要用来加载恶意代码,其主要目的就是安装恶意程序。
比较常见的手法是在其资源节中加载可执行文件或DLL。其加载时通常会加载以下的API函数:

  1. FindResource
  2. LoadResource
  3. SizeofResource
  4. .....

其运行时通常需要管理员或以上权限运行;普通的用户进程无法执行加载器的功能;同时加载器通常会包含提权的操作。

2. 进程注入

隐藏启动最主流的技术是进程注入。其主要是把恶意代码注入到正在运行的进程中。
其注入时通常会调用以下的Windows API函数:

  1. VirtualAllocEx:在进程中分配内存空间
  2. WriteProcessMemory:向VirtualAllocEx分配的内存空间与数据
  3. LoadLibrary
  4. CreateRemoteThread
  5. .....

2.1 DLL注入

最主流也是最常用的注入技术,其注入的逻辑如下所示:

  1. 将恶意代码注入到一个远程进程
  2. 远程调用Loadlibrary,从而强制远程进程加载一个DLL程序到它的上下文
  3. 一旦被注入了恶意的DLL,OS自动调用DllMain函数,其拥有与被注入的进程相同的系统权限

如下图所示:在恶意DLL注入到IE浏览器以前其不能访问到互联网,但是其被注入到IE浏览器以后,其就与IE浏览器有相同的权限,这样的话其就可以访问互联网了。
image.png
在注入的时候有以下关键的操作点:

2.1.1 获取句柄(hProcess)

  1. 使用windows API函数CreateToolhelp32SnapshotProcess32FirstProcess32Next来查找进程列表中的目标进程
  2. 一旦发现目标进程,启动器会提取目标进程的PID
  3. 使用OpenProcess提取PID,以获取目标的句柄(hProcess

2.1.2 创建远程线程(CreateRemoteThread)

DLL注入使用CreateRemoteThread函数来创建一个新的线程,其中有三个重要的参数:

  1. 使用OpenProcess函数获得进程句柄(hProcess
  2. 注入线程的注入点(lpStartAddress),可能被设置为LoadLibrary函数的地址,并且恶意DLL名字作为它的参数
  3. 线程的参数(hpParameter

2.1.3 创建内存空间(VirtualAllocEx)

如果提供远程进程的句柄,VirtualAllocEx函数将在远程进程中分配内存空间。

2.1.4 写入内存空间(WriteProcessMemory)

将恶意DLL程序的名字字符串写入到VitualAllocEx分配的内存空间中。

2.1.5 DLL注入案例

image.png

2.2 直接注入

同DLL注入一样都使用了相同的Windows API函数,不同的是,其并不需要单独编写DLL并且强制远程进程加载它,而是直接将恶意代码注入到远程进程中。
其有以下特征:

  1. 灵活
  2. 如果想要注入成功,需要大量的代码定制
  3. 其主要场景为用来注入shellcode

一般情况下,直接注入的话一般会调用以下函数:

  1. VirtualAllocEx
  2. WriteProcessMemory
  3. CreateRemoteThread

直接注入的话技术难度比较大,一般仅仅是注入相对简单的shellcode。

3. 进程替换

将一个可执行文件重写到一个运行进程的内存空间,可将恶意代码伪装成一个合法进程,并且不会产生DLL注入让进程崩溃的危险。
替换的进程与被替换的进程拥有相同的特权级

4. 钩子(Hook)注入

详细案例可参考个人文章:

  1. https://www.yuque.com/feiniao112/fknpgi/bipabi

image.png

5. Detours

详细案例可参考个人文章:

  1. https://www.yuque.com/feiniao112/fknpgi/bipabi

6. APC注入

详细可参考个人语雀的实践:

  1. https://www.yuque.com/feiniao112/fknpgi/sz9waa