>_ DevTrendsde

Sprache

Start

Sprachen

Bereiche

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicherheit
Rust

Wie Windhawk funktioniert und warum das Modifizieren von Windows wieder praktisch wurde

Jeder, der versucht hat, Windows an seine Wünsche anzupassen, stieß unweigerlich an Systemgrenzen. Windows 11 hat vertraute Taskleistenfunktionen entfernt, der Explorer ändert regelmäßig sein Verhalten, und eine benötigte kleine Funktion in einem Drittanbieterprogramm lässt sich nicht mit den integrierten Tools konfigurieren. Bisher erforderte jede solche Korrektur die Suche nach separaten Tweakers, das Patchen von Systembibliotheken oder das Herunterladen fragwürdiger Binärdateien aus Foren.

Das Windhawk-Projekt hat die Aufgabe aus einem anderen Blickwinkel betrachtet. Die Idee ähnelt Tampermonkey für Browser oder Magisk für Smartphones, funktioniert jedoch in der Umgebung klassischer Windows-Anwendungen.

Screenshot

Was ist Windhawk

Windhawk wurde vom Entwickler m417z erstellt, der in der Systemprogramme-Community für das Projekt 7+ Taskbar Tweaker bekannt ist. Im Gegensatz zu alten Tweakers, die monolithische Utilities waren, hat der Autor hier eine offene Plattform aufgebaut.

Das Prinzip ist einfach: Es gibt eine einheitliche Code-Injection-Engine und einen Katalog kleiner Mods. Jeder Mod löst ein spezifisches Problem – stellt die klassische Taskleiste wieder her, fügt eine Lautstärkeregelung mit dem Mausrad über dem Tray hinzu oder entfernt unnötige Schaltflächen aus dem Explorer.

Benutzer sehen eine übersichtliche grafische Oberfläche, in der sie die benötigte Korrektur mit einem einzigen Klick aktivieren können. Für Entwickler öffnet Windhawk eine voll ausgestattete C++-Hook-Erstellungsumgebung direkt im Programm, mit einem integrierten Code-Editor und sofortiger Kompilierung.

Architektur und technische Details

Die größte Herausforderung bei der Modifikation von Programmen unter Windows besteht darin, sicherzustellen, dass der Code rechtzeitig injiziert wird, stabil funktioniert und benachbarte Prozesse nicht beeinträchtigt.

High level architecture diagram

Im Repository ist der Quellcode in drei Hauptkomponenten unterteilt:

  • windhawk – der Systemdienst windhawk.exe sowie 32-Bit- und 64-Bit-windhawk.dll-Bibliotheken, die für globale Injection und Funktionsabfangung verantwortlich sind;
  • vscode-windhawk – das Interface-Backend, das die Mod-Installation, Updates und Konfiguration verwaltet;
  • vscode-windhawk-ui – das Frontend basierend auf Webtechnologien und dem Monaco-Editor, in dem Mod-Parameter konfiguriert und Code geschrieben wird.

Die Engine nutzt globale Abfangung und DLL-Injection in Zielprozesse. Wenn ein Programm gestartet wird, das unter Modifikationsregeln fällt, injiziert Windhawk seine Bibliothek. Diese Bibliothek fängt Win32-API-Aufrufe oder interne undokumentierte Funktionen der Anwendung ab und ersetzt deren Verhalten durch das, was im Mod beschrieben ist.

Dieser Ansatz schützt das Betriebssystem vor Beschädigung. Dateien auf der Festplatte werden nicht modifiziert, Systembibliotheken bleiben unberührt und sfc /scannow-Integritätsprüfungen melden keine Fehler. Wenn ein Mod nach einem Windows-Update nicht mehr funktioniert, kann man ihn einfach in der Oberfläche deaktivieren oder das System im abgesicherten Modus starten.

Wie Mods geschrieben werden

Das Schreiben von Modifikationen erfordert nicht die Einrichtung einer schwergewichtigen Visual Studio-Umgebung mit allen System-SDKs. Windhawk lädt die notwendige Compiler-Toolchain im Hintergrund herunter.

