Scherzprogramme programmieren
Eigentlich kann man mit reinen Delphi-Routinen keine verstecken Scherzprogramme programmieren, aber mit Hilfe der Win-API geht es. Die meisten der Win-API-Befehle die hier beschrieben werden, funktionieren auch unter anderen Programmiersprachen. Anfänger sollten aber meine Komponente TCVirus verwenden, da sie viele Befehle automatisiert.
Grundlagen
Wichtig für Scherzprogramme ist, dass nur Eingeweihte sie finden bzw. beenden können.
Bei TCVirus ist es nicht schwer, die Komponente versteckt das Programm bei Aufruf von HideFromTaskManager aus dem Taskmanager und die Procedure Hide mit dem Parameter (form1.)handle (bei Delphi enthält der Wert den Handle der Hauptform) aufruft, wird das Programm vom Bildschirm und aus der Taskleiste entfernt.
Bei der Win-API ist es komplizierter, mit der Procedure RegisterServiceProcess(GetCurrentprocessID,1) versteckt man das Programm vor dem Taskmanager, allerdings muss man die Procedure erst einbinden. Bei Delphi funktioniert dies mit
function RegisterServiceProcess(dwProcessId,dwType:Dword):DWord; stdcall; external 'KERNEL32.DLL' oberhalb des "implementation"-Abschnitts der Unit.
Leider funktioniert dies nur bei W9x und bei neueren Windowsversionen startet dann das Programm nicht mehr. TCVirus umgeht dieses Problem durch dynamisches DLL Einbinden, wie dies genau funktioniert kannst du in Assarbads DLL Tutorial nachlesen.
Eine andere Methode das Programm nicht im Taskmanager zu sehen. ist ALT+TAB und STRG+ALT+ENTF zu blockieren, so dass dieser nicht mehr aufgerufen wird. Dies geht über die Funktion SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,0,0);
Wieder aktiviert werden die Tasten über die gleiche Funktion, nur 0 statt 1:
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,0,0);
Über die Funktion wird dafür gesorgt, dass Windows denkt, dass ein Screensaver läuft und daher die Tasten abschaltet.
Diese Funktion funktioniert ebenfalls nur unter alten Systemen.
Unter den neueren NT-Systemen ist es wesentlich schwerer, zum Beispiel ist eine Möglichkeit die GINA (Graphical Identification and Authentication DLL) oder den Tastaturtreiber neuzuschreiben.
Man kann aber auch versuchen das Programm einfach über den Namen zu tarnen. (z.B.: ExtremWichtigerMaustreiber.exe)
Aus der Taskleiste bekommt man das Programm mit einer einfacheren API Funtkion:
ShowWindow(application.handle,sw_hide).
Über Application.handle bekommt man den Handle des Hauptfenstern einer Anwendung, welches für den Button auf der Taskleiste zuständig ist. Dieses wird dann versteckt.
Es muss aber möglich sein, das Programm zu beenden.
Bei TCVirus ist die schon eine Möglichkeit eingebaut, nämlich das Programm bei einer bestimmten Mausposition zu beenden.
Diejeweilige Position kann man mit den Eigenschaften XMouseTest und YMouseTest festlegen.
Die Eigenschaft MouseTestIntervall legt fest, wie oft die Mausposition überprüft werden soll. Sobald die Maus den Punkt erreicht, wird das Ereignis OnMousePos ausgelößt .
Natürlich kann man dort auch andere Befehle als das Beenden einfügen.
Bei der Win-API muss man dafür einen Timer oder einen Thread verwenden und mit der Procedure GetCursorPos die Mausposition ermitteln. Man übergibt ihr eine Variable die von dem Typ lpPoint (bei Delphi: TPoint)sein muss. Die übergebene Variable enthält danach die Mausposition.
Man kann aber auch die Tastatur abfragen:GetAsyncKeyState(nummer)
Für nummer muss man den virtuelle Tastaturcode der Taste eingeben, die man überprüfen will.
Störfunktionen
Eine überraschende Aktion ist es, das CD-ROM Laufwerk des Computers zu öffnen.
TCVirus hat dafür die Methoden openCDTray and closeCDTray zum Öffnen und Schließen.
Bei der WinAPI muss man über Funktion mciSendString dem CD-Laufwerk diese Anweisung senden:
- Öffnen: mciSendString('Set cdaudio door open wait', nil, 0, 0);
- Schließen: mciSendString('Set cdaudio door closed wait', nil, 0, 0);
Eine andere Möglichkeit ist es auf den Monitor zu malen. Bei der API braucht man für jeden Grafikeffekt auf dem Desktop dessen Handle, bei TCVirus steht dieser in der Eigenschaft canvas.handle. Ohne TCVirus muss man ein neues Handle erzeugen, indem man createDc('DISPLAY',nil,nil,nil) aufruft. Nach der Benutzung muss das durch createDc erzeugte Handle mit DeleteDc freigegeben werden.
Hat man den Handle (oder TCVirus), kann man den Bildschirm spiegeln.
Bei TCVirus kann man dies mit den Proceduren Canvas.MirrorHorizontal und Canvas.Mirrorvertikal tun.
Mit der Win-API ist es komplizierter:
- Horizontal:
- StretchBlt(handle, 0, 0, screen.width, screen.Height, handle, 0, screen.Height, screen.Width ,-screen.Height , SRCCOPY)
- Vertikal:
- StretchBlt(handle, 0, 0, screen.width, screen.Height, handle, screen.Width, 0, -screen.Width, screen.Height, SRCCOPY)
Man kann auch Kreise, Rechtecke, Ellipsen und Linien auf den Bildschirm zeichnen.
Bei TCVirus funktioniert das wie das normale Zeichnen mit Hilfe eines Canvas in Delphi.
Dafür gibt es die Eigenschaft Canvas, über die zahlreiche Grafikfunktionen aufgerufen werden können.
Da diese Funktionen in der mitgelieferten Hilfe, und auch der Delphihilfe ausreichend beschrieben sind, erkläre ich hier nur den Weg über die Win-API, der auch nicht sonderlich schwer ist:
Mit Rectangle und Ellipse kann man ein Rechteck bzw. eine Ellispe zeichnen, indem man die Koordinaten der linken, oberen und der rechten, unteren Ecke anngibt, und zusätzlich noch als ersten Parameter den Handle des Desktops.
Linien können über MoveToEx und LineTo gezeichnet werden. Zuerst bringt man den Cursor mit MoveToEx zur Startposition, wofür man vier Parameter braucht, den Handle, die Koordinaten und am Schluss noch eine 0.
Mit LineTo malt man dann von den festgelegten Koordinaten zu den neu übergebenen Koordinaten, und die neuen Koordinaten werden eingestellt.
Mit Hilfe von TextOut(handle,XPos,YPos,text) kann ein Text ausgegeben werden.
Allerdings kann man mit diesen Funktionen nur schwarz-weiß zeichnen.
Will man Farbe haben, muss man zuerst mit SelectObject(handle des Desktops,CreatePen(PS_SOLID,1,farbe) einen Stift erzeugen.
Es wird der Handle des alten Stiftes zurückgegeben, mit dem man den neuen über DeleteObject(SelectObject(handle des Desktops, handle des alten Stiftes) wieder löschen kann.
Das Setzen der Füllfarbe funktioniert ähnlich, nur schreibt man anstatt CreatePen das: CreateSolidBrush(farbe).
Wohlgemerkt braucht man das nur, wenn man ausschließlich die Win-API benutzt, bei TCVirus kann man dessen Eigenschaften canvas.pen.color und canvas.brush.color verwenden.
Mit der Win-API kann man aber auch Bereiche des Bildschirms invertieren:
InvertRect(Handle des Desktops,bereich).
Für bereich muss man einen Zeiger auf eine Struktur vom Typ TRect angeben. Man kann die in Delphi über rect(links, oben, rechts, unten) erzeugen.
Und man kann ein Bild auf den Bildschirm zeichnen:
DrawState(handle, dss_normal nil, bild,0,x, y, breite, höhe, dst_bitmap);
.
Für handle muss man den Handle des Desktops angeben.Für x, y setzt man die Koordinaten ein. Für breite, höhe muss man die Breite und Höhe des Bildes einfügen. Für bild muss man den Handle des Bildes übergeben. Wenn man z.B.: in Delphi TImage verwendet, enthält die Eigenschaft Picture.Bitmap.Handle das Handle.
Man kann auch die LEDs auf der Tastatur verändert:
Bei TCVirus geht dies einfach über SetKeyBoardLEDs(numlock, caps, scroll).
Die Parameter sind Booleanwerte (können also entweder true, oder false sein). Bei true leuchtet die Lampe, ansonsten ist sie aus. Die Parameterreihenfolge entspricht dabei der Reihenfolge der LEDs auf der Tastatur.
Zuerst muss man eine Variable vom Typ pbKeyState(unter Delphi = TKeyboardState)deklarieren.
Danach muss man GetKeyboardState mit der deklarierten Variablen aufrufen, um den aktuellen Status zu erfahren. Dann kann man die LEDs mit keyState[LED Code] := 0 oder 1; einstellen:
Als LED Code kann man (entsprechend der Reihenfolge auf der Tastatur) VK_NUMLOCK, VK_CAPITAL und VK_SCROLL nehmen.
Bei 0 ist sie aus, bei 1 an.
Sehr überraschend ist es auch die Desktop-Icons auszublenden.
Dafür benötigt man zuerst das Handle des zu den Icons gehörendem Fenster.
Bei TCVirus wird es von der Methode GetIconDesktop zurück geliefert, bei der API geht es so:
handle:=FindWindowEx(FindWindowEx(FindWindow('Progman', nil),0,'SHELLDLL_DefView',nil),0,'SysListView32',nil); (Das bedeutet, dass das Handle auf das Unterfenster namens "SysListView32" des Unterfensters "SHELLDLL_DefView" des Fensters "Progman" geholt wird, diese Namen kann man z.B.: mit APIV herausfinden.).
Mit dem Handle werden sie dann so unsichtbar gemacht:
EnableWindow(handle ,false);
SetWindowPos(handle,HWND_BOTTOM, 0, 0, 0, 0, SWP_HIDEWINDOW);
So werden sie sichtbar gemacht:
EnableWindow(handle ,false);
SetWindowPos(handle,HWND_BOTTOM, 0, 0, 1, 1, SWP_SHOWWINDOW);
Man kann auch dafür sorgen, dass ein Programm automatisch bei Windowsstart geöffnet wird, dazu muss man den Namen und das Verzeichnis der Anwendung (erhält man über ParamStr(0)) in einen bestimmten Registryschlüssel schreiben: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run oder HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
Der Eintrag muss vom Typ String sein, und muss als Wert den Programmnamen haben, während der Name des Eintrages egal ist.
Bei Delphi gibt es Registryfunktionen, die einem die
komplizierten Win-API-Funktionen ersparen , näheres steht in der Delphihilfe unter TRegistry.
Man muss beachten, dass man unter NT-Systemen nur in den "Local Machine" Schlüssel schreiben kann, wenn man als Administrator angemeldet ist, dafür startet das Programm dann auch bei allen Benutzern automatisch.
Scherzprogramme zum Downloaden
Bildwackler(150 KB)
Dieses Scherzprogramm spiegelt jede Sekunde zuerst den Bildschirm Vertikal, dann Horizontal und invertiert dann die Farben. Mit |Ctrl| + |SHIFT| + |A| beendet man das Programm.HokusScherz(737 KB):
Das Scherzprogramm lässt über DrawState ein Männchen auf den Bildschirm laufen, das gleich danach die Taskleiste herbeizaubert. Wenn es damit fertig ist, fangen das Startmenü und die Taskbar Notification Area hin und her laufen. Dann wird der ganze Bildschirm schwarz angemalt. Am Schluss wird der Computer beendet. Nach dem Neustarten ist das Scherzprogramm wieder da, weil es sich in diesen Autostartbereich der Registry eingetragen hat: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunDer reingeschriebene Eintrag heißt LoadPower und hat den Inhalt: C:\LoadPower.exe
Wer sich nicht in der Registry und in DOS auskennt, sollte dieses Programm nicht runterladen! Da manche Computer nicht mehr starten, muss man um Windows zum Starten zu kriegen unter DOS die Datei C:\Loadpo~1.exe löschen.
Danach sollte man man den Registryeintrag löschen!
Fremde Scherzprogramme
Scherzprogramm von Andre Jochim (131 KB):
www.andre-jochim.deDieses Programm ist Freeware und darf beliebig verändert werden.
Beim 1. Start kopiert es sich ins Win-Verzeichnis als sosystem.exe, erstellt die Datei C:\check.in und es trägt sich in die Registry ein und gibt eine Fehlermeldung aus, dass irgendwas nicht geklappt hat.
Bei allen nächsten Starts prüft es, ob es die Datei check.in gibt - wenn ja:
dann spiegelt es einige Male den Bildschirm - wieder bis zum Ausgangszustand und beendet sich dann wieder. Das "Opfer" sieht also jedes Mal beim Systemstart, wie der Bildschirm "wackelt" und wundert sich, was los ist.
Entfernen kann man das Programm vollständig so:
C:\windows\sosystem.exe und c:\check.in löschen.
Registry-Eintrag 'SoundMX-3G MasterSet' in
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
entfernen.
Ich übernehme keine Verantwortung für eventuelle Schäden, die durch die Scherzprogramme entstehen können
Wenn jemand selber Scherzprogramme programmiert hat, bitte ich sie mir per E-mail zu zuschicken.
Bitte nur dokumentierte Scherzprogramme (wie oben) zuschicken und nicht gefährlicher als HokusScherz.
Die zugeschickten Scherzprogramme können hier veröffentlicht werden.
www.benibela.de/jokeprograms_de.html
Datenschutz