如Process Hacker那样卸载dll

问题描述 投票:-4回答:1

我想像Process Hacker那样卸载程序的DLL。

我正在获取CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPALL, dwProcId)的模块列表,它允许我一个MODULEENTRY32包含我要卸载的DLL的信息。

FreeLibrary()FreeLibraryAndExitThread()don不做任何事情,因为该程序正在使用该DLL。这就是为什么我不知道Process Hacker在使用它的过程中如何做到这一点。

所以这是我的问题:Process Hacker如何卸载另一个程序使用的dll?我试图查看源代码但找不到任何东西。

现在我知道它可能导致程序崩溃,但这不是问题。

c winapi dll module process
1个回答
4
投票

你试着在自我进程中卸载DLL吗?如果是 - 只需致电FreeLibrary。如果在另一个过程中 - 你需要调用CreateRemoteThread,其入口点为FreeLibraryhmod为param。当然如果你在与目标进程相同的终端会话中运行(连接到相同的csrss),否则你需要使用更低级别的例程来创建线程(RtlCreateUserThread)和调用FreeLibrary并退出的shell代码,因为RtlCreateUserThread的入口点必须直接打电话RtlExitUserThreadExitThread。 (CreateRemoteThread的入口点可以简单地返回 - 之后将自动调用ExitThread

无论如何库可以固定,不能被FreeLibrary卸载 - 例如GET_MODULE_HANDLE_EX_FLAG_PIN。所有由exe导入静态加载的库总是被固定 - 不能被FreeLibrary卸载。

也存在选项 - 直接调用ZwUnmapViewOfSection与目标进程句柄和dll的基地址 - dll通过ZwMapViewOfSection映射,并且可以始终通过ZwUnmapViewOfSection取消映射(即使“固定”)。当然,在这种情况下,dll的加载器结构不是免费的,但是dll本身将从进程地址空间中取消映射。

但是这两种方式都是不正确的 - 如果有人在此之后调用此dll将会是什么?

我知道它可能导致程序崩溃,但这不是问题。

在这种情况下 - 只需终止程序 - 调用TerminateProcess和所有。这是更简单有效的比较尝试卸载具有相同最终效果的具体dll

© www.soinside.com 2019 - 2024. All rights reserved.