如何从目标进程卸载 DLL?

How to unload a DLL from a target Process?

我在 Injector 工作,但是当我尝试卸载/卸载目标进程时,它直接关闭,我不知道为什么会这样。

这是我如何将 DLL 注入/加载到目标进程中的代码。 executionId 是目标进程,它是 PID。最后,我在等待 LoadLibraryA 函数的完成。

HANDLE proc;
HANDLE thread;
LPVOID remoteString, loadLib;

proc = OpenProcess(CREATE_THREAD_ACCESS, FALSE, executionId);

loadLib = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
remoteString = (LPVOID)VirtualAllocEx(proc, NULL, strlen(library.c_str()), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(proc, (LPVOID)remoteString, library.c_str(), strlen(library.c_str()), NULL);
thread = CreateRemoteThread(proc, NULL, NULL, (LPTHREAD_START_ROUTINE)loadLib, (LPVOID)remoteString, NULL, NULL);

std::cout << "Finished" << std::endl;
WaitForSingleObject(thread, INFINITE);

VirtualFreeEx(proc, remoteString, strlen(library.c_str()) + 1, MEM_RELEASE);
CloseHandle(thread);
CloseHandle(proc);

现在我正在尝试取消注入/卸载进程内的 DLL。我在 DLL 中执行此操作:

FreeLibrary(hModule, 0);

此代码正在关闭 DLL 所在的目标进程。 有什么想法或解决方案吗?

它正在崩溃,因为在 FreeLibrary 调用之后仍有 运行 的代码(returns 到 windows 线程启动代码的尾声代码),但该代码在之后消失了FreeLibrary 调用。

使用 FreeLibraryAndExitThread 而不是 FreeLibrary,你应该会很好。