Der Quellcode eines Mods ist eine C++-Datei mit speziellen Metadaten in Kommentaren, ähnlich wie Browser-Userscripts:

// ==WindhawkMod==
// @id              custom-window-title
// @name            Custom Window Title
// @description     Изменяет заголовок окна блокнота
// @version         1.0
// @include         notepad.exe
// ==/WindhawkMod==

#include <windhawk_api.h>

typedef HWND (WINAPI *CreateWindowExW_t)(
    DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName,
    DWORD dwStyle, int X, int Y, int nWidth, int nHeight,
    HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam
);

CreateWindowExW_t pOriginalCreateWindowExW;

HWND WINAPI Hook_CreateWindowExW(
    DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName,
    DWORD dwStyle, int X, int Y, int nWidth, int nHeight,
    HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam
) {
    if (lpWindowName && wcscmp(lpWindowName, L"Untitled - Notepad") == 0) {
        lpWindowName = L"Мой кастомный блокнот";
    }
    return pOriginalCreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}

BOOL Wh_ModInit() {
    Wh_Log(L"Инициализация мода");
    
    HMODULE hUser32 = GetModuleHandle(L"user32.dll");
    void* pCreateWindowExW = (void*)GetProcAddress(hUser32, "CreateWindowExW");
    
    Wh_SetFunctionHook(pCreateWindowExW, (void*)Hook_CreateWindowExW, (void**)&pOriginalCreateWindowExW);
    return TRUE;
}

Der Mod wird direkt in der Anwendung kompiliert. Die Engine überwacht Dateiänderungen und lädt die dynamische Bibliothek im Zielprozess neu, ohne das Betriebssystem neu starten zu müssen.

Praktischer Nutzen

Das Tool adressiert mehrere Szenarien, die zuvor Workarounds erforderten.

Erstens die Feinabstimmung der Explorer- und Taskleistenoberfläche. Es gibt Mods zum Ändern der Taskleistenhöhe, zum Ausblenden unnötiger Kontextmenüeinträge, zum Wechseln von Tabs mit dem Mausrad und zum Anpassen des Tray-Bereichs.

Zweitens die Behebung lästigen Verhaltens von Drittanbietersoftware. Wenn einem Programm ein Hotkey fehlt oder sein Fenster standardmäßig nicht in die Taskleiste minimiert wird, kann man einen Hook für user32.dll oder win32u.dll schreiben und die Fenster-Nachrichtenbehandlung neu definieren.

Drittens ist es eine ausgezeichnete Grundlage für Reverse Engineering. Wenn man die Interna von Windows-Anwendungen untersucht, vereinfacht Windhawk Experimente mit Funktionsabfangung, Parameter-Logging und Hypothesenprüfung.

Nuancen und Einschränkungen

Bei der Arbeit mit globaler Injection ist es wichtig, die Besonderheiten von Sicherheitssoftware zu berücksichtigen. Antivirusprogramme reagieren manchmal auf Funktionsabfangung in Systemprozessen, obwohl die ausführbaren Dateien des Projekts eine gültige digitale Signatur haben.

Das Schreiben komplexer Mods für undokumentierte Explorer-Schnittstellen erfordert nach wie vor Reverse-Engineering-Fähigkeiten und Verständnis der Nutzung von Debuggern wie x64dbg oder IDA Pro. Windows-Schnittstellen ändern sich oft von Build zu Build, sodass Autoren Funktionssignaturen für verschiedene Bibliotheksversionen pflegen müssen.

Lohnt es sich, es zu versuchen

Windhawk hat die fragmentierte Welt der Windows-Tweaks in eine strukturierte und transparente Umgebung verwandelt. Das Projekt ist in C++ und Rust geschrieben, unter der GPL-3.0-Lizenz verteilt und verfügt über eine aktive Entwickler-Community.

Wenn Sie vermisste Funktionen in Windows 11 vermissen, lohnt es sich, das Projekt zumindest wegen des fertigen Mod-Katalogs zu installieren. Und für C++-Entwickler, die sich für Low-Level-Win32-API interessieren, zeigt der Repository-Quellcode viele praktische Techniken für Library-Injection und Hooking.

Ähnliche Projekte