为啥我的 DLL 只能通过手动映射注入?

Posted

技术标签:

【中文标题】为啥我的 DLL 只能通过手动映射注入?【英文标题】:Why can my DLL only inject with manual mapping?为什么我的 DLL 只能通过手动映射注入? 【发布时间】:2019-11-20 14:26:41 【问题描述】:

所以我制作了一个包含大量代码的 DLL,而且我知道它以前可以工作。我已经格式化了我的电脑并更新了我的 DLL。使用极端注入器,DLL 将仅使用手动映射注入。这很好,但我想知道我需要更改什么才能使其能够使用标准方法进行注入。

bool Inject(DWORD pId, char *dllName)

	HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, pId);
	if (h)
	
		LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
		LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
		WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL);
		HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);
		if (!asdc)
		
			printf(to_string(GetLastError()).c_str());
		
		WaitForSingleObject(asdc, INFINITE);
		VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE);
		CloseHandle(asdc);
		CloseHandle(h);
		return true;
	
	return false;

【问题讨论】:

也许是您要注入的应用程序阻止它使用CreateRemoteThread进行注入 @Brandon 我已经用一个简单的 hello world 消息框测试了其他注入方法。该 DLL 工作正常。 没有代码或任何东西,我们将无法理解问题所在 需要提供DLL注入失败的信息,比如CreateRemoteThread的返回值。而且注入失败的原因有很多,比如版本不一致,参考[this].(***.com/questions/13980270/…) @StriveSun-MSFT 请注意,我已从在线资源中获得此代码。这个注射器已经为我工作了很多次。据我所知,虽然我的注射器没有返回任何错误代码。从我所见,虽然 DLL 显然没有被注入。我已经在线程中添加了注入的代码。 【参考方案1】:

我可能为时已晚,但这不起作用,因为您将 DLL 名称的所有字符复制到进程中,而字符串末尾没有空终止字符。要解决这个问题,只需将您使用strlen(dllName) 的所有位置替换为strlen(dllName) + 1。当在目标进程中调用 LoadLibraryA 时,由于缺少空终止符,它会读取 DLL 路径的末尾,从而尝试注入磁盘上不存在的 DLL。

你也应该在调用VirtualFreeEx时将0作为size参数传递,否则它实际上不会被释放。

【讨论】:

以上是关于为啥我的 DLL 只能通过手动映射注入?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 MS 绕道注入多个 Dll?

为啥注入的任何 DLL 都会使主机进程崩溃?

Dll注入:修改PE文件 IAT注入

为啥某些 VB6 DLL 被加载为映射文件?

防止来自Dll C ++的Dll注入

vc 无dll的代码注入