Konsolenfenster soll nirgendswo sichtbar sein!



  • Wie fändest du denn folgenden Ansatz:

    Du lässt einfach zwei Prozesse Laufen. Prozess A verhindert das Ausführen von "hl.exe". Prozess B prüft, ob Prozess A noch läuft. Wenn nicht, startet er den Prozess neu. Prozess A müsste allerdings auch einen Thread haben, in dem geprüft wird, ob Prozess B noch läuft und ggf. den Prozess B neu startet. So schützen sich die beiden Prozesse gegenseitig.

    Zu deinem Programm: Was läuft denn nicht richtig?
    Wenn er die Funktion GetConsoleWindow nicht findet, könntest du es auch mit FindWindow realisieren:

    HWND hWnd = FindWindow("ConsoleWindowClass",NULL);
    ShowWindow(hWnd,SW_HIDE);
    

    MfG, Jochen


  • Administrator

    Jochen S. schrieb:

    Genausogut hätte sich die Software natürlich auch verstecken können, um sich zu schützen.

    Nein, der Prozess ist sichtbar, dass ist korrekt. Alle Anti-Viren Software und co schützen sich, vor unerlaubten beenden. Dagegen ist ja auch nichts einzuwenden, nur das bewusste verbergen ist extrem verdächtig.

    @>|<,
    Um Spiele zu unterbinden, dafür gibt es extra Software. Die ist sicherer und erledigt es bestimmt besser, als wenn man sowas selbst macht. Hat nicht sogar Antivir einen Schutz gegen Spiele? Dachte mal irgendwo was davon gelesen zu haben und Antivir wäre ja gratis.
    Allerdings frage ich mich, wie die Schüler denn überhaupt so ein Spiel installieren können? Man könnte ja auch leicht ihre Reiche entsprechend einschränken, dass sie nicht einfach Programme installieren können. Bzw. man kann ihnen auch verbieten, so eine *.exe auszuführen. Gibt da eine vielzahl besserer Alternativen.

    Grüssli



  • ihr könnt mir gerne glauben, dass ich damit niemanden schaden will...

    auf jeden fall...:
    jochen, du hast den richtigen weg gefunden, das waren die dinge, die ich noch brauchte, dass mit dem überwachen der beiden prozesse kann ich jetzt nich mehr machen, ich leg mich jetzt schlafen 😃

    wär nett, wenn einer von euch mir sowas schonmal generell vorfertigen würde 😃

    muss aber nicht, bin halt das WE weg^^

    Grüße und besten Dank, >|<



  • Ich nehm mal an, es ist ein Arbeitsrechner oder sowas.. vllt zockt der Azubi auf Arbeit CS oder so? ka... kommt mir schon komisch vor.

    Einfachste Lösung:
    DirectX deinstallieren und dem User nicht die Rechte dazu geben es neu zu installieren :P.

    Den Prozess des Schutzprogrammes mit höheren Rechten starten als der User hat.. kein User braucht Admin-Rechte. Damit kann er den Prozess gar nicht terminieren.

    Da is kein gefrickel zu nötig.
    Alles andere schaut mir auch eher nach Wurm aus.
    rya.



  • 😡

    einfach als admin starten..... so einfach.. 😳

    ...
    ...
    ...
    ...
    ja, klar, thx



  • Schonmal daran gedacht den Prozess z.B. system32 zu nennen, oder wenn das Programm beendet wird, führt es sich wieder selbst aus?...



  • Programme können sich nicht selbst ausführen, wenn sie beendet wurden. Dafür braucht man dann zwei Prozesse. Das hab ich ja schon vorgeschlegen.



  • Wenn´s nur darum geht, HL.EXE zu verhindern gibt es einen einfachen Weg. In der Registry gibt es einen Key namens AppInit_DLLs. Unter diesem Key befinden sich Namen von DLLs, die während des Prozesstarts für User Prozesse geladen werden.
    Du musst eine eigene DLL schreiben, die beim Laden prüft, ob der Host Prozess HL.EXE ist, falls dies der Fall ist kanst du den Prozess beenden.

    Taucht in keinem Task Manager auf und braucht keinen WatchDog.

    AppInit_DLLs



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ist gelöst thX 🙂



  • Wäre schön, wenn du uns noch verrätst wie du´s gelöst hast. Möglicherweise haben andere Leute das gleiche Problem und wüssten gern, wie´s geht...



  • Jochen S. schrieb:

    Programme können sich nicht selbst ausführen, wenn sie beendet wurden. Dafür braucht man dann zwei Prozesse. Das hab ich ja schon vorgeschlegen.

    .NET kann sowas 😃



  • Jetzt bin ich aber interessiert.
    Aber die Programme schaffen das nicht aus eigener Kraft, oder?



  • Eigentlich schon. Es gibt ein bestimmtes Event, dass hier z.B. gut passen würde, welches abfängt, ob das Programm per Prozesskill geschlossen wird und jenachdem kann man dann da noch Code einfügen.


  • Mod

    FreakY<3Cpp schrieb:

    Eigentlich schon. Es gibt ein bestimmtes Event, dass hier z.B. gut passen würde, welches abfängt, ob das Programm per Prozesskill geschlossen wird und jenachdem kann man dann da noch Code einfügen.

    Das ist übrigens kein .NET-Feature. Das kann man in jedem System machen, wo Programme Nachrichten/Signale bekommen, um sich zu beenden. Allerdings taugt die Lösung nicht, um einen Prozess unstoppbar zu machen, weil es in der Regel auch die Möglichkeit gibt, ein Programm ohne dieses Signal zu beenden.



  • Ist das denn auch der Fall, wenn man den Prozess mit Terminate Process beendet?
    Dann gibt man Windows die anweisung, den Prozess zu löschen. Ob dann noch eine Nachricht an den entsprechenden Prozess gesendet wird? Ich glaube eher nicht.



  • DocShoe schrieb:

    Wäre schön, wenn du uns noch verrätst wie du´s gelöst hast. Möglicherweise haben andere Leute das gleiche Problem und wüssten gern, wie´s geht...

    Ich habs ihm per E-Mail geschickt. Aber ich kann den Code ja mal Posten:

    #include <windows.h>
    #include <tlhelp32.h>
    using namespace std;
    
    bool ProcessRunning(const char* szProcess)
    {
    	HANDLE hSnapshot;
    	PROCESSENTRY32 ProcessEntry;
    	ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	bool found = false;
    
    	if(Process32First(hSnapshot, &ProcessEntry))
    		do
    		{
    		if(!stricmp(ProcessEntry.szExeFile,szProcess))found = true;
    		}
    		while(Process32Next(hSnapshot, &ProcessEntry));
    
    	CloseHandle(hSnapshot);
    	return found;
    }
    
    bool KillProcess(const char* szProcess)
    {
    	HANDLE hSnapshot;
    	PROCESSENTRY32 ProcessEntry;
    	ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	bool found = false;
    
    	if(Process32First(hSnapshot, &ProcessEntry))
    		do
    		{
    			if(!stricmp(ProcessEntry.szExeFile,szProcess))
    			{
    			HANDLE hProcess;
    			hProcess = OpenProcess(PROCESS_TERMINATE,0,ProcessEntry.th32ProcessID);
    			TerminateProcess(hProcess,0);
    			CloseHandle(hProcess);
    			found = true;
    			}
    		}
    		while(Process32Next(hSnapshot, &ProcessEntry));
    
    	CloseHandle(hSnapshot);
    	return found;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
    {
    	while(1)
    	{
    	KillProcess("hl.exe");
    	if(!ProcessRunning("ProcessB.exe"))ShellExecute(NULL,NULL,"ProcessB.exe",NULL,NULL,NULL);
    	if(!ProcessRunning("ProcessA.exe"))ShellExecute(NULL,NULL,"ProcessA.exe",NULL,NULL,NULL);
    	Sleep(100);
    	}
    }
    

    Die exe muss man dann kopieren und einmal ProcessA.exe und die andere Kopie ProcessB.exe nennen. Die Prozesse verhindern die Ausführung von "hl.exe".
    Das könnte man aber noch besser hinbekommen, ohne die Zwei Exe-Dateien.
    Man müsste dann die Anzahl der Laufenden Prozesse mit dem Namen "ProcessA.exe" ermitteln und sollte die Anzahl < 2 sein, einfach das Programm nochmal starten.

    MfG, Jochen



  • gibt soetwas nicht probleme beim herunterahren? Da wird ja auch ein Prozess beendet Wenn er dann neugestartet wird, bevor der 2. proess beendet wird..... ?



  • Deswegen wird doch, zumindest unter Linux, nach nem Terminersignal noch ein Killsignal geschickt. Letzteres kann ein Prozess nicht mehr abfangen. Bei anderen OS gibts sicher ähnliche Mechanismen.



  • Unter Win32 beendet TerminateProcess den Prozess unter allen Umständen, wartet aber, bis alle ausstehenden IO Operation beendet oder abgebrochen wurden.

    MSDN schrieb:

    A process cannot prevent itself from being terminated.


Anmelden zum Antworten