如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
,其入口点为FreeLibrary
,hmod
为param。当然如果你在与目标进程相同的终端会话中运行(连接到相同的csrss),否则你需要使用更低级别的例程来创建线程(RtlCreateUserThread
)和调用FreeLibrary
并退出的shell代码,因为RtlCreateUserThread
的入口点必须直接打电话RtlExitUserThread
或ExitThread
。 (CreateRemoteThread
的入口点可以简单地返回 - 之后将自动调用ExitThread
)
无论如何库可以固定,不能被FreeLibrary
卸载 - 例如GET_MODULE_HANDLE_EX_FLAG_PIN
。所有由exe导入静态加载的库总是被固定 - 不能被FreeLibrary
卸载。
也存在选项 - 直接调用ZwUnmapViewOfSection
与目标进程句柄和dll的基地址 - dll通过ZwMapViewOfSection
映射,并且可以始终通过ZwUnmapViewOfSection
取消映射(即使“固定”)。当然,在这种情况下,dll的加载器结构不是免费的,但是dll本身将从进程地址空间中取消映射。
但是这两种方式都是不正确的 - 如果有人在此之后调用此dll将会是什么?
我知道它可能导致程序崩溃,但这不是问题。
在这种情况下 - 只需终止程序 - 调用TerminateProcess
和所有。这是更简单有效的比较尝试卸载具有相同最终效果的具体dll
以上是关于如Process Hacker那样卸载dll的主要内容,如果未能解决你的问题,请参考以下文章
Process Hacker:多功能系统监控软件,支持检测恶意软件
手动卸载dll的方法(步骤)(此方法只针对手动注入的DLL有效)
错误记录Android 中调用 Process 命令行执行指令 ( java.lang.IllegalThreadStateException: process hasn‘t exited )(代码片