0x01 静态修改PE输入表法
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
编译器 | VS2019 | |
二进制编辑器 | 010Editor |
实验过程
C语言代码。
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <stdio.h>
#include <Windows.h>
DWORD WINAPI ThreadShow(LPVOID lpParameter);
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL, 0, ThreadShow, NULL, 0, NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DWORD WINAPI ThreadShow(LPVOID lpParameter) {
char szPath[MAX_PATH] = { 0 };
char szBuf[1024] = { 0 };
GetModuleFileNameA(NULL, szPath, MAX_PATH);
MessageBoxA(NULL, szBuf, "Injected by hu1y40", MB_OK);
printf("%s", szBuf);
OutputDebugStringA(szBuf);
return 0;
}
要添加一个新的IID,所以原先OptionalHeader中输入表的目录的大小要改。newIIDSize=OldSize+sizeof(IID)。
先看看原先的IID数组。
基地址ImageBase。
FOA光标处,长度0xC8。添加后所需的长度是0xDC。
找块空间写入IID结构所需的各类数据。
随后将IID数据填充。
最后修正PE头,如输入表位置,大小。并且由于输入表加载过程中FirstThunk要被填充为真正的函数地址所以该节需要可写。
最后清除PE文件头数据目录中的Bound Import Table。强制重新处理输入表。
0x02 进程创建期修改PE输入表法
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
编译器 | VS2019 | |
实验过程
可以在R3/R0的各个阶段进行干预。由于进程创建修改的是映射后的内存,所以利用的是内存空隙,空隙会更大。
首先以挂起的方式创建目标进程。
随后获取目标进程中的PE结构信息。这里需要读取EXE的实际加载位置来获取,但是由于此时进程中的很多数据结构没有初始化,EnumProcessModules之类依赖PEB->Ldr链表的函数无法使用,所以可以自行搜索MEM_IMAGE的页映射文件。由于此时内存中只映射了EXE和ntdll.dll。由于dll文件加载位置靠后,所以第一个具有MEM_IMAGE属性的页地址就是EXE的实际加载基址。另一种办法是使用ZwQueryInformation,查询ProcessBasic Information,获取PEB的地址。PEB偏移0x8处是ImageBase。
在这之后获取原IID的大小,增加一项,可以在最后一个节的结束为止申请新的内存。
再然后构造新的IID及其相关的成员。
最后修改PE头,继续运行主线程。
该实验待后续补充。
0x03 输入表项DLL替换法(DLL劫持法)
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
编译器 | VS2019 | |
实验过程
进程创建尚未完成的时候ntdll就已经加载了。在加载时,ntdll的路径是系统在启动阶段就以及设置好的位于system32目录下的路径,R3的劫持对他无效。
系统启动的时候,smss.exe会根据设置项创建一个\KnownDLLs对象目录,其中存放了各个KnownDLL的Section对象。
当需要加载DLL时,系统会优先从\KnownDLLs对象目录中查找,如果有的话,直接在这里使用NtMapViewOfSection将其映射到当前进程中。如果没有,进行搜索。
如果在KnowDLLs中找不到目标DLL,Windows将按照如下顺序查找DLL。
- 正在加载DLL的进程的可执行文件的目录。
- 系统目录(WINDOWS/SYSTEM32,WINDOWS/SYSTEM,WINDOWS)
- 正在加载DLL的进程当前目录
- PATH环境变量中列出的目录
文章评论