为啥我的 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 只能通过手动映射注入?的主要内容,如果未能解决你的问题,请参考以下文章