利用安全软件的白名单进程进行敏感操作,是恶意软件的常见特征。在现代安全软件中,常会通过复杂的权限校验严格限制目标进程的权限。但一些安全软件在防止APC注入时只防止通过OpenProcess获取进程句柄,或者对通过进程句柄继承的句柄限制不严格,导致产生一些问题。本文介绍一种基于导入表劫持的DLL注入技术,该技术通过修改挂起进程的导入表,使目标进程在启动时自动加载恶意DLL,从而绕过常见的注入检测手段。常见的进程注入方式包括:其中,APC注入和远程线程注入是安全软件重点监控的对象,通常会检查OpenProcess获取的句柄权限以及CreateRemoteThread调用。而导入表劫持技术不需要在目标进程中创建远程线程,仅需对挂起进程的内存进行修改,且修改操作可通过继承的进程句柄完成,从而规避某些仅对OpenProcess返回的句柄做严格权限检查的安全软件。在Windows中,父进程创建子进程时可以设置bInheritHandles = TRUE,使得子进程继承父进程的可继承句柄。但本技术的核心在于:创建挂起进程后,直接使用CreateProcess返回的进程句柄(pi.hProcess)进行操作。该句柄拥有足够的权限(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ | PROCESS_SUSPEND_RESUME等),因为它是创建者自然获得的。许多安全软件在挂钩OpenProcess时只拦截外部进程打开目标进程的行为,而对于通过CreateProcess直接获得的句柄(属于进程创建的自然流程)往往不做严格限制,或者因为性能原因忽略了对该句柄的后续操作检查。此外,通过继承机制,恶意代码可以预先创建一个高权限的子进程,然后让子进程继承某些敏感句柄,进一步绕过基于进程身份的访问检查。要验证一个进程句柄是否具备所需的操作权限,可以使用GetHandleInformation或NtQueryObject。在注入前,代码可以检查PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD等权限。本例中的CreateProcessAndInjectDll函数直接假定返回的句柄具有足够权限,因为它是合法创建的挂起进程。下面提供的代码实现了通过修改挂起进程的导入表来注入DLL。其核心流程如下:该技术的优点:局限性:下面逐段解释提供的C代码。确保编译为64位,因为代码中使用了IMAGE_NT_HEADERS64等64位结构。安全的32位整数加法和乘法,防止溢出。该函数通过遍历目标进程的内存区域,寻找符合PE格式且不是DLL的模块,即主可执行文件。它检查DOS签名、NT签名、机器类型(AMD64),并确认不是DLL,返回基址。此函数在目标进程的指定基址(pbBase)附近查找空闲内存区域,并以64KB粒度尝试分配。目的是使新分配的导入表地址与主模块基址的偏移量不超过32位有符号范围(2GB),以便在PE头中使用32位RVA。如果分配的内存太远,则加载器可能无法正确解析。参数类似CreateProcess,额外增加lpDllName指定要注入的DLL路径(ANSI字符串)。强制添加CREATE_SUSPENDED标志,使主线程挂起,便于修改内存。绑定导入表会预先计算函数地址,如果存在可能会干扰新添加的导入项,因此清空。保留原有导入表,以便在后面合并时拷贝。代码中每个DLL预留了4个IMAGE_THUNK_DATA64条目,其中两个用于导入名称表(INT),两个用于导入地址表(IAT)。pbBase是一个启发式的起始地址,通常在代码段、数据段之后,试图在靠近主模块的地方分配内存。这里构造的导入描述符使用了序号导入(IMAGE_ORDINAL_FLAG64 | 1),这意味着它要求目标DLL导出序号为1的函数。实际中,为了确保DLL被加载但不一定要调用某个函数,可以改为按名字导入一个存在的函数(如DllMain),或者利用延迟加载机制。obStr是写入的总长度。由于我们总是添加了CREATE_SUSPENDED,所以这里恢复线程。进程开始运行,加载器会解析新的导入表,加载指定的DLL。该示例启动C:\Program Files\Huorong\Sysdiag\bin\HipsMain.exe,向其注入a64.dll,然后等待HipsDaemon.exe进程结束。 许多安全软件对进程注入的监控点包括:本技术的特点:当然,高级安全软件会监控VirtualAllocEx、WriteProcessMemory、VirtualProtectEx以及PE头的完整性。但通过精心选择目标进程(如白名单程序),并在合法上下文中操作,仍可能绕过部分防御。本文展示了一种基于导入表劫持的DLL注入技术,通过创建挂起进程并修改其导入表,实现隐蔽的DLL加载。该技术绕过了依赖OpenProcess和远程线程检测的传统安全机制,但也需要目标进程可写且未受严格保护。在实际对抗中,防御方应加强对WriteProcessMemory和PE头修改的行为监控,同时检测异常的导入表变化。对于开发者,应避免使用CREATE_SUSPENDED启动关键进程,或启用进程完整性验证(如Protected Process Light)。 源码:附件中的TestOne.zip 免责声明:本文提供的代码仅用于安全研究和教育目的,请勿用于非法活动。// 示例:检查句柄是否具有 VM 操作权限
DWORD access = 0;
if (GetHandleInformation(hProcess, &access)) {
// 实际权限检查需要使用 NtQueryInformationProcess
#ifndef _WIN64
#error This implementation requires 64-bit compilation.
#endif
#define MM_ALLOCATION_GRANULARITY 0x10000
static inline DWORD PadToDword(DWORD dw) {
return (dw + 3) & ~3u;
static inline DWORD PadToDwordPtr(DWORD dw) {
return (dw + 7) & ~7u;
static HRESULT DWordAdd(DWORD a, DWORD b, DWORD* pResult) {
ULONGLONG ull = (ULONGLONG)a + b;
if (ull > 0xFFFFFFFF) return E_FAIL;
*pResult = (DWORD)ull;
return S_OK;
static HRESULT DWordMult(DWORD a, DWORD b, DWORD* pResult) {
ULONGLONG ull = (ULONGLO
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290733.htm
[原创]利用导入表劫持实现DLL注入以干掉杀毒软件
126 浏览
5 回复
????学习一下!
tql
a64.dll这个文件怎么生成的?有源码吗
a64.dll内容是啥?
我不想把微信名字取的太长
a64.dll内容是啥?
a64.dll就是直接打开进程结束相应进程,很简单的一个dll
a64.dll内容是啥?
a64.dll就是直接打开进程结束相应进程,很简单的一个dll