我正在使用ESet防病毒软件,最近它的GUI前端egui.exe挂起并占用了50%的CPU(即一个核心的100%)。令人惊讶的是,即使启用了调试权限,我也发现无法杀死它。
现在我很好奇:他们如何实现这样的防御,有没有办法在没有编写内核驱动程序的情况下杀掉它?
egui.exe进程在常规用户(非管理员)下运行,我尝试使用管理帐户以各种方式将其终止。这是我尝试过的。
然后我开始编程并发现:
在非特权用户下,您可以使用PROSESS_TERMINATE访问权限打开它,但实际调用TerminateProcess()失败,错误为5。
在管理员帐户下,您可以使用您想要的任何访问权限打开它(当然,在启用调试权限之后),但随后调用TerminateProcess(),GetKernelObjectSecurity(),SetKernelObjectSecurity()都会失败并显示错误5。 / p>
除了设置进程DACL之外,这肯定指出了某种摆弄,因为如果Terminate不在DACL中,你将无法在第一时间用PROCESS_TERMINATE打开进程。它们实际上拦截了Win32 API调用吗?如果是,那怎么样?我做了低级系统编程已经有一段时间了,所以请原谅我的无知。
答案 0 :(得分:5)
如果你能掌握Joanna Rutkowska的“System Virginity Verifier”,这应该会给你一个很好的主意 他们实现了他们的钩子。类似的工具(包括GMER)可用于调查系统内部发生的情况。这可能听起来很奇怪,但有时AV使用恶意软件中常见的技术,即rootkit技术,试图保护他们的软件不被愚弄。
听起来像SSDT-Hooking和类似的技术被用来“保护”这个过程。我对此的第一次尝试是暂停该过程的所有线程。大多数此类保护机制(恶意软件和反恶意软件等)仅在终止尝试时触发。但是一旦你挂起所有线程(Process Explorer可以做到这一点),调度程序将不再调度它们(导致没有CPU使用)。
SSDT(有时是SDT)代表系统服务描述符表。它是具有系统服务的功能地址的表(作为索引的系统服务的编号)。当您从Win32应用程序中调用CreateFile
之类的内容时,它最终会在NTDLL中调用NtCreateFile
(在UM中为== ZwCreateFile
)。从那里开始,机制(自Windows 2000 / XP以来已经发生变化)将如何转换为内核模式(KM),即“ring 0”。无论如何,NTDLL中NtCreateFile
的实现大致执行以下操作:它将系统服务的索引移动到寄存器中,然后调用用于在较新实现中转换为KM(sysenter
操作码的方法)。到达KM后,处理程序将检查索引,从SSDT中找出函数地址,然后调用该函数。这里有更多的UM堆栈检查(当你来自UM时),但这是简单的过程。因此,当您在此级别挂钩功能时,可以阻止任何子系统(包括Win32子系统)执行操作。但是,这附带了几个问题(你的问题最少)。大多数实施者都做得不好,这在恶意软件中经常可见,例如索尼在2005年选择放置一些音频CD的rootkit。因此,如果没有错误检查的风险和几个独立的代码挂钩,几乎不可能解开由于部分实施者的鲁莽行为,SSDT指数通常也会导致问题。
所以暂停线程似乎是可能的,虽然这个问题当然是开放式的(不知道ESET驱动程序的细节)。但是,如果它们也阻止了这一点,那么你应该考虑切换产品。我打赌这些产品的系统稳定性的缺点超过了额外的“保护”,尽管他们(ESET)会告诉你。
另一种可能的方法是注入代码(例如通过DLL)并让进程本身调用ExitProcess
。这还取决于他们的钩子是否允许这个漏洞。
答案 1 :(得分:1)
可能有不同的情况,比如说:
您正在收到ERROR_ACCESS_DENIED。我不知道你走了哪些步骤,但我可以建议:
你可以玩它,因为即使你盯着你的应用程序(这是你试图做的,我推测)它将使用你的帐户的凭据。