Drei kurze Windows-Registrierungsgeschichten

Guten Tag, liebe Leser.

Die Registrierung ist eines der sichtbarsten und bedeutendsten Windows-Systeme. Es gibt kaum jemanden, der nichts von ihm gehört hat. Nachdem ich ungefähr 20 Jahre unter Windows programmiert hatte, dachte ich, ich wüsste alles über ihn. Aber von Zeit zu Zeit erscheint etwas Neues, das mir zeigt, wie falsch ich war. Daher möchte ich Ihnen heute über die ungewöhnlichen Arbeitsweisen mit der Registrierung berichten, die ich bei der Recherche nach Rootkits kennengelernt habe und die mich überrascht haben.


Die erste Geschichte. Namen von Registrierungswerten und Schlüsseln


Wir alle wissen, dass es in Windows einige Regeln für die Benennung von Objekten gibt, sei es Dateien, Verzeichnisse oder Registrierungsschlüssel. Dateinamen dürfen nicht das Zeichen "\" enthalten. Namen dürfen nicht leer sein. Namen haben einige Längenbeschränkungen usw.

Unwillkürlich erweitern wir diese Einschränkungen auf alle Windows-Systeme und beachten sie bei der Arbeit mit der Registrierung. Und hier liegt unser Fehler. Es gibt überraschend wenige Einschränkungen für die Registrierung beim Erstellen von Namen. Im Namen der Werte können Sie beispielsweise das Zeichen "\" verwenden.


Überrascht? Nein? Was werden Sie dann sagen, wenn ich Ihnen zeige, dass das Symbol "\ 0" im Namen eines Wertes verwendet werden kann? Ja, ja, genau das Nullzeichen. Diejenige, die traditionell verwendet wird, um das Ende einer Zeile anzuzeigen.

Dazu benötigen wir die aus ntdll.dll exportierte NtSetValueKey-Funktion

HKEY hKey = 0; RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hKey); UNICODE_STRING uName; uName.Buffer = L"Test\0Zero"; uName.MaxLen = uName.Length = 9 * sizeof(wchar_t); NTSTATUS status = 0; status = NtSetValueKey( hKey, &uName, 0, REG_SZ, (void*)lpData, DataSize); RegCloseKey(hKey); 

Zum Ausführen der NtSetValueKey-Funktion benötigen Sie Administratorrechte. Infolgedessen wird in Ihrer Registrierung ein Wert mit dem Namen Test \ 0Zero angezeigt.

Einige Microsoft-Entwickler werden ebenfalls überrascht sein, da der Standard-Registrierungseditor keinen so ungewöhnlichen Registrierungswert anzeigen kann.


Zweite Geschichte


Die zweite Geschichte, die ich Ihnen heute erzählen werde, geschah 2013.

Zuerst ein kleiner Exkurs. Bei Kaspersky Lab bin ich Mitglied des Teams, das unter anderem Kaspersky Rescue Disk erstellt. Um Windows unter Linux zu heilen, müssen wir die Registrierungsdateien selbst analysieren. Und um die korrekte Funktion dieses Mechanismus zu überprüfen, verwenden wir viele Tests. Unter ihnen gibt es eine ziemlich einfache:

  • Unter Windows schreiben wir Testwerte in die Registrierung.
  • Kopieren Sie die Registrierungsstrukturdatei in das Testverzeichnis.
  • Wir starten das Programm, das das Entfernen von Testwerten durchführt.
  • Wir laden den geänderten Busch in die Registrierung, um die Entfernung zu überprüfen.

Und eines schönen Tages haben wir auf dem Windows-Prüfstand auf Version 8.1 aktualisiert, und der Test hat das Löschen von Testwerten gestoppt. Wie so, ich war überrascht. Ich habe die Datei mit der Registrierungsstruktur auf meinen Arbeitscomputer kopiert - keine Werte! Mein erster Gedanke: Ich muss dem Flush-Test geänderte Schlüssel hinzufügen. RegFlushKey wurde aufgerufen und der Test neu gestartet - keine Werte!

Funktioniert RegFlushKey nicht, dachte ich. Aber wie sich herausstellte, hatte ich nur teilweise recht.

Der Trick war, dass Microsoft in Windows 8.1 den Mechanismus zum Speichern von Änderungen in der Registrierung geändert hat. Zuvor wurden alle Registrierungsänderungen im Speicher gespeichert, und dann, wenn der Schlüssel geschlossen wurde, wenn RegFlushKey ausgeführt wurde oder nach einiger Zeit das System die Änderungen in der Registrierungsbuschdatei speicherte. In Windows 8.1 werden Änderungen anstelle der Registrierungsstrukturdatei in gleichnamigen Dateien mit den Erweiterungen .LOG, .LOG1 und .LOG2 gespeichert, und mein Code hat diese Dateien damals ignoriert.

In diesen Dateien sammeln sich Änderungen etwa eine Stunde lang an. Und erst danach beginnt Windows mit der Integration von Änderungen in die Hauptdatei. Diese Aufgabe wird als Abstimmung bezeichnet und beginnt entweder alle 40 Minuten oder wenn Windows heruntergefahren wird. Das Aufrufen der RegFlushKey-Funktion löst die Abstimmungsaufgabe nicht aus. Um den Start der Änderungsintegrationsaufgabe zu erzwingen, müssen Sie ZwSetSystemInformation mit dem undokumentierten Argument SystemRegistryReconciliationInformation aufrufen.

 ZwSetSystemInformation( 0x9b, //SystemRegistryReconciliationInformation NULL, 0); 

Zum Ausführen der ZwSetSystemInformation-Funktion benötigen Sie Administratorrechte. Die Architektur der ausführbaren Datei muss mit der Architektur des Systems übereinstimmen. Das Aufrufen dieser Funktion von einem 32-Bit-Programm unter 64-Bit-Windows schlägt fehl.

Dritte Geschichte


Vor einiger Zeit haben wir ein Rootkit entdeckt, das den Start seines Treibers in der Registrierung vorschreibt. Unsere Produkte haben die entsprechenden Registrierungsschlüssel gelöscht, aber nach dem Neustart befanden sich die Schlüssel an ihrer Stelle. Es sieht so aus, als würde er seine Rückruffunktionen auf Registrierungsänderungen setzen und seine Schlüssel nach unseren Änderungen wiederherstellen, dachte ich. Aber es stellte sich heraus, dass nein. Genauer gesagt ja. Das Rootkit stellte Rückruffunktionen ein, die jedoch nichts mit der Aufgabe der Schlüsselwiederherstellung zu tun hatten. Alles wurde einfacher und eleganter gemacht.

Der Rootkit-Treiber hat beim Start die SYSTEM-Registrierungsstrukturdatei in HARDWARE umbenannt. Ich habe meine SYSTEM-Datei erstellt und den HKLM / System-Zweig mithilfe der RegSaveKey-Funktion regelmäßig darin gespeichert. Beim Speichern stellte er seine Schlüssel wieder her. Beim Neustart von Windows hat das System die SYSTEM-Datei geladen und den Rootkit-Treiber gestartet. Ist es schön Schön.

Gesucht


PS Hier suchen wir einen Entwickler-Forscher in einem Team, das eine Anti-Spam-Engine sägt, und wir brauchen auch einen Testingenieur .

Source: https://habr.com/ru/post/de415699/


All Articles