shade — Windows x86 DLL 隠蔽ツール
概要
shadeは、Windows上で動作する小さなx86向けツールで、プロセスから特定のDLLを「アンロードして隠す」ことを目的としています。実装はRustで、まず対象モジュールのメモリをスナップショットしてからそれを元のベースアドレスにリマップし、続けてFreeLibraryを繰り返し呼び出してモジュールの参照カウントを0にすると同時にプロセスのモジュールリストから取り除きます。その結果、CreateToolhelp32SnapshotやEnumProcessModules、あるいはツールヘルプに依存するスキャナ上ではモジュールが検出されなくなります。Win32 APIの挙動やプロセスメモリ管理を学ぶための実験的ツールとして作られています。
リポジトリの統計情報
- スター数: 3
- フォーク数: 0
- ウォッチャー数: 3
- コミット数: 14
- ファイル数: 5
- メインの言語: Rust
主な特徴
- CreateToolhelp32Snapshot / EnumProcessModules 等のAPIからDLLを隠蔽
- 対象モジュールのメモリをスナップショットし、元のベースアドレスに再マップ
- FreeLibraryを繰り返し呼び出して参照カウントを0にしモジュールリストから除去
- Rustで実装(x86 Windows向け、学習・実験目的)
技術的なポイント
shadeが行っている手順は概ね次の流れです。まず対象DLLのメモリ領域を読み取り、その状態をスナップショット(バックアップ)します。次に、そのスナップショットを元のベースアドレスに再マップすることで、モジュールのコードやデータがメモリ上に残るようにします。並行してFreeLibraryを繰り返し呼び出すことで、モジュールの参照カウントを強制的に0にし、Windowsのプロセスモジュールリスト(ツールヘルプやLdrの管理リスト)から該当エントリが解除されるように仕向けます。結果としてCreateToolhelp32SnapshotやEnumProcessModules等のユーザーモードAPIを用いるスキャナは、プロセスのモジュール一覧にそのDLLを見つけられなくなります。
このアプローチはWin32のモジュール管理や参照カウントの挙動、メモリマッピングの仕組みを利用しており、検出回避の一種であると言えます。一方で制約やリスクも明確です。x86向けに設計されているためプロセスのアーキテクチャと一致している必要があり、ASLRやリロケーション、インポートテーブルの扱いを正しく処理しないとクラッシュを招く可能性があります。また、カーネル側や別の検出手法(直接PEB/Ldr構造体を調べる、カーネルのモジュール一覧を参照する等)であれば隠蔽は破られます。さらに、稼働中のモジュールを無理にアンロードすることは安定性の問題やデータ破損を引き起こすため、実運用や悪用は厳に慎むべきです。
実装がRustである点は、安全性と高速な探索の両立を狙う良い選択で、Win32 API呼び出しのラップやFFIの扱いを通じて低レベルなメモリ操作・プロセス操作を学ぶ教材として有用です。小さなコードベース(ファイル数も少ない)でWin32の内部動作を試すためのシンプルな実験ツールと位置付けられます。
プロジェクトの構成
主要なファイルとディレクトリ:
- .gitignore: file
- Cargo.lock: file
- Cargo.toml: file
- readme.md: file
- src: dir
まとめ
Win32のDLL管理とメモリ操作を学ぶための実験的なRust製ツール。実運用や悪用は避けるべき。
リポジトリ情報:
- 名前: shade
- 説明: x86 dll hider for windows processes
- スター数: 3
- 言語: Rust
- URL: https://github.com/lucastavares06/shade
- オーナー: lucastavares06
- アバター: https://avatars.githubusercontent.com/u/146768406?v=4
READMEの抜粋:
shade 🚀
a small windows tool for unloading and hiding dll modules from toolhelp32 snapshots - built to explore rust and the win32 api.
what it does
calls FreeLibrary repeatedly until the module’s reference count reaches zero, removing it from the process module list. before unloading, it snapshots the module’s memory and remaps it at the original base address.
the result: the module disappears from CreateToolhelp32Snapshot, EnumProcessModules, and any scanner that relies on toolh…