LdrLoadDll+NtCreateThreadEx结合实现DLL的注入

项目要求实现对文件操作的监控,首先想到的就是通过HOOK的方式,先是通过setWindowsHookEx采用全局注入方式注入文件操作DLL,这种方式在WIN10操作系统有效,但是在WIN7上无效,后来又使用了CreateRemoteThread采用远程注入方式,结果还是只在WIN10上有限,又查了很多资料,最后看到网上又说可以使用LdrLoadDll+NtCreateThreadEx于是又采用这种方式注入DLL,结果还是只是WIN10上有效,又再重新检查,不断尝试,最后发现编辑成RELEASE版本可以注入WIN7 64SP1,于是想着记录下来,希望后面的人少走弯路。

下面是核心代码:

typedef DWORD(WINAPI* PFNTCREATETHREADEX)
(
    PHANDLE                 ThreadHandle,
    ACCESS_MASK             DesiredAccess,
    LPVOID                  ObjectAttributes,
    HANDLE                  ProcessHandle,
    LPTHREAD_START_ROUTINE  lpStartAddress,
    LPVOID                  lpParameter,
    BOOL                    CreateSuspended,
    DWORD                   dwStackSize,
    DWORD                   dw1,
    DWORD                   dw2,
    LPVOID                  Unknown
);
typedef struct _LSA_UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
} LSA_UNICODE_STRING, * PLSA_UNICODE_STRING, UNICODE_STRING, * PUNICODE_STRING;

typedef NTSTATUS(NTAPI* pRtlInitUnicodeString)(PUNICODE_STRING, PCWSTR);
typedef NTSTATUS(NTAPI* pLdrLoadDll)(PWCHAR, ULONG, PUNICODE_STRING, PHANDLE);

typedef struct _THREAD_DATA
{
    pRtlInitUnicodeString fnRtlInitUnicodeString;
    pLdrLoadDll fnLdrLoadDll;
    UNICODE_STRING UnicodeString;
    WCHAR DllName[260];
    PWCHAR DllPath;
    ULONG Flags;
    HANDLE ModuleHandle;
}THREAD_DATA, * PTHREAD_DATA;

typedef VOID(WINAPI* fRtlInitUnicodeString)(PUNICO

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
驱动级注入DLL源码是一段用于实现在内核层次进行DLL注入的代码。通常情况下,DLL注入用于在目标进程的地址空间中运行指定的DLL文件,从而实现对目标进程的监控、修改或增强功能。 驱动级注入DLL源码需要使用Windows驱动开发工具包(WDK)来编写,以下是一种可能的实现方式: ```c #include <ntifs.h> // 目标进程ID #define TARGET_PROCESS_ID 1234 // 待注入DLL路径 #define DLL_PATH L"C:\\path\\to\\mydll.dll" // 在进程创建时触发的回调函数 VOID ProcessNotifyCallback(HANDLE hParentId, HANDLE hProcessId, BOOLEAN bCreate) { UNICODE_STRING usDllPath; PUNICODE_STRING pusDllPath; NTSTATUS status; HANDLE hTargetProcess; PEPROCESS pTargetProcess; PVOID pAllocatedMemory; SIZE_T ulDllPathSize; // 判断是否为目标进程创建 if (hParentId != NULL && hTargetProcess != NULL && (HANDLE)PsGetCurrentProcessId() == hParentId) { // 打开目标进程 status = PsLookupProcessByProcessId(hProcessId, &pTargetProcess); if (NT_SUCCESS(status)) { // 分配内存来保存DLL路径 ulDllPathSize = sizeof(DLL_PATH); pAllocatedMemory = ExAllocatePoolWithTag(NonPagedPool, ulDllPathSize, 'DLLI'); if (pAllocatedMemory != NULL) { RtlInitUnicodeString(&usDllPath, DLL_PATH); pusDllPath = (PUNICODE_STRING)pAllocatedMemory; RtlCopyUnicodeString(pusDllPath, &usDllPath); // 注入DLL status = ZwOpenProcess(&hTargetProcess, PROCESS_ALL_ACCESS, NULL, &hProcessId); if (NT_SUCCESS(status)) { status = LdrLoadDll(pTargetProcess, NULL, pusDllPath, &hModule); ZwClose(hTargetProcess); } // 释放内存 ExFreePoolWithTag(pAllocatedMemory, 'DLLI'); } } } } // 注册进程创建通知回调 NTSTATUS RegisterProcessNotifyCallback(VOID) { PVOID pCallbackRegistration; return PsSetCreateProcessNotifyRoutine(ProcessNotifyCallback, FALSE, &pCallbackRegistration); } // 取消注册进程创建通知回调 VOID UnregisterProcessNotifyCallback(VOID) { PsSetCreateProcessNotifyRoutine(ProcessNotifyCallback, TRUE, NULL); } // 驱动入口函数 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING puniRegistryPath) { NTSTATUS status; // 注册进程创建通知回调 status = RegisterProcessNotifyCallback(); if (!NT_SUCCESS(status)) { DbgPrint("Failed to register process notify callback\n"); return status; } // 等待驱动被卸载 KeWaitForSingleObject(&(pDriverObject->DeviceObject->DeviceLock), Executive, KernelMode, FALSE, NULL); // 取消注册进程创建通知回调 UnregisterProcessNotifyCallback(); return STATUS_SUCCESS; } ``` 以上代码是一种简单的驱动级注入DLL实现方式。当目标进程创建时,会触发回调函数,该回调函数会打开目标进程并注入指定的DLL文件。 需要注意的是,驱动级DLL注入在实际使用中需要谨慎使用,因为其对系统稳定性和安全性有较大的影响,一般情况下最好选择更安全可靠的用户级DLL注入方式。此外,驱动级开发需要高深的系统内核知识和经验,对于普通开发者而言较为复杂。使用驱动级DLL注入时务必遵守法律法规和道德规范,避免造成不良后果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值