Winapi 如何从目标进程卸载注入的DLL,完成后从DLL卸载?

Winapi 如何从目标进程卸载注入的DLL,完成后从DLL卸载?,winapi,visual-c++,dll,dll-injection,Winapi,Visual C++,Dll,Dll Injection,我有一个使用CreateRemoteThread/LoadLibrary方法注入自身的DLL 在调试和开发DLL时,退出目标应用程序并重新启动它(加载时间为10-20秒)是很麻烦的,因此我希望在检查代码是否有效后卸载DLL,以重新编译/重新注入它 我希望避免使用加载和卸载所述DLL的框架创建新DLL 这是怎么可能的?在生成线程的情况下,当该线程完成它正在执行的任何操作时,您可以使用: FreeLibraryAndExitThread函数允许在DLL中执行的线程安全地释放它们正在执行的DLL并自行

我有一个使用CreateRemoteThread/LoadLibrary方法注入自身的DLL

在调试和开发DLL时,退出目标应用程序并重新启动它(加载时间为10-20秒)是很麻烦的,因此我希望在检查代码是否有效后卸载DLL,以重新编译/重新注入它

我希望避免使用加载和卸载所述DLL的框架创建新DLL

这是怎么可能的?

在生成线程的情况下,当该线程完成它正在执行的任何操作时,您可以使用:

FreeLibraryAndExitThread函数允许在DLL中执行的线程安全地释放它们正在执行的DLL并自行终止如果它们分别调用FreeLibrary和ExitThread,则会存在竞争条件。可以在调用ExitThread之前卸载库。


从这段引文中,我用简单的英语声明,您不应该从DllMain中调用此函数,您需要以与插入代码加载库时相同的方式执行此操作,只是需要插入代码以在其自己的进程上下文中卸载库。在不再需要库之后注入代码。这应该在最后一个仍然可以控制的函数中完成。但是,您需要汇编知识来生成库卸载程序代码。它是什么类型的DLL?您是否可以控制呼叫应用程序?如果是COM,你可以从参考计数中获得信息。如果您可以控制主机,只需将其全部释放并调用
freebrary()
@Deanna:正确,就这么简单!我可以控制进行注入的过程,但不能控制被注入的过程。我的下一个问题是,我从DllMain生成了一个线程来完成它的工作,当我告诉线程结束时,我是否将FreeLibrary(GetModuleHandle(L“My.dll”))称为最后一个线程?