Task Manager bei einem Programm unterdrücken



  • bitte nimms mit nich krumm, aber danke herr lehrer!!!

    greetz of balthazar

    ps: den werd ich gleich mal durchlesen in der hoffnung ein gleich guter programmierer zu werden wie du es schon bist...



  • Die versuchte Beleidigung und die Spitze am Schluß übersehe ich mal, dazu gibt es noch diese Infos:
    http://www.geocities.com/omeryesil/programming/visualcpp/killprocessbyname.htm



  • hä beleidigung (oke lehrer sind was böses, aber so schlimm?? - gebs ja zu wenn mich jemand lehrer schimpfen würde wär ich sehr sauer [sorry an alle lehrer hier])

    nö jetzt mein ichs aber ernst -> nett von dir, dass du mich darauf hingewiesen hattest, aber ich kenne den code bereits... werd nächstesmal den nicht so brutalen code nehmen!!! 🙂 🙂 🙂

    greetz of balthazar

    und nix für ungut das mit dem lehrer war echt gemein von mir und nicht ernstgemeint...



  • Nur so als Anmerkung,
    der Code in den FAQ greift als letztes Mittel ja auch auf TerminateProcess zurück,das lässt sich mit ExitProcess auch noch ne Spur sanfter erledigen.

    MfG Spacelord



  • naja...auch wenn das jez hier alles auf kontroversen stößt, danke für die verbesserung!



  • so: das hab ich mir nu zusammengeschustert....ein toller code!!!

    PostMessage(FindWindow(NULL,"Windows Task-Manager"),WM_CLOSE, 0, 0);



  • Spacelord schrieb:

    Nur so als Anmerkung,
    der Code in den FAQ greift als letztes Mittel ja auch auf TerminateProcess zurück,das lässt sich mit ExitProcess auch noch ne Spur sanfter erledigen.

    MfG Spacelord

    Meines Wissens nach (man korrigiere mich bitte, wenn ich falsch liege) kann ExitProcess keine fremden Prozesse killen, sondern nur den eigenen...
    Und genau darum ging es: Fremden Prozess beenden...



  • rrrrichtig!!,

    allerdings kann ich mit diesem code schnippel ja nur fenster schließen und keine prozesse im hintergrund...oder wie?,

    gibt es da auch noch was einfaches?



  • Schau Dir mal den zweiten Link an, den ich gepostet hatte...

    Da gibt es eine Funktion "KillProcessByName". Die kann z. B. sowas:

    KillProcessByName("notepad.exe");
    

    Müßte das sein, was Du suchst... benutzt allerdings TerminateProcess, was nach wie vor nicht die feine englische Art ist (worauf der Autor auch auf der Website hinweist).



  • Hepi schrieb:

    Spacelord schrieb:

    Nur so als Anmerkung,
    der Code in den FAQ greift als letztes Mittel ja auch auf TerminateProcess zurück,das lässt sich mit ExitProcess auch noch ne Spur sanfter erledigen.

    MfG Spacelord

    Meines Wissens nach (man korrigiere mich bitte, wenn ich falsch liege) kann ExitProcess keine fremden Prozesse killen, sondern nur den eigenen...
    Und genau darum ging es: Fremden Prozess beenden...

    Hi,
    grundsätzlich hast du natürlich Recht aber wir sind ja alle große Jungs ;).

    Also vom Prinzip her geht es so:

    #include <iostream>
    #include <windows.h>
    #include <tlhelp32.h>
    
    #define EXIT_PROCESS_EX 123
    
    int UI_GetProcId();
    void DisplayProcesses();
    bool CloseProcess(int,UINT= EXIT_PROCESS_EX);
    bool GetDebugPrivilege(bool);
    HANDLE GetProcessHandle(int);
    
    int main()
    {
    	DisplayProcesses();
    	CloseProcess(UI_GetProcId());
    
    	return 0;
    }
    
    void DisplayProcesses()
    {
    
    	HANDLE hSysSnapshot = NULL;
    	PROCESSENTRY32 proc;
    	proc.dwSize = sizeof(proc);
    	hSysSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );
    	Process32First(hSysSnapshot,&proc);
    	proc.dwSize = sizeof(proc);
    	do
    	{
    		printf("Prozess ID:%5d \t Name der Datei:%s \n",proc.th32ProcessID,proc.szExeFile);
    
    	}while(Process32Next(hSysSnapshot,&proc));
    
    	if(hSysSnapshot)
    	   CloseHandle(hSysSnapshot);
    }
    
    int UI_GetProcId()
    {
    	int temp=0;
    	std::cout<<"Welcher Prozess soll beendet werden? \nID:";
    	std::cin>>temp;
    
    	return temp;
    }
    
    bool CloseProcess(int id,UINT exitCode)
    {
    	bool ok=false;
    	HANDLE hProcess=NULL;
    	HANDLE hThread=NULL;
    	GetDebugPrivilege(true);
    	if((hProcess=GetProcessHandle(id))==NULL)
    		return ok;
    	else
    	{
    
    		PTHREAD_START_ROUTINE exitFunc=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32"),"ExitProcess");
    		if(exitFunc==NULL)
    			return ok;
    
    		hThread=CreateRemoteThread(hProcess,NULL,0,exitFunc,(LPVOID)exitCode,0,NULL);
    		if(hThread==NULL)
    			return ok;
    
    		WaitForSingleObject(hThread,INFINITE);
    
    		if(hThread!=NULL)
    			CloseHandle(hThread);
    		if(hProcess!=NULL)
    		{
    			DWORD ex=0;
    			GetExitCodeProcess(hProcess,&ex);
    			if(ex!=STILL_ACTIVE)
    				printf("Das Programm wurde mit ExitCode %d beendet!\n",ex);
    			CloseHandle(hProcess);
    		}
    	}
    	GetDebugPrivilege(false);
    	return ok;	
    }
    
    HANDLE GetProcessHandle(int processID)
    {
    	HANDLE pHandle=NULL;
    	pHandle=OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|
    							PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION,
    							FALSE,processID);
    
    	return pHandle;
    }
    
    bool GetDebugPrivilege(bool enable)
    {
    	bool done=false;
    	HANDLE processToken;
    	if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&processToken))
    	{
    		TOKEN_PRIVILEGES tp;
    		tp.PrivilegeCount=1;
    		LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);
    		tp.Privileges[0].Attributes= enable ? SE_PRIVILEGE_ENABLED : 0;
    		AdjustTokenPrivileges(processToken,FALSE,&tp,sizeof(tp),NULL,NULL);
    
    		done=(GetLastError()==ERROR_SUCCESS);
    
    		CloseHandle(processToken);
    	}
    	return done;
    }
    

    Der Cast von exitCode nach LPVOID ist natürlich "unschön" aber

    ExitProcess holt sich nunmal nen UINT vom Stack und keinen Pointer.
    Ansonsten macht das kleine Programm genau das was es soll-fremde Prozesse mit ExitProcess beenden.
    Dadurch dass ich das Debug Privileg setze kann man übrigens jeden Prozess beenden.Auch die Systemprozesse!
    Jeder der das mal probieren möchte kann ja mal alles speichern was noch offen ist und dann WinLogon beenden(vorsicht absoluter Totalabflug!!).

    MfG Spacelord



  • cd9000 schrieb:

    Strg+Alt+Entf lässt sich unter Windows XP auch mit Hooking nicht blockieren.
    -> Forensuche

    Also ich hab mir mal die ursprüngliche Frage dieses Threads angeguckt und die Aussage von cd9000 ist so nicht richtig.
    Seit XP besteht durchaus die Möglichkeit den Taskmanager zu unterdrücken,und das einfacher als man denkt!!
    Einfach folgenden Registryschlüssel anlegen:
    HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr = dword:1

    Das wars!!!
    Wenn jetzt jemand versucht mit der finalen Geierkralle den Taskmanager zu starten kommt nur noch ne Message Box dass der Taskmanager vom Administrator deaktiviert wurde.
    Ob das klug ist steht natürlich auf nem anderen Blatt....

    MfG Spacelord



  • also ich mach das jetzt immer so, dass ich den einfach mit PostMessage(...), inner schleife einfach schließe, dann hat man später auch keine probleme, wobei man ja auch beim beenden des programmes den schlüssel wieder löschen könnte



  • Man kann es auch bereits bei Win2k deaktivieren: in den Gruppenrichtlinien.


Anmelden zum Antworten