c++ - 如何在另一个应用程序的另一个线程上调用 ldrLoadDll?
问题描述
我做了最简单的注入器 NtCreateThreadEx + LdrLoadDll,但是注入器将 dll 注入到自身而不是目标进程中(使用LoadLibraryW
而不是LdrLoadDll ((wchar_t *) 0, 0, & name, & Module))
,它可以正常工作 - 我怎样才能以最简单的方式解决问题
#include <windows.h>
#include <winternl.h>
#pragma comment(lib, "ntdll.lib")
using namespace std;
EXTERN_C NTSYSAPI NTSTATUS NTAPI NtCreateThreadEx(PHANDLE,
ACCESS_MASK, LPVOID, HANDLE, LPTHREAD_START_ROUTINE, LPVOID,
BOOL, SIZE_T, SIZE_T, SIZE_T, LPVOID);
typedef HMODULE(__stdcall* _LdrLoadDll)(
wchar_t* PathToFile,
unsigned long Flags,
PUNICODE_STRING ModuleFileName,
PHANDLE* ModuleHandle
);
_LdrLoadDll LdrLoadDll;
int main()
{
DWORD targetProcId = 10340; //Proc id to inject
wchar_t targetDllPath[255] = L"C:\\DllTest32.dll"; //dll path to inject
unsigned short targetDllPathLength = sizeof(targetDllPath);
HANDLE targetOpened = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcId);
LPVOID allocatedMem = VirtualAllocEx(targetOpened, 0, targetDllPathLength, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
bool wpm = WriteProcessMemory(targetOpened, allocatedMem, targetDllPath, targetDllPathLength, 0);
LdrLoadDll = (_LdrLoadDll)GetProcAddress(GetModuleHandleA("ntdll.dll"), "LdrLoadDll");
UNICODE_STRING name;
name.Buffer = targetDllPath;
name.Length = wcslen(name.Buffer) * sizeof(wchar_t);
name.MaximumLength = name.Length + sizeof(wchar_t);
PHANDLE Module;
HANDLE rt;
NtCreateThreadEx(
&rt, PROCESS_CREATE_THREAD, NULL, targetOpened,
(LPTHREAD_START_ROUTINE)LdrLoadDll((wchar_t*)0, 0, &name, &Module),
allocatedMem, FALSE, NULL, NULL, NULL, NULL);
}
解决方案
推荐阅读
- python-3.x - 有人可以向我解释为什么 return 语句应该包含在这段代码中吗?
- javascript - 我如何从动态长度的javascript数组中创建n个块
- javascript - 带有日期的 JS If 语句
- sql-server - 我的 ASP.NET Core 应用程序生成的数据库在哪里?
- javascript - 更简单的价值计算
- php - 尝试使用 php 中的字符串匹配获取数组值时创建了两个数组
- r - 为 R 中的每两列命名
- android - 如何在顶层视图上接收拖动事件,但通过点击?
- java - 为什么以及何时出现 ExceptionWebSocketHandlerDecorator?
- amazon-web-services - AWS ECS runTask 覆盖端口映射