2017-06-12 2 views
4

Ich schreibe eine App in C# und C++/CLI, und ich habe Code, der Prozesse aussetzt. Ich möchte jedoch verhindern, dass sie durch einen anderen Prozess (z. B. den Prozess-Explorer) deaktiviert werden. Ist es möglich, ein exklusives Prozess-Handle zu erhalten oder andere Anwendungen anderweitig daran zu hindern, diesen Vorgang durchzuführen? Und wenn ja, wie?Exclusive Process Handle erhalten

+0

Die beste Richtung, die ich Ihnen geben kann, wäre die MSDN-Dokumentation zu [Prozesssicherheit und Zugriffsrechte] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880 (v = vs.85) .aspx). Sie können möglicherweise die ACLs der Prozesse ändern, die Sie suspendieren, um zu verhindern, dass andere Prozesse die Prozesse aufheben. Wenn Sie die Sperre dann aufheben möchten, müssen Sie die ACL erneut ändern, die Aufhebung der Sperre aufheben und die Zugriffssteuerungsliste erneut einschränken. Andere Prozesse mit ausreichend hohen Zugriffsrechten (wie "SeDebugPrivilege", die Ihre App wahrscheinlich auch benötigt) können jedoch Ihre Einschränkungen außer Kraft setzen. – ozeanix

+0

Und für das, was es wert ist, nur "SeDebugPrivilege" für Ihre eigene App zu bekommen kann eine ziemliche Herausforderung sein!Meine Erinnerung ist, dass Ihre App als 'SYSTEM'-Benutzer ausgeführt werden muss, um genügend Privilegien zu haben, um seine eigene Privilegliste zu ändern. – ozeanix

+1

@ozeanix, nicht wenn du es richtig machst. Jeder Prozess, der mit Administratorrechten ausgeführt wird, kann Debug-Berechtigungen aktivieren. (Nun, in der Standardkonfiguration sowieso.) –

Antwort

3

Dies ist aus dem Benutzermodus nicht möglich.

Jeder Prozess, bei dem SE_DEBUG_PRIVILEGE im Token aktiviert ist, kann den Prozess/Thread-Handle mit allen Zugriffen öffnen (nur wenn der Prozess nicht geschützt ist).

vom Kernel-Modus können Sie eigenen Rückruf mit ObRegisterCallbacks registrieren und Prozess/Threads offenen Versuch zu filtern. sagen Sie verweigern Griff öffnen oder entfernen PROCESS_SUSPEND_RESUME, THREAD_SUSPEND_RESUME und THREAD_RESUME von DesiredAccess in OB_PRE_CREATE_HANDLE_INFORMATION. aber dies verhindert nicht, dass ein anderer Kernelmodus-Code-Aufruf api PsResumeProcess exportiert wird.

im Allgemeinen Objektgriffe unterstützen teilweise exklusiven Zugriff. Suchen Sie nach OBJ_EXCLUSIVE Flag in OBJECT_ATTRIBUTES (Dies wird immer als 3-Parameter an alle Open/Create Objekt Aufruf übergeben - ZwOpenProcess als auch), aber dies wird nur Arbeit , wenn die Flag gesetzt wurde, wenn das Objekt erstellt wurde. sonst haben Sie STATUS_INVALID_PARAMETER oder wenn Handle bereits von einem anderen Prozess geöffnet wurde, haben Sie STATUS_ACCESS_DENIED. aber weil Prozesse immer ohne Flag erstellt - Sie und kann es nicht öffnen Griff in exklusiven (ich schon nicht darüber in csrss.exe im Zusammenhang mit der Prozesssitzung bereits bestehen öffnen Griff zu Ihrem Prozess)

0

Sie können Code in einen anderen zu injizieren Verarbeiten und patchen Sie die von NTDLL exportierten NtResumeProcess- und NtResumeThread-Routinen. Die exportierten Routinen führen einen Systemaufruf durch, den Sie jedoch abfangen können, bevor dieser Übergang stattfindet, und leiten die Ausführung an Ihre eigene Rückrufroutine weiter, um Filterung anzuwenden - STATUS_ACCESS_DENIED oder einen anderen geeigneten NTSTATUS-Fehlercode zurückgeben, um den Vorgang zu blockieren.

Dies verhindert jedoch nicht, dass jemand Ihren Patch mit einem manuellen Systemanruf umgehen kann. Ihre beste Wette ist ObRegisterCallbacks und Strippen PROCESS_SUSPEND_RESUME für jeden anderen Anrufer als Sie.

Die erste Methode über Laufzeit-Byte-Patching ist in Ordnung, da das Hooking im Benutzermodus keine Rolle spielt, solange es korrekt ausgeführt wird. Es gibt auch Open-Source-Bibliotheken, um dies zu erreichen, Microsoft besitzt auch eine eigene API-Hooking-Bibliothek namens MS Detours. Die ObRegisterCallbacks-Methode erfordert einen Gerätetreiber im Kernelmodus, und damit ist eine digitale Signatur erforderlich, die das Signieren im Kernelmodus unterstützt (und für die Unterstützung von Systemen, auf denen Secure Boot aktiviert ist, benötigen Sie eine Extended Validation-Signatur wird nur an wirklich registrierte Unternehmen vergeben und ist sehr viel teurer).

Viel Glück.