Frage

Ich habe eine Kiosk -App und muss Task -Manager deaktivieren immer zu verhindern das Programm schließen von Benutzern.
Einige Benutzer benötigen jedoch den Taskmanager, um Hangprogramme zu schließen.

Jede Hilfe würde angeeignet.

Ich bin mir jedoch sicher, dass es in Windows eine Funktion gibt, um zu verhindern rundll.exe Prozess. Ich möchte diese Funktion wissen, wenn ich sie mit aufrufen kann DllImport

Kann jemand bei einem Trick helfen?
Ein Hack?
Eine Funktion?
Irgendeine andere Lösung?

BEARBEITEN:

Zumindest wenn es keine Möglichkeit gibt, zu verhindern, dass der Prozess geschlossen wird, benötige ich eine Möglichkeit, ihn vor der Prozesseliste zu verbergen, die im Task -Manager angezeigt wird.

Bearbeiten 2:Ich kann die Lösung bisher nicht finden

War es hilfreich?

Lösung

Ein Ansatz, wenn Sie in einem administrativen Kontext auf die Prozess -ID zugreifen können, besteht darin, die Erlaubnis für die Prozess_terminate im Prozess an Endbenutzer zu verweigern. Die Beendigung des Prozesses (über Task -Manager oder andere Kontexte) wird dem Eigentümer standardmäßig gewährt, kann jedoch ausdrücklich abgelehnt werden. Wenn es verweigert wird, muss der Eigentümer die ACL manuell ändern und dann den Prozess manuell ändern und dann den Prozess beenden. Wenn der Benutzer weder ein Administrator noch der Eigentümer des Prozesses ist, kann er den Prozess (z. B. über Task -Manager) nicht gewaltsam beenden, obwohl der Prozess normal beenden dürfte.

Der folgende Code setzt mit der PID ein explizites Verweigerungs -ACE auf den Prozess processid für Mitglieder der Gruppe alle Gruppe.

#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;
}

Andere Tipps

Sie können einen Dienst erstellen, der auf dem Boot ausgeführt wird. Es dann überwacht, wenn der Benutzer protokolliert in und startet Ihr Programm. Von dort aus haben Sie zwei Möglichkeiten:

  1. Lassen Sie es auf das Programm warten und beleben Sie es so lange, wie die Sitzung des Benutzers bestehen bleibt.
  2. Führen Sie es unter einem Administratorkonto aus und stellen Sie sicher, dass die Benutzer immer auf begrenzten Konten ausgeführt werden. Die Fortsetzung von Windows 'Privilegs sollte sich um Ihr Programm kümmern, das nicht stirbt.

Wenn Sie den Benutzern administrative Berechtigungen zulassen (und diese können Sie somit Ihren Service abtöten), stellen Sie sicher, dass Sie Ihren Service so registrieren, dass das SCM Startet es automatisch neu.

Alles darüber hinaus würde ein Kernel -Hacking erfordern, wie MDM sagte oder in das Gebiet des Rootkit eintauchen. Was ich vorschlagen würde, dass Sie vermeiden.

Wenn Sie zufällig noch Windows XP ausführen, können Sie sich anstelle eines Systemdienstes a registrieren Winlogon Benachrichtigungspaket. Sie sind im Grunde genommen unkillbar, da sie im Kontext von Winlogon.exe laufen, was der Grund ist, warum sie waren ENTFERNT von Vista und oben.

Der richtige Weg, dies zu tun, ist:

Erstellen Sie einen Benutzer für die Kiosk -Anwendung. Nehmen wir an, Kioskuser erstellen andere Benutzer, die Dinge im Computer machen. Nehmen wir an, user1 keiner von ihnen sollte Administrator sein. Sie müssen nicht Administratoren sein, oder? Sie können natürlich Privilegien haben.

Sie werden wie gewohnt User1 -Konto verwenden. Dann führen Sie die Kiosk -Anwendung als Kioskuser aus. (Verwenden Sie Runas -Befehl) - Fügen Sie die Anwendung zur Sitzung hinzu und machen Sie sie sichtbar (finden Sie in den Argumenten, um weitere Informationen dazu zu erhalten.)

Während der User1 in der und der Kiosk -Anwendung vom Kioskuser ausgeführt wird, kann der Benutzer1 den Prozess nicht abtöten.

