gpt4 book ai didi

c - 像 Process Hacker 一样卸载 dll

转载 作者:行者123 更新时间:2023-11-30 21:15:51 29 4
gpt4 key购买 nike

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

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

但是 FreeLibrary()FreeLibraryAndExitThread() 不会执行任何操作,因为程序正在使用 dll。这就是为什么我不明白 Process Hacker 在使用时是如何做到这一点的。

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

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

最佳答案

您是否尝试在自身进程中卸载dll?如果是 - 只需调用 FreeLibrary。如果在另一个进程中 - 您需要调用 CreateRemoteThread 并将 FreeLibrary 的入口点和 hmod 作为参数。当然,如果您与目标进程在同一个终端 session 中运行(连接到同一个csrss),否则您需要使用更多低级例程来创建线程(RtlCreateUserThread)并且调用 FreeLibrary 并退出的 shell 代码,因为 RtlCreateUserThread 的入口点必须直接调用 RtlExitUserThreadExitThread。 (CreateRemoteThread 的入口点可以简单地返回 - ExitThread 将在此之后自动调用)

无论如何,库可以被固定并且不能被FreeLibrary卸载 - 例如 GET_MODULE_HANDLE_EX_FLAG_PIN 。此外,所有通过 exe 导入静态加载的库始终固定 - 无法通过 FreeLibrary 卸载。

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

但是这两种方式都是不正确的 - 如果有人在这之后调用这个 dll 会怎样?

I know that it can cause the program to crash but it isn't a problem.

在这种情况下 - 只需终止程序 - 调用 TerminateProcess 等。与尝试卸载具体的dll相比,这更简单、更高效,最终效果相同

关于c - 像 Process Hacker 一样卸载 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49093773/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com