>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

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

Come funziona Windhawk e perché modificare Windows è tornato a essere conveniente

Chiunque abbia provato a personalizzare Windows secondo le proprie preferenze si è inevitabilmente scontrato con le limitazioni del sistema. Windows 11 ha rimosso le funzionalità familiari della barra delle applicazioni, Explorer cambia periodicamente il suo comportamento e una piccola funzione necessaria in un programma di terze parti non può essere configurata con gli strumenti integrati. In precedenza, ogni correzione del genere richiedeva la ricerca di tweak separati, il patching delle librerie di sistema o il download di binari discutibili dai forum.

Il progetto Windhawk ha affrontato il compito da un'angolazione diversa. La sua idea ricorda Tampermonkey per i browser o Magisk per gli smartphone, ma funziona nell'ambiente delle applicazioni Windows classiche.

Screenshot

Cos'è Windhawk

Windhawk è stato creato dallo sviluppatore m417z, noto nella comunità delle utility di sistema per il progetto 7+ Taskbar Tweaker. A differenza dei vecchi tweak, che erano utility monolitiche, l'autore ha costruito qui una piattaforma aperta.

L'essenza è semplice: c'è un motore di iniezione di codice unificato e un catalogo di piccole mod. Ogni mod risolve un problema specifico — ripristina la barra delle applicazioni classica, aggiunge la regolazione del volume con la rotella del mouse sulla tray o rimuove i pulsanti non necessari da Explorer.

Gli utenti vedono un'interfaccia grafica ordinata dove possono abilitare la correzione necessaria con un solo clic. Per gli sviluppatori, Windhawk apre un ambiente di creazione di hook C++ completo direttamente all'interno del programma, con un editor di codice integrato e compilazione istantanea.

Architettura e Dettagli Tecnici

La sfida principale quando si modificano i programmi in Windows è garantire che il codice venga iniettato in tempo, funzioni in modo stabile e non rompa i processi vicini.

Diagramma dell'architettura di alto livello

Nel repository, il codice sorgente è diviso in tre componenti principali:

  • windhawk — il servizio di sistema windhawk.exe, così come le librerie a 32 bit e 64 bit windhawk.dll responsabili dell'iniezione globale e dell'intercettazione delle funzioni;
  • vscode-windhawk — il backend dell'interfaccia che gestisce l'installazione, gli aggiornamenti e la configurazione delle mod;
  • vscode-windhawk-ui — il frontend basato su tecnologie web e l'editor Monaco, dove vengono configurati i parametri delle mod e viene scritto il codice.

Il motore utilizza l'intercettazione globale e l'iniezione di DLL nei processi target. Quando viene avviato un programma coperto dalle regole di modifica, Windhawk inietta la sua libreria. Questa libreria intercetta le chiamate API Win32 o le funzioni interne non documentate dell'applicazione, sostituendo il loro comportamento con quello descritto nella mod.

Questo approccio protegge il sistema operativo dalla corruzione. I file su disco non vengono modificati, le librerie di sistema rimangono intatte e i controlli di integrità sfc /scannow non segnalano errori. Se qualche mod inizia a fallire dopo un aggiornamento di Windows, puoi semplicemente disabilitarla nell'interfaccia o avviare il sistema in modalità provvisoria.

Come vengono scritte le Mod

Scrivere modifiche non richiede la configurazione di un pesante Visual Studio con tutti gli SDK di sistema. Windhawk scarica automaticamente la toolchain del compilatore necessaria in background.

Il codice sorgente di una mod è un file C++ con metadati speciali nei commenti, simile agli userscript dei browser:

// ==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;
}

La mod viene compilata direttamente nell'applicazione. Il motore monitora le modifiche ai file e ricarica la libreria dinamica nel processo target senza bisogno di riavviare il sistema operativo.

Vantaggi Pratici

Lo strumento affronta diversi scenari che in precedenza richiedevano soluzioni alternative.

Innanzitutto, la messa a punto dell'interfaccia di Explorer e della barra delle applicazioni. Sono disponibili mod per modificare l'altezza della barra delle applicazioni, nascondere voci di menu contestuale non necessarie, cambiare schede con la rotella del mouse e personalizzare la tray.

In secondo luogo, la correzione del comportamento fastidioso del software di terze parti. Se a un programma manca una scorciatoia da tastiera o la sua finestra non si riduce a icona nella tray per impostazione predefinita, puoi scrivere un hook per user32.dll o win32u.dll e ridefinire la gestione dei messaggi della finestra.

In terzo luogo, è un'eccellente base per il reverse engineering. Se stai studiando gli interni delle applicazioni Windows, Windhawk semplifica gli esperimenti con l'intercettazione delle funzioni, la registrazione dei parametri e il test delle ipotesi.

Sfumature e Limitazioni

Quando si lavora con l'iniezione globale, è importante considerare le specifiche del software di sicurezza. I programmi antivirus a volte reagiscono all'intercettazione delle funzioni nei processi di sistema, sebbene gli eseguibili del progetto abbiano una firma digitale valida.

Scrivere mod complesse per le interfacce Explorer non documentate richiede ancora competenze di reverse engineering e comprensione dell'uso di debugger come x64dbg o IDA Pro. Le interfacce di Windows cambiano spesso da build a build, quindi gli autori devono mantenere le firme delle funzioni per diverse versioni delle librerie.

Vale la Pena Provarlo

Windhawk ha trasformato il mondo frammentato dei tweak di Windows in un ambiente strutturato e trasparente. Il progetto è scritto in C++ e Rust, distribuito sotto la licenza GPL-3.0 e ha una comunità di sviluppatori attiva.

Se ti mancano le funzionalità familiari in Windows 11, il progetto vale la pena di essere installato almeno per il catalogo di mod pronte all'uso. E per gli sviluppatori C++ interessati alle API Win32 di basso livello, il codice sorgente del repository mostrerà molte tecniche pratiche per l'iniezione di librerie e l'hooking.

Progetti correlati