>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Rust

Windhawkの仕組みと、Windows改造が再び便利になった理由

Windowsを自分の好みにカスタマイズしようとした人は 누구나、必ずシステム上の制約に直面します。Windows 11ではおなじみのタスクバー機能が削除され、Explorerは定期的に動作を変更し、サードパーティプログラムの必要な小さな機能が組み込みツールでは設定できないことがあります。以前は、このような修正一つ一つに、個別の tweaker を検索したり、システムライブラリにパッチを当てたり、フォーラムから怪しいバイナリをダウンロードしたりする必要がありました。

Windhawkプロジェクトは異なる角度からこの課題に取り組みました。そのアイデアは、ブラウザ向けTampermonkeyやスマートフォン向けMagiskに似ていますが、クラシックなWindowsアプリケーション環境で動作します。

Screenshot

Windhawkとは

Windhawkは、システムユーティリティコミュニティで7+ Taskbar Tweakerプロジェクトで知られる開発者m417zによって作成されました。古いtweakerがモノリシックなユーティリティだったのに対し、著者はここにオープンプラットフォームを構築しました。

本質はシンプルです:統一されたコードインジェクションエンジンと、小さなモッドのカタログがあります。各モッドは特定の問題を解決します—クラシックなタスクバーを復元したり、トレイ上でマウスホイールによる音量調整を追加したり、Explorerから不必要なボタンを削除したりします。

ユーザーは整然としたグラフィカルインターフェースで、必要な修正を1クリックで有効にできます。開発者にとって、Windhawkはプログラム内に組み込まれたフル機能のC++フック作成環境を開き、組み込みのコードエディタと即時コンパイルを備えています。

アーキテクチャと技術的詳細

Windowsでプログラムを改造する際の主な課題は、コードが適切なタイミングでインジェクションされること、安定して動作すること、そして隣接するプロセスを壊さないことを保証することです。

High level architecture diagram

リポジトリでは、ソースコードは3つの主要コンポーネントに分かれています:

  • windhawk — システムサービスであるwindhawk.exeと、32ビットおよび64ビットのwindhawk.dllライブラリで、グローバルなインジェクションと関数傍受を担当します;
  • vscode-windhawk — モッドのインストール、更新、設定を管理するインターフェースバックエンド;
  • vscode-windhawk-ui — Web技術とMonacoエディタに基づいたフロントエンドで、モッドパラメータの設定とコードの記述を行います。

エンジンはグローバルな傍受とターゲットプロセスへのDLLインジェクションを使用します。改造ルールが適用されるプログラムが起動されると、Windhawkはそのライブラリをインジェクションします。このライブラリはWin32 API呼び出しまたはアプリケーションの内部的な未文書化関数を傍受し、モッドで記述された動作にその動作を置き換えます。

このアプローチにより、オペレーティングシステム破損から保護します。ディスク上のファイルは変更されず、システムライブラリはそのまま保持され、sfc /scannow整合性チェックはエラーを報告しません。Windowsの更新後に一部のモッドが動作しなくなった場合は、インターフェースで無効にするか、セーフモードでシステムを起動するだけです。

モッドの書き方

改造を書くために、すべてのシステムSDKを含む重量級のVisual Studioを設定する必要はありません。Windhawkはバックグラウンドで必要なコンパイラツールチェーンをダウンロードします。

モッドのソースコードは、ブラウザのユーザースクリプトと同様に、コメント内に特別なメタデータを含むC++ファイルです:

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

モッドはアプリケーション内で直接コンパイルされます。エンジンはファイルの変更を監視し、オペレーティングシステムを再起動する必要なく、ターゲットプロセス内のダイナミックライブラリをリロードします。

実用的なメリット

このツールは、以前は回避策が必要だったいくつかのシナリオに対応しています。

第一に、Explorerとタスクバーインターフェースの微調整です。タスクバーの高さ変更、不要なコンテキストメニューの項目の非表示、マウスホイールでのタブ切り替え、トレイのカスタマイズなどのモッドが利用可能です。

第二に、サードパーティソフトウェアの厄介な動作の修正です。プログラムにホットキーが不足していたり、ウィンドウがデフォルトでトレイに最小化されない場合、user32.dllまたはwin32u.dllのフックを書いてウィンドウメッセージの処理を再定義できます。

第三に、リバースエンジニアリングの優れた基盤となります。Windowsアプリケーションの内部を学研究している場合、Windhawkは関数傍受、パラメータロギング、仮説テストの実験を簡素化します。

ニュアンスと制限事項

グローバルなインジェクションを扱う場合、セキュリティソフトウェアの特性を考慮することが重要です。アンチウイルスプログラムは、システムプロセスでの関数傍受に反応することがあります。ただし、プロジェクトの実行ファイルには有効なデジタル署名があります。

未文書化のExplorerインターフェース用の複雑なモッドを書くには、リバースエンジニアリングスキルとx64dbgやIDA Proのようなデバッガの使用理解が依然として必要です。Windowsインターフェースはビルドごとに頻繁に変わるため、作者は異なるライブラリバージョン用の関数シグネチャを維持する必要があります。

試してみる価値はあるか

Windhawkは、断片化されたWindows改造の世界を構造化され透明な環境に変えました。プロジェクトはC++とRustで書かれており、GPL-3.0ライセンスで配布され、アクティブな開発者コミュニティがあります。

Windows 11でおなじみの機能が不足しているなら、 готовыйモッドカタログのために少なくともインストールする価値があります。そして低レベルのWin32 APIに興味のあるC++開発者にとって、リポジトリのソースコードは、ライブラリインジェクションとフッキングのための多くの実践的なテクニックを示しています。

関連プロジェクト