Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Windows のカーネルモードドライバで填まった話
Search
Satoshi MIMURA
September 11, 2014
Programming
0
24
Windows のカーネルモードドライバで填まった話
Satoshi MIMURA
September 11, 2014
Tweet
Share
More Decks by Satoshi MIMURA
See All by Satoshi MIMURA
Inside wsl
mimura1133
0
21
Edomae 2015 - マルウェアを解析してみよう
mimura1133
0
51
Windows でも TeX 編集がしたい!
mimura1133
0
18
3本指ジェスチャの仮想デスクトップ機能を Windows に実装した話
mimura1133
0
24
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
mimura1133
0
16
マシン語によるコード実行
mimura1133
0
12
Iron python と c sharp
mimura1133
0
18
Unix と windows 世界の融合
mimura1133
0
19
Windows Phone 7 と XNA の世界
mimura1133
0
16
Other Decks in Programming
See All in Programming
Navigation 3: 적응형 UI를 위한 앱 탐색
fornewid
1
520
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
250
GoLab2025 Recap
kuro_kurorrr
0
1.5k
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
180
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
310
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
310
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
SQL Server 2025 LT
odashinsuke
0
120
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
210
[AI Engineering Summit Tokyo 2025] LLMは計画業務のゲームチェンジャーか? 最適化業務における活⽤の可能性と限界
terryu16
2
240
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
180
Graviton と Nitro と私
maroon1st
0
160
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
120
Odyssey Design
rkendrick25
PRO
0
450
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
From π to Pie charts
rasagy
0
100
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
97
AI Search: Where Are We & What Can We Do About It?
aleyda
0
6.8k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
74
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
30 Presentation Tips
portentint
PRO
1
180
Darren the Foodie - Storyboard
khoart
PRO
1
2.1k
HDC tutorial
michielstock
1
300
Transcript
Windows の カーネルモードドライバで 填まった話 みむら (@mimura1133) 1
自己紹介 2
こんなひと • みむら ( @mimura1133 / Satoshi Mimura ) •
http://mimumimu.net/ • セキュリティキャンプ 2014 ソフトウェアセキュリティクラス チュータ(予定) • SECCON 2014 CTF for Beginners の旗振り役 ( http://2014.seccon.jp/2014_07_CTF_for_Beginners2.html ) • wasamusume という CTF チームの旗振り役 • 最近は土足で WinRT に入れないかいろいろ実験中 3
余談:この前。 • セキュリティキャンプ ネットワークセキュリティクラスの問題を解く Write-up を書きました。 • 問題ファイルは pcap で、その中からファイルを出してきて解くもの。
• なんか怖い人からこんなこと言われたので: • がんばってみました。 • https://mimumimu.net/blog/ 4
余談:この前。 5
こういう話ではなくてですね →本題に戻る 6
Windows の カーネルモードドライバで 填まった話 みむら (@mimura1133) 7
はじめに • 話題がディープすぎるので 何となく雰囲気を感じて頂くような内容にしました。 • ガチなドライバ開発者さん: 目一杯マサカリを飛ばしたくなるかもしれません • カーネルモードドライバ書いてみたい!という人: 別所で。15分では無理です。
8
そもそも「カーネルモード」ってなんぞ • カーネル空間で動作するもの! • 簡単ですね • カーネルモードとユーザモードがあって・・。 9
カーネルモードとユーザモード • ユーザモード: • 普段使うアプリケーションはここで動く • よく見る Windows API はここで叩く。
• WoW64 もここ。 • 何かやろうとしたら Windows API や カー ネルモードドライバを経由して指示を出す • カーネルモード: • HAL に直接触れられる • Windows カーネルに必ずしもお伺いを立て る必要なし。 • 各ビット用にプログラムを書く ユーザモード カーネルモード ユーザモード ドライバ カーネルモード ドライバ Windows カーネル 10
つまり ユーザデータ ユーザモードの プロセス カーネルモードの プロセス 11
簡単なOS の知識おさらい • OSによるアプリケーションの保護 • OS は各アプリケーションに 仮想的な I/O と
仮想記憶 による資源を提供する。 • 各アプリケーション毎にアドレスは仮想化されており、 互いに互いの領域に侵入したり値を書き換えたりは出来ない。 • アプリケーションは個別に実行されるので落ちても大丈夫 12
カーネルモードドライバでは • メモリアドレスは仮想化される: • でも カーネル含んで全体で一つの仮想化テーブルを共有する • カーネルモードドライバから カーネルのメモリ空間にアクセスしたりその逆が出来る •
カーネルモードドライバが落ちるときは カーネル含めて落ちる。一心同体。 13
つまり ユーザモードの プロセス 障害発生 カーネルモードの プロセス 障害発生 14
15
16
つまり ユーザモードの プロセス 障害発生 カーネルモードの プロセス 障害発生 17
でもいろいろと出来る • ハードウェアに直接触っていじれる。 →ハードディスクに直接命令出せる。 • プロセスの起動を阻害する事とかできる。 • ファイアウォールとしてジャッジを下せる。 • ネットワークパケットを回収できる。
→正義の目的にも、悪い目的にもどちらにも使える。 18
そんな良さそうな環境にも カーネルならではの障壁が IRQL のはなし 19
IRQL (割り込みレベル) • 各コードの実行に関して IRQL というレベルが設定されている。 • 通常実行時は PASSIVE_LEVEL •
緊急度の高いコールバックは DISPATCH_LEVEL で呼び出される。 Source IRQL Hardware HIGH_LEVEL クリティカルなエラー POWER_LEVEL 電源周りのエラー IPL_LEVEL プロセッサ間割込 CLOCK2_LEVEL CLOCK1_LEVEL PROFILE_LEVEL プロファイルタイマー DIRQL I/O デバイス割込 Software DISPATCH_LEVEL ディスパッチャ APC_LEVEL 非同期処理 APC PASSIVE_LEVEL スレッド実行 20
たとえば • 普通に main 関数から実行されるコード PASSIVE_LEVEL • タイマーを設定して呼び出されるコード DISPATCH_LEVEL [WdfExecutionLevelPassive
を使って PASSIVE_LEVEL で呼び出すことも出来る] • PsSetCreateProcessNotifyRoutine で設定したコールバック PASSIVE_LEVEL • Windows のファイアウォールとして設定したプログラムの呼び出し DISPATCH_LEVEL 21
何か意味あるの • これって何か意味あるの? • 上のレベルから下のレベル のコードは直接呼べない。 • 呼ぶとどうなるの IRQL_NOT_LESS_OR_EQUAL で
BSoD. • 某R社のドライバで 一時期よくありました( Source IRQL Hardware HIGH_LEVEL クリティカルなエラー POWER_LEVEL 電源周りのエラー IPL_LEVEL プロセッサ間割込 CLOCK2_LEVEL CLOCK1_LEVEL PROFILE_LEVEL プロファイルタイマー DIRQL I/O デバイス割込 Software DISPATCH_LEVEL ディスパッチャ APC_LEVEL 非同期処理 APC PASSIVE_LEVEL スレッド実行 22
つまり • PASSIVE_LEVEL の例: • 中島くんによる カツオの呼び出し。 • クリティカルではない。 •
何してもとりあえずOK 23
つまり • DISPATCH_LEVEL の例 • 波平によるカツオの呼び出し。 • クリティカル。 • 「勉強しろ」というのに
「遊んでいる」と (許可されていない動作) 動作を強制停止させられる (ブルースクリーン) 24
どの状態なら何して良いかわからない • MSDN を見ると書いてある 25
詰まったところ。 • IRQL の問題 • ディスクI/O (ファイル書き込みとかファイル作成とか)が 全部 PASSIVE_LEVEL じゃないと呼び出せない。
• でも仕掛けておいたタイマーは DISPATCH_LEVEL! 26
どう解決したか • ExQueueWorkItem を DelayedItem を引数にとって動かすと 指定した関数を PASSIVE_LEVEL で呼び出せる! •
やった! 27
コード void hogeo(int i) { // PASSIVE_LEVEL!! } void main(){
WORK_QUEUE_ITEM item; ExInitalizeWorkItem(&item, hogeo,0); ExQueueWorkItem(&item, DelayedWorkQueue); } 28
イメージ • カツオ(実行中のコンテキスト)が 波平の監視下にある(DISPATCH_LEVEL) • 「終わったらお菓子食べるから取っといて」と サザエに依頼する ( ExQueueWorkItem )
• 処理が終わった時に、サザエがお菓子を持って現れる (関数のコール) • カツオ、お菓子を食べる(処理の実行) 29
コード void hogeo(OKASHI okashi) // サザエによって呼び出される { // PASSIVE_LEVEL!! }
void main(){ // ここは波平によって呼び出される WORK_QUEUE_ITEM item; ExInitalizeWorkItem(&item, hogeo,new OKASHI(“塩昆布”)); ExQueueWorkItem(&item, DelayedWorkQueue); // サザエにお菓子を依頼する。 } 30
まとめ • カーネルモードドライバは慣れると楽しい • サザエさんのカツオはいつになったら中学生になるのだろう • IRQL は 波平さんを思い出そう。 •
困ったらサザエさんを使おう ( ExQueueWorkItem ) • プロ生ちゃん is かわいい 31 Title : Windows のカーネルモード(ry Twitter : @mimura1133