Stockschirm
Bisher hatte ich für Virenscanner wenig übrig. Sie funktionieren, wie typische Verteidigungswaffen, im Zweifelsfall zu spät. Für den Notfall lungert auf meinen Rechnern immer ein AVK rum, das ich nur als On-Demand-Scanner nutze.
Viele meiner Bekannten nutzen den kostenlosen Virenscanner Avira AntiVir PersonalEdition Classic. Der ist meist mit allen Standardeinstellungen installiert. Das stört zwar die Performance… aber für das Versprechen eigener Sicherheit war der Mensch ja schon immer bereit, Opfer zu bringen. (aber das ist ein anderes Thema)
Mein Kollege hat zwei PC. Einer ist zum Arbeiten und der andere hat einen Anschluss zum Internet.
Beide Rechner sind von HP und mit einer SoftThinks-Recovery ausgestattet. Schön zu sehen, das mein alter XSS Master Boot Record und andere von mir geschriebene Programme immer noch benutzt werden 🙂 …nur schade, dass SoftThinks so undankbar mit einigen ihrer wichtigsten Angestellten umgehen! …ich drifte schon wieder ab…
Auf dem Internet-Rechner braucht mein Kollege keinen Virenscanner, da dort keine relevanten Daten sind. Kommt ein Virus des Wegs und nistet sich ein, wird der Rechner in den Auslieferungszustand versetzt und fertig!
Aber sicher ist ja bekanntlich sicher, also kann ein Virenscanner auch auf dem Internet-PC nicht schaden. Mein Kollege hat deshalb auch den persönlichen AntiVir installiert. Damit gar nichts anbrennen kann, wollte ich ihm auch SuRun über helfen.
Er fand das ganz gut.
Nach der SuRun Installation klappte das Setup noch, dann war Schulz! SuRun rührte sich nicht. 😯 Nix zu machen! Schluß mit lustig! Ende im Gelände! Aus die Maus!
Selbst ein Beenden aller nicht-Windows Prozesse half nichts. SuRun wollte nicht. Man konnte es genau ein Mal benutzen (entweder zum Setup oder um ein Programm zu starten), dann stand es dumm rum und wollte gekillt werden.
Ich schob das zunächst dem HP-Rechner in die Schuhe, aber der gleiche HP-Rechner direkt daneben mochte SuRun sehr… Alles funktionierte wie gewohnt.
Nun ja… ich installierte auf meinem Arbeitspferd auch AntiVir und… SuRun stand da und bockte, wie ein Esel!
Hoya! Dachte ich… wird SuRun jetzt als Virus erkannt und stillschweigend blockiert?
Debuggen half mir weiter.
AntiVir nutzt einen Windows Treiber (avipbb.sys), der gut gegen Rootkits sein soll. Ist dieser Treiber geladen und AntiVir einmal aktiviert, funktioniert OpenProcess() nicht mehr korrekt.
Zum Verständnis: „SuRun.exe cmd.exe“ veranlasst den SuRun-Dienst ein weiteres als System laufendes SuRun zu starten, das den Benutzer um Erlaubnis fragt. Der SuRun Dienst wartet, bis der gestartete SuRun-Prozess beendet wurde, bevor er neue Befehle entgegen nimmt.
Die Funktion, die auf das Ende des zweiten System-Prozesses wartet, funktionierte unter AntiVir nicht.
Dabei hätte das auch trotz AntiVir funktionieren können, wenn Microsoft vernünftig gearbeitet hätte!
Man kann in Windows mit einer Wartefunktion, wie WaitForSingleObject() auf ein Prozess-Handle warten. Dann weiß man genau, wann der Prozess beendet ist und kann weiter machen…
Aber Denkste!
Direkt nach CreateProcess() kehrt WaitForSingleObject() sofort freudestrahlend zurück und meldet, dass der Prozess Geschichte ist…
Isser aaaaaber nicht! Er ist noch gar nicht gestartet.
Das weiß Microsoft auch und empfiehlt, mit WaitForInputIdle() zu warten, bevor man WaitForSingleObject() aufruft… Aber auch das geht nur „Meistens“.
Also rief SuRun, um wirklich zu wissen, wann Schluß ist, WaitForSingleObject() auf, schloss danach das Prozess-Handle, öffnete wieder eins und rief wieder WaitForSingleObject() auf… so Lange, bis Windows kein Prozess-Handle mehr öffnen wollte… der Prozess war also dahin.
Diese Vorgehensweise klappt allerdings nicht, wenn man AntiVir benutzt, denn OpenProcess() gibt auch dann noch ein Prozess-Handle zurück, wenn der Prozess schon Mausetot und verfault ist… auch nach über zehn Minuten noch!
Was reitet große Software-Hersteller für ein seltsamer Teufel, Betriebssystem-Funktionen auf solche Weise zu versauen? Wie soll das Rootkits abhalten? Mit Microsoft wird das Leben schwer genug… sowas muss doch nicht auch noch sein.
Nun gut, da man sicherlich AntiVir nicht geändert kriegt, musste eine Lösung her:
void WaitForProcess(DWORD ProcID)
{
HANDLE hProc=OpenProcess(SYNCHRONIZE,0,ProcID);
//First:
// WaitforSingleObject() for a just started Process will return
// immediately with WAIT_OBJECT_0, so SuRun keeps trying until
// OpenProcess returns 0
//
//Second:
// This is a bit tricky and because of the RootKit Detector of "ANTIVIR"
// avipbb.sys. With avipbb.sys loaded and AntiVir active, OpenProcess
// will succeed even after the process has terminated
// So SuRun uses an additional two stage detection,
// * a total timeout of 50seconds
// * at maximum 25 runs (WaitForSingleObject, Sleep)
CTimeOut t(50000);
int i=0;
while (hProc)
{
if (t.TimedOut()
|| (WaitForSingleObject(hProc,t.Rest())!=WAIT_OBJECT_0)
|| (i>25) )
break;
i++;
Sleep(100);
CloseHandle(hProc);
hProc=OpenProcess(SYNCHRONIZE,0,ProcID);
}
DBGTrace1("WaitForProcess(%d) exit",ProcID);
}
Jetzt wartet SuRun insgesamt maximal 50 Sekunden und bei AntiVir 2.5 Sekunden (nachdem der Prozess beendet wurde aber OpenProcess() immer noch ein gültiges Handle liefert).
Das ist nicht sehr elegant, aber effektiv.
Am 26. Dezember 2007 um 00:47 Uhr
Hallo,
erst einmal herzlichen Glückwunsch zu und vielen Dank für SuRun, einem wirklich sehr nützlichen Hilfsmittel, um sicherer arbeiten zu können.
Ich benutze auch den Avira Virenscanner und dabei ist mir aufgefallen, dass die Handle-Anzahl von SuRun bei jedem Admin-Start eines Programmes steigt. Im obigen Code passiert dies, wenn die Schleife nach 50 Sekunden oder 2.5 Sekunden verlassen wird (CloseHandle fehlt dann).
Am 26. Dezember 2007 um 10:39 Uhr
Im Code ist ein Fehler. 😥
Wenn die Schleife mit „break;“ verlassen wird, bleibt das Handle offen.
In der aktuellen Beta ist die Routine nicht mehr drin und das Handle-Leak behoben. Vielleicht mache ich einen „back-port“ aller Fixes und leichten Verbesserungen in das „alte“ SuRun.
Am 20. Februar 2008 um 15:52 Uhr
Bin erfreut jemanden zu treffen, der sich auch mit diesem Avira Problem herumschlägt.
Schau mal hier:
http://forum.avira.com/thread.php?threadid=33338
Am 20. Februar 2008 um 16:14 Uhr
Hallo,
Das OpenProcess irgendwie nicht richtig funktioniert ist mir aufgefallen.
Ich bin aus diesem Grund auf CreateProcess umgestiegen da dort das Warten aufs Prozessende bisher immer funktioniert hat.
P.S. SuRun ist eine geniale Idee. Aber als freiheitsliebender Mensch schränke ich diese lieber mit diversen Sicherheitsprogrammen ein und arbeite an meinem Rechner als Admin. 😉