Ich würde nicht empfehlen, das System zu "hacken" oder etwas in der Registrierung zu ändern. Außerdem können Sie die Kiosk -Anwendung zu einem Dienst machen und sie unter dem Kiosk -Benutzer ausführen.

Es hört sich so an, als ob Sie nicht verhindern können, dass ein Prozess getötet wird - siehe diese Frage und speziell die Link gepostet zu einer Erklärung.

Sie können jedoch verhindern, dass der Benutzer den Task-Manager aus der Taskleiste (rechter Klick-> Task-Manager öffnen), das Drücken von Strg-Shift-C. oder vom Tippen öffnen) taskman Bei der Eingabeaufforderung mit dem folgenden Registrierungsschlüssel:

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

Das Einstellen auf 1 deaktiviert den Task -Manager, 0 aktiviert es erneut.

Deaktivieren Sie sie aus der Eingabeaufforderung wie so:

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

Und Sie können mit diesem Befehl renable:

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

Sie müssen auch einen Weg finden, den Benutzer daran zu hindern, diesen Schlüssel in der Registrierung zu schreiben - obwohl ich unter meinem Windows 7 64 -Bit -Computer eine Admin -Eingabeaufforderung öffnen musste, bevor ich den Schlüssel ändern konnte.

Bearbeiten

Wie in den Kommentaren vorgeschlagen, können Sie einen Systemaufruf mit niedrigem Systemabschluss abfangen, um die Liste der gemeldeten Prozesse zu ändern. Diese Antwort Entzieht sich dafür, dass Sie im Grunde genommen einen Kernel -Mode -Rootkit schreiben müssen - wahrscheinlich als Gerätetreiber implementiert. Dies wird wahrscheinlich nur in Windows XP und unten aufgrund von Kerneländerungen in Vista und weiter funktionieren. Es kann jedoch getan werden, dass ein Freund von mir einen Prototyp für seine Dissertation des BSC -Abschlussjahres erstellt hat.

Sie müssen auch andere Abfragemethoden für Prozesse berücksichtigen - IIRC NtQuerySystemInformation Ist nicht der einzige Weg, wie Prozesse aufgezählt werden können.

Wenn Sie Ihre Kiosk-App nicht mit einem Rootkit/Treiber schützen können, können Sie nicht ... obwohl die Methoden, die Sie in diesem Zusammenhang verwenden müssten, "Malware-ähnlich" sind, also achten Sie auf ...

Hier http://blogs.msdn.com/b/oldnewing/archive/2004/02/16/73780.aspx Sie können auf der einen Seite sehen, warum dies eine Aufgabe ist, die nicht wirklich möglich ist, und auf der anderen Seite die verschiedenen Möglichkeiten, gegen die Sie sich verteidigen müssten ... was wäre:

Process_terate verweigern
Verweigern Sie process_create_thread
Verweigern Sie process_vm_write
Verweigern Sie process_suspend_resume
Außerdem können Sie gegen Debuggers in die Hände bekommen - ein weiteres sehr schwieriges Geschäft.

Tut mir leid, dass ich dies nicht als Kommentar veröffentlicht habe (nicht genug Ruf). Ich verwende eine DRFS -Lösung, aber es scheint ein Speicherleck mit der Art und Weise zu induzieren, wie GetCurityInfo verwendet wird. Ich habe den Code geändert und das Speicherleck wie folgt beseitigt:

Erklärung:

PSECURITY_DESCRIPTOR desc = NULL;

Initialisierung:

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

Aufräumen:

if (desc) GlobalFree(desc);

Anruf:

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

Ich habe diesen Artikel auch zu diesem Thema gefunden: http://i1.blogs.msdn.com/b/oldnewing/archive/2012/12/12/10376639.aspx

Obwohl Sie nicht verhindern können, dass ein autorisierter Benutzer Ihren Prozess abtötet, können Sie die Benutzer daran hindern, die erforderlichen Berechtigungen zu haben, um Ihren Prozess zu töten. Ein lokaler Administrator hat jedoch immer die Erlaubnis, einen Prozess zu töten. Ist Ihre Hoffnung, zu verhindern, dass Ihre Anwendung durch einen Benutzer oder nur Nicht-Adminssprung schließt? Wenn er erstere einfach unter einem dedizierten Benutzerkonto ausführt, reicht es möglicherweise aus, den Prozess auszusetzen, um den Trick auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top