18

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

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

egui.exe 进程在普通用户(非管理员)下运行,我尝试使用管理帐户以各种方式杀死它。这是我尝试过的。

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

然后我开始了一些编程,发现:

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

  • 在管理员帐户下,您可以使用所需的任何访问权限打开它(当然在启用调试权限之后),但随后对 TerminateProcess()、GetKernelObjectSecurity()、SetKernelObjectSecurity() 的调用都失败并出现错误 5。

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

4

2 回答 2

6

如果你能从 Joanna Rutkowska 那里得到“System Virginity Verifier”,这应该会给你一个很好的主意,他们在哪里实现了他们的钩子。类似的工具(包括GMER)可用于调查系统内部发生的情况。这听起来可能很奇怪,但有时 AV 使用恶意软件中也常见的技术,即 rootkit 技术,以试图保护他们的软件不被愚弄。

听起来 SSDT-Hooking 和类似的技术已被用于“保护”该过程。我对此的第一枪是暂停该进程的所有线程。大多数此类保护机制(恶意软件和反恶意软件等)仅在终止尝试时触发。但是一旦你挂起所有线程(Process Explorer 可以这样做),调度程序将不再调度它们(导致没有 CPU 使用)。

SSDT(有时是 SDT)代表系统服务描述符表。是系统服务的功能地址表(系统服务的编号为索引)。当您CreateFile从 Win32 应用程序调用类似的东西时,它将最终以 NTDLL 调用NtCreateFile(==ZwCreateFile在 UM 中)。从那里开始,机制(自 Windows 2000/XP 以来发生了变化)在转换到内核模式 (KM) 的方式上会有所不同,也就是“环 0”。无论如何,NtCreateFileNTDLL中的实现大致做了以下事情:它将系统服务的索引移动到一个寄存器中,然后调用用于转换到KM的方法(sysenter较新的实现中的操作码)。到达 KM 后,处理程序将检查索引,从 SSDT 中找出函数地址,然后调用该函数。这里有更多对 UM 堆栈的检查(当您来自 UM 时),但这是简单的过程。所以当你在这个级别挂钩功能时,你可以阻止任何子系统,包括 Win32 子系统做事。然而,这有几个问题(你是其中最少的)。大多数实施者做得不好,这在​​恶意软件中很常见,例如索尼在 2005 年选择放入一些音频 CD 的 rootkit。因此,如果不冒险进行错误检查和几个独立的代码段钩住相同的代码,解钩几乎是不可能的SSDT 索引通常也会由于部分实施者的鲁莽而导致问题。

因此暂停线程似乎是一种可能性,尽管这个问题当然是开放式的(不知道 ESET 驱动程序的详细信息)。但是,如果它们也阻止了这种情况,您确实应该考虑更换产品。我敢打赌,此类产品对系统稳定性的不利影响超过了额外的“保护”,尽管它们 (ESET) 会告诉你其他情况。

另一种可能的方法是注入代码(例如通过 DLL)并让进程本身调用ExitProcess. 这也取决于他们的钩子是否允许这个漏洞。

于 2012-06-26T19:23:16.050 回答
1

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

  1. 如果您试图杀死的进程的子线程正在等待某个内核对象,则在等待完成之前它不会被终止。这可能会导致应用程序停止响应。进程中的任何线程都被标记为终止——这是进程终止步骤之一;
  2. 诸如防火墙、AV 和其他与安全相关的东西之类的智能软件总是安装内核挂钩(也称为挂钩 - 拦截在内核对象或软件组件之间传递的 API 调用、消息或事件)。他们总是有盾牌来抵御外力。

您收到 ERROR_ACCESS_DENIED。我不知道您经历了哪些步骤,但我可以建议您这样做:

  1. 打开任务管理器并转到进程选项卡;
  2. 右键单击egui.exe,然后单击属性;
  3. 单击安全选项卡,然后单击编辑。
  4. 在“权限”窗口中检查您的凭据;
  5. 添加用户和/或设置完整权限。

你可以玩弄它,因为即使你对你的应用程序进行分层(我想这就是你试图做的事情),它也会使用你帐户的凭据。

于 2012-06-26T19:02:44.807 回答