拒绝访问Kiosk程序进程

我有一个自助terminal应用程序,必须禁用任务pipe理器,以防止用户closures程序
但是一些用户需要TaskManagerclosures挂起的程序。

任何帮助都可以被占用。

不过,我相信在Windows中有一个函数来防止closures程序的进程,因为当一个人试图杀死rundll.exe进程。 我想知道这个函数,如果我可以用DllImport调用它

任何人都可以帮忙吗?
黑客?
一个函数?
任何其他解决scheme

编辑:

至less如果没有办法阻止进程被closures,我需要一种方法来隐藏它出现在任务pipe理器中的进程列表。

编辑2:到目前为止我找不到解决scheme

一种方法是,如果可以在管理上下文中访问进程ID,则拒绝对最终用户的进程的PROCESS_TERMINATE权限。 终止进程(通过任务管理器或其他上下文)默认授予所有者,但可以明确拒绝。 拒绝时,终止进程将要求所有者手动更改ACL,然后终止进程。 如果用户既不是管理员也不是流程的所有者,他将不能强行终止流程(例如通过任务管理器),尽管流程将被允许正常退出。

下面的代码在进程中使用Everyone组的成员的PID processid显式拒绝ACE。

 #include "Aclapi.h" #include "Sddl.h" DWORD RestrictTerminateOnProcessId(DWORD processid) { PACL dacl = NULL, newdacl = NULL; HANDLE ph = NULL; PSECURITY_DESCRIPTOR* desc = NULL; PSID everyonesid = NULL; ph = OpenProcess(WRITE_DAC | READ_CONTROL, false, processid); if (!ph) goto cleanup; if (ERROR_SUCCESS != GetSecurityInfo(ph, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &dacl, NULL, desc)) goto cleanup; SID_IDENTIFIER_AUTHORITY WorldAuth = SECURITY_WORLD_SID_AUTHORITY; if (!AllocateAndInitializeSid( &WorldAuth,1,SECURITY_WORLD_RID, 0,0,0,0,0,0,0,&everyonesid)) goto cleanup; // begin copy dacl _ACL_SIZE_INFORMATION si; GetAclInformation(dacl, &si, sizeof(si), AclSizeInformation); DWORD dwNewAclSize = si.AclBytesInUse + (2*sizeof(ACCESS_DENIED_ACE)) + (2*GetLengthSid(everyonesid)) - (2*sizeof(DWORD)); newdacl = (PACL)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwNewAclSize); if (newdacl == NULL) goto cleanup; if (!InitializeAcl(newdacl, dwNewAclSize, ACL_REVISION_DS)) goto cleanup; if (!AddAccessDeniedAce(newdacl, ACL_REVISION_DS, PROCESS_TERMINATE, everyonesid)) goto cleanup; for (int i = 0; i < si.AceCount; i++) { LPVOID pace = NULL; if (!GetAce(dacl, i, &pace)) goto cleanup; if (!AddAce(newdacl, ACL_REVISION_DS, MAXDWORD, pace, ((PACE_HEADER)pace)->AceSize)) goto cleanup; } // end copy dacl if (!SetSecurityInfo(ph, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, newdacl, NULL)) goto cleanup; SetLastError(0); cleanup: DWORD ret = GetLastError(); if (desc) LocalFree(desc); if (newdacl) HeapFree(GetProcessHeap(), 0, (LPVOID)newdacl); if (ph) CloseHandle(ph); if (everyonesid) FreeSid(everyonesid); return !ret; } 

您可以创建一个在启动时运行的服务。 然后,它会监视用户登录并启动程序。 从那里你有两个选择:

  1. 让它在程序中等待,只要用户的会话持续,就重新启动它。
  2. 在管理员帐户下运行它,并确保用户始终在有限的帐户上运行。 Windows的特权执行应该照顾你的程序不会死亡。

如果您必须允许用户的管理权限(并因此可以终止您的服务),请确保注册您的服务,以便SCM 自动重新启动服务。

除此之外的任何事情都需要进行一些内核攻击,就像mdm所说的那样,或者潜入rootkit领域。 我建议你避免。

如果有机会,你还在运行Windows XP,而不是系统服务,你可以注册一个Winlogon通知包 。 它们基本上是不可驱动的,因为它们在winlogon.exe的环境下运行,这是从Vista和以上版本中删除的原因。

正确的做法是:

为Kiosk应用程序创建一个用户。 让我们说KioskUser创建其他用户在计算机中做的东西。 让我们说用户1他们都不应该是管理员。 他们不需要是管理员权利? 他们当然可以有特权。

您将照常使用User1帐户。 然后,您以KioskUser的身份运行Kiosk应用程序。 (使用runas命令) – 将该应用程序添加到会话并使其可见(有关此更多信息,请参阅参数)

当用户1进入并且Kiosk应用程序从KioskUser运行时,User1不能终止进程。

我不会推荐“黑客”系统,也不会改变注册表上的东西。 此外,您可以使Kiosk应用程序成为服务,并在Kiosk用户下运行。

这听起来像你不能阻止一个进程被杀害 – 看到这个问题 ,特别是链接发布到一个解释 。

但是,您可以阻止用户从任务栏(右键单击 – >打开任务管理器),按Ctrl-Shift-Esc或在命令提示符处使用以下注册表项键入taskman打开任务管理器:

 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr 

将其设置为1将禁用任务管理器,0将再次启用它。

在命令提示符下,像这样禁用它:

 reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 1 /f 

而且你可以使用这个命令来进行修改:

 reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 0 /f 

您还需要找到一种防止用户在注册表中写入此密钥的方法 – 尽管在我的Windows 7 64位机器上,我必须先打开管理命令提示符,然后才能更改密钥。

编辑

正如评论中所建议的那样,您可以拦截低级系统调用来更改报告的进程列表。 这个答案避而远之,你基本上必须编写一个内核模式的rootkit – 可能作为设备驱动程序来实现。 由于在Vista和更高版本中进行了内核更改,这可能仅适用于Windows XP及更低版本。 可以这样做,我的一个朋友为他的BSc最后一年的论文创建了一个原型。

您还必须考虑其他查询过程的方法 – IIRC NtQuerySystemInformation并不是枚举过程的唯一方法。

虽然在这种情况下您需要使用的方法是“类似恶意软件的”,但是要小心,因为您无法使用某些rootkit /驱动程序来保护您的Kiosk应用程序。

这里http://blogs.msdn.com/b/oldnewthing/archive/2004/02/16/73780.aspx你可以看到一方为什么这是一个不太可能的任务,另一方面你可能会必须防&#x5FA1;…这将是:

拒绝PROCESS_TERMINATE
拒绝PROCESS_CREATE_THREAD
拒绝PROCESS_VM_WRITE
拒绝PROCESS_SUSPEND_RESUME
再加上任何防御措施,你都可以用手对付调试器 – 这是另一个非常棘手的事情。

对不起,没有发表评论(没有足够的声望)。 我正在使用drfs解决方案,但它似乎引起GetSecurityInfo使用方式的内存泄漏。 我改变了代码,摆脱了这样的内存泄漏:

宣言:

 PSECURITY_DESCRIPTOR desc = NULL; 

初始化:

 desc = (PSECURITY_DESCRIPTOR)GlobalAlloc(GMEM_FIXED, sizeof(PSECURITY_DESCRIPTOR)); 

清理:

 if (desc) GlobalFree(desc); 

呼叫:

 GetSecurityInfo(ph, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &dacl, NULL, &desc) 

我也发现这个问题的文章: http : //i1.blogs.msdn.com/b/oldnewthing/archive/2012/12/12/10376639.aspx

虽然您无法阻止授权用户杀死您的进程,但可以阻止用户拥有必要的权限来终止进程。 也就是说,本地管理员将永远有权终止任何进程。 您希望阻止任何用户或非管理员关闭您的应用程序吗? 如果前者,简单地在专用的用户帐户下运行该进程可能就足够了。