终止受保护的防病毒进程

时间:2012-06-26 17:38:39

标签: c++ security winapi kernel driver

我正在使用ESet防病毒软件,最近它的GUI前端egui.exe挂起并占用了50%的CPU(即一个核心的100%)。令人惊讶的是,即使启用了调试权限,我也发现无法杀死它。

现在我很好奇:他们如何实现这样的防御,有没有办法在没有编写内核驱动程序的情况下杀掉它?

egui.exe进程在常规用户(非管理员)下运行,我尝试使用管理帐户以各种方式将其终止。这是我尝试过的。

  • 你无法从任务管理器中删除它
  • 你无法使用pskill杀死它
  • 你不能使用进程资源管理器杀死它,也不能将调试器附加到它

然后我开始编程并发现:

  • 在非特权用户下,您可以使用PROSESS_TERMINATE访问权限打开它,但实际调用TerminateProcess()失败,错误为5。

  • 在管理员帐户下,您可以使用您想要的任何访问权限打开它(当然,在启用调试权限之后),但随后调用TerminateProcess(),GetKernelObjectSecurity(),SetKernelObjectSecurity()都会失败并显示错误5。 / p>

除了设置进程DACL之外,这肯定指出了某种摆弄,因为如果Terminate不在DACL中,你将无法在第一时间用PROCESS_TERMINATE打开进程。它们实际上拦截了Win32 API调用吗?如果是,那怎么样?我做了低级系统编程已经有一段时间了,所以请原谅我的无知。

2 个答案:

答案 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)

可能有不同的情况,比如说:

  1. 如果您尝试杀死的进程的子线程正在等待某个内核对象,则在等待完成之前不会终止它。这可能导致应用程序停止响应。进程中的任何线程都标记为终止 - 这是进程终止步骤之一;
  2. 像防火墙,AV和其他与安全相关的东西这样的智能软件总是安装内核钩子(也就是挂钩 - 拦截API调用,消息或在内核对象或软件组件之间传递的事件)。他们总是有一个盾牌来保护外部力量。
  3. 您正在收到ERROR_ACCESS_DENIED。我不知道你走了哪些步骤,但我可以建议:

    1. 打开任务管理器并转到“进程”选项卡;
    2. 右键单击egui.exe并单击Properties;
    3. 单击“安全”选项卡,然后单击“编辑”。
    4. 在“权限”窗口中,检查您的凭据;
    5. 添加用户和/或设置完整权限。
    6. 你可以玩它,因为即使你盯着你的应用程序(这是你试图做的,我推测)它将使用你的帐户的凭据。