Beispielschlüsselwörter eines vollständigen Hook-Programms: Hook, Blocking, Service
Dies ist die Testfrage für „Senior Windows Program Analyst“ der Firma xx, die ich erhalten habe, als ich mich für eine Stelle beworben habe. Die spezifischen Anforderungen (d. h. die Beschreibung meines Programms) sind:
1. Das Client-Programm heißt Client. Überwachen Sie den Betrieb des Systems. Wenn Sie feststellen, dass es im System einen „Notepad“-Prozess (notepad.exe) oder einen „Rechner“-Prozess (calc.exe) gibt, beenden Sie den Prozess sofort und schreiben Sie das Ereignis in die Datenbank; Überprüfen Sie regelmäßig alle 1 Minute die Datenbank und laden Sie Ereignisdatensätze hoch, die noch nicht auf den Server hochgeladen wurden.
1. Die Zielbetriebsumgebung ist das Betriebssystem Windows 2000.
2. Bitte entwerfen Sie das Programm so, dass es dem System dient.
3. Das Programm muss über Anti-Angriffsfunktionen verfügen, einschließlich Funktionen wie Löschschutz und Widerstand gegen erzwungene Beendigung von Prozessen.
(1) Halten Sie das Programm kontinuierlich am Laufen und verhindern Sie, dass andere Programme die Ausführung des aktuellen Programms gewaltsam beenden.
(2) Schützen Sie die Ereignisdatenbank und die Hauptausführungsdatei vor dem Löschen.
(3) Wenn eine Anomalie festgestellt wird (der Prozess wird beendet, die Datei wird gelöscht usw.), erzwingen Sie sofort das Neuladen/Ausführen des Programms.
(4) Wenn dreimal hintereinander eine Anomalie erkannt wird, erzwingt der Daemon-Prozess einen Neustart des Betriebssystems. Stellen Sie sicher, dass das Programm normal geladen und ausgeführt wird.
(A) Um die oben genannten Funktionen zu realisieren, ist das Programm nicht auf die EXE-Form beschränkt, und die Implementierungsform kann je nach Bedarf selbst festgelegt werden.
(B) Die oben genannten Funktionen werden alle in der normalen Betriebsumgebung von Windows 2000 und unter Administratorberechtigungen implementiert. Es besteht keine Notwendigkeit, den Windows-Sicherheitsmodus oder -Berechtigungen und andere Probleme zu berücksichtigen.
4. Bitte verwenden Sie einfache Desktop-Datenbanken wie Access, xBase und andere Dateidatenbanken.
5. Jedes generierte Ereignis enthält mindestens zwei Informationen: den Zeitpunkt des Auftretens des Ereignisses und das Ereignisverarbeitungsobjekt.
Die Ereignisdaten werden in der Datenbank in der Tabelle tEvent gespeichert. Die tEvent-Tabelle enthält mindestens zwei Felder:
(1) EventTime-Feld: Zeit-/Datumstyp. Notieren Sie den Zeitpunkt, zu dem das Ereignis aufgetreten ist.
(2) EventTarget-Feld: Zeichentyp. Zeichnet die bei dem Ereignis getöteten Objekte auf. Zu berücksichtigende Objekte sind der Notepad-Prozess und der Rechnerprozess.
Wenn Sie weitere Tabellen oder Felder benötigen, können Sie diese nach Bedarf hinzufügen.
6. Das Netzwerkdatenübertragungsformat wird angepasst. Bitte entscheiden Sie den konkreten Inhalt und das Format der Übermittlung entsprechend Ihren Bedürfnissen, es gibt keine besonderen Anforderungen. Das Client-Netzwerk muss mit dem Servernetzwerk zusammenarbeiten.
7. Es gibt keine Begrenzung hinsichtlich der verwendeten Entwicklungssprache und der integrierten Entwicklungsumgebung, Sie können sie selbst auswählen.
8. Wählen Sie die Datenbankverbindungsmethode entsprechend Ihren Anforderungen aus.
2. Das serverseitige Programm heißt Server. Überwachen Sie das Netzwerk. Sobald ein Client Daten hochlädt, werden die Ereignisinformationen sofort extrahiert und in einer Liste auf der Benutzeroberfläche angezeigt.
1. Die Zielbetriebsumgebung ist das Betriebssystem Windows 2000.
2. Das Programm sollte als normale Windows 2000-GUI-Anwendung konzipiert sein. Die Benutzeroberfläche muss mindestens eine Ereignisinformationsliste enthalten, die mindestens drei Informationen enthält: Zeitpunkt des Auftretens des Ereignisses, Ereignisverarbeitungsobjekt und Ereignisquelle.
(1) Zeitpunkt des Auftretens des Ereignisses: identisch mit dem Zeitpunkt des Auftretens des Client-Ereignisses.
(2) Ereignisverarbeitungsobjekt: das gleiche wie das Client-Ereignisverarbeitungsobjekt.
(3) Ereignisquelle: IP-Adresse des Client-Computers, der das aktuelle Ereignis hochgeladen hat.
3. Das Netzwerkdatenübertragungsformat wird individuell angepasst; funktioniert in Verbindung mit dem Client.
4. Es gibt keine Begrenzung hinsichtlich der verwendeten Entwicklungssprache und integrierten Entwicklungsumgebung, Sie können sie selbst auswählen.
Anleitung zum Ausführen des Programms:
client.ini muss im Stammverzeichnis von Laufwerk C abgelegt werden. Andere Dateien können überall abgelegt werden, aber Survival.exe und client.exe müssen im selben Ordner abgelegt werden. Bevor Sie Survival.exe starten, konfigurieren Sie bitte die Server-IP (interval_server ) in client.ini) und starten Sie dann ADServer.exe
Beschreibung des Quellcodes 1. Server ADServer.exe
Da die Serverseite einfach ist, sprechen wir zunächst über die Serverseite:)
Die Aufgabe des Servers besteht darin, Daten aus dem Netzwerk zu empfangen und die Übertragung mithilfe von TServerSocket zu blockieren. Jedes Mal, wenn TServerSocket eine Verbindungsanforderung von einem Client empfängt, generiert es einen TServerClientThread-Thread. Sie sollten in diesem Thread einen neuen TWinSocketStream erstellen, um Client-Daten zu lesen und zu schreiben. Der Hauptcode ist im ClientExecute-Teil dieses Threads geschrieben.
Es gibt kein Problem, wenn TWinSocketStream Daten auf den Client schreibt, aber das Lesen von Daten vom Client (mit der Lesemethode) kehrt oft zurück, bevor der Lesevorgang abgeschlossen ist, selbst wenn Sie WaitForData verwenden. Deshalb habe ich eine waitDateComplete-Funktion geschrieben, um auf das Lesen der Daten zu warten.
2. Client Der Client ist etwas problematischer. Client.exe ist ein Dienst und Survival.exe ist eine Anwendung. Die beiden überwachen sich gegenseitig. Wenn einer heruntergefahren wird, wird er vom anderen neu gestartet. HookDll.dll wird für Hooks verwendet. Globale Hooks müssen in unabhängigen DLL-Modulen geschrieben werden (mit Ausnahme einiger Hooks, siehe diesen Artikel: http://www.pconline.com.cn/pcedu/empolder/gj/ vc/ 0403/340480.html).
Client.exe verfügt nicht über ein paar Codezeilen. Es verwendet hauptsächlich CreateProcess, um den Prozess zu starten. Beachten Sie, dass der ServiceType auf stWin32 und die TService::Interactive-Eigenschaft auf true gesetzt sein muss, wenn der Dienst Dinge im Zusammenhang mit der Windows-Shell ausführen möchte, beispielsweise Hooks, die in der von diesem Programm gestarteten Datei „hookdll.dll“ verwendet werden.
Survival.exe wird verwendet, um den Dienst zu starten, Hookdll.dll zu laden und Ereignisse an den Server zu melden.
1. Zum Starten des Dienstes sind drei Prozesse erforderlich. Öffnen Sie zunächst den Dienst-Controller, der das Backend des „Dienstes“ im Verwaltungstool darstellt, und verwenden Sie dann OpenService (Dienst-Manager-Handle, Dienstname). , SERVICE_START |. SERVICE_QUERY_STATUS), um das Handle des angegebenen Dienstes zu erhalten, und schließlich können Sie StartService(...) verwenden, um den Dienst zu öffnen. Beachten Sie, dass mindestens die beiden Berechtigungen SERVICE_START und SERVICE_QUERY_STATUS eingeholt werden müssen.
2. In Bezug auf das Laden von Hookdll.dll verwendet dieses Programm eine implizite Verknüpfung, dh es verwendet BCBs ProjektZum Projekt hinzufügen, um die lib-Datei der DLL zu importieren. Wenn nach dem Import die Funktion der DLL nicht im Code aufgerufen wird, wird die DLL nicht geladen. Dieses Programm ruft die Funktion beginTrace (HWND-Host) auf, um das Fensterhandle von Survival.exe zu übergeben, und die DLL sendet über dieses Handle einige Nachrichten an Survival.exe.
3. Im Hinblick auf die Meldung von Ereignissen an den Server wurde speziell eine TMSocketClient-Klasse geschrieben, die hauptsächlich für den Prozess des Sendens von Nachrichten -> Empfangen von Nachrichtenbestätigungen verantwortlich ist. Der Hauptcode befindet sich in TMSocketClient::Command (….). Der Code in ADServer.exe ist sehr einfach zu lesen. Durch #Definieren verschiedener Befehlskonstanten kann dieses Modul viele Arten von Übertragungsaufgaben erledigen. Tatsächlich handelt es sich bei diesem Modul um eine Klasse, die ich in der Vergangenheit geschrieben habe, um TNMFTP zu simulieren. Es wurde durch das Löschen vieler #defines vereinfacht und zum Übertragen von Dateien in einem virtuellen LAN verwendet (TNMFTP funktioniert nicht in einem virtuellen LAN).
3. HookDll.dll
Der Code ist sehr einfach, achten Sie nur auf eines: Wenn N Prozesse dieselbe DLL aufrufen, wird diese DLL N-mal kopiert. Im Allgemeinen haben verschiedene Kopien dieser N DLLs jeweils ihre eigenen Datensegmente. Das heißt, der Wert derselben Variablen in jeder Kopie ist unterschiedlich und stört sich nicht gegenseitig. Tatsächlich hat Windows jedoch einen solchen Mechanismus hinterlassen, der es uns ermöglicht, eine solche Variable in einer DLL zu deklarieren und die Daten zwischen N Instanzen der DLL konsistent zu halten, genau wie es ein Zeiger ist, der über den Prozessraum hinausgeht. Um eine solche Variable zu deklarieren, erstellen Sie zunächst eine .def-Datei mit demselben Namen wie die DLL und schreiben Sie in die Datei:
ABSCHNITTE
SHSEG LESEN SCHREIBEN GETEILT
Deklarieren Sie dann die DLL-Variablen, die Sie zwischen Prozessen teilen möchten, als globale Variablen und initialisieren Sie diese Variablen. Beachten Sie, dass der Unterschied zwischen Teilen und Nicht-Teilen darin besteht, ob es initialisiert wird!
Dieses Programm bezieht sich auf „Application of Hooks: Program Running Monitoring“ auf CCRun. Vielen Dank an den Autor Victor Chen.
OK, das scheint im Grunde alles zu sein, was es zu erklären gibt. Darüber hinaus gibt es einige nutzlose Variablen im Programm. Ich habe keine Zeit, sie zu bereinigen:) Vielen Dank fürs Zuschauen!
Expandieren