如Process Hacker那样卸载dll

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如Process Hacker那样卸载dll相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

你试着在自我进程中卸载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

以上是关于如Process Hacker那样卸载dll的主要内容,如果未能解决你的问题,请参考以下文章

应用程序使用的 DLL 的热卸载/重新加载

Process Hacker:多功能系统监控软件,支持检测恶意软件

手动卸载dll的方法(步骤)(此方法只针对手动注入的DLL有效)

错误记录Android 中调用 Process 命令行执行指令 ( java.lang.IllegalThreadStateException: process hasn‘t exited )(代码片

c# 如何用using引入 process 类

Hacker--基本术语