【发布时间】:2019-09-13 09:32:14
【问题描述】:
我正在尝试将 dll 注入进程。 dll 除了返回 TRUE 之外什么都不做。
我将调试器附加到要注入的进程中,并确认 LoadLibraryA 被正确调用但返回 NULL。
现在我认为这可能与我的 dll 的依赖关系有关。所以我检查了它们,发现它需要vcruntime140.dll。
我想将我的 dll 注入的进程不会加载该 dll。
#include "pch.h"
extern "C" int __stdcall APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
#include "Source.h"
const char* DllName = "InjectMe.dll";
int main()
{
DWORD processID = 0;
printf("Process ID: ");
scanf_s("%i", &processID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
if (handle == nullptr) {
printf("Process could not be opened.");
return -1;
}
LPVOID memDllName = VirtualAllocEx(handle, nullptr, strlen(DllName) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
assert(memDllName != nullptr);
assert(WriteProcessMemory(handle, memDllName, DllName, strlen(DllName) + 1, nullptr));
LPVOID loadLibraryAddr = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
assert(loadLibraryAddr != nullptr);
HANDLE thread = CreateRemoteThreadEx(handle, nullptr, 0, (LPTHREAD_START_ROUTINE)loadLibraryAddr, memDllName, CREATE_SUSPENDED, nullptr, nullptr);
assert(thread != nullptr);
ResumeThread(thread);
DWORD returnCode = WaitForSingleObject(thread, 5000);
CloseHandle(thread);
if (returnCode == WAIT_TIMEOUT) {
printf("DLL was not loaded. Thread timed out.");
return -1;
}
else if (returnCode == WAIT_OBJECT_0) {
printf("DLL was successfully injected into the process.");
}
CloseHandle(handle);
std::cin.get();
return 0;
}
【问题讨论】:
-
为“@err”添加一个监视,以便您可以看到 winapi 错误代码。错误 126 是文件未找到错误,这是 LoadLibrary 最常见的故障模式。几乎保证在您使用“InjectMe.dll”时会发生,请指定文件的完整路径,这样您就不会依赖注入进程的搜索规则。
-
还要检查 32 位和 64 位,因为您不能将两者混合使用。
-
@HansPassant 你的答案是正确的。我以为我在某处读到过,只要 dll 位于注入进程的 exe 中,传递相对路径就可以了。现在假设我似乎有点愚蠢,而且总是简单地通过绝对路径更不容易出错。
-
我的回答是否需要任何澄清或改进才能回答您的问题?如果有,请回复,我会尽力改进。接受答案向更广泛的社区表明您找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
标签: c++ dll code-injection