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
16
Windows のカーネルモードドライバで填まった話
Satoshi MIMURA
September 11, 2014
Tweet
Share
More Decks by Satoshi MIMURA
See All by Satoshi MIMURA
Inside wsl
mimura1133
0
15
Edomae 2015 - マルウェアを解析してみよう
mimura1133
0
41
Windows でも TeX 編集がしたい!
mimura1133
0
6
3本指ジェスチャの仮想デスクトップ機能を Windows に実装した話
mimura1133
0
9
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
mimura1133
0
10
マシン語によるコード実行
mimura1133
0
6
Iron python と c sharp
mimura1133
0
9
Unix と windows 世界の融合
mimura1133
0
11
Windows Phone 7 と XNA の世界
mimura1133
0
10
Other Decks in Programming
See All in Programming
“Seeing Like a Programmer”—Resiliency, Limits, and Moral Hazards in Software Engineering (LambdaConf 2024)
chriskrycho
0
430
Using "modern" Ruby to build a better, faster Homebrew
mikemcquaid
2
260
Direct Style Effect Systems The Print[A] ExampleA Comprehension Aid
philipschwarz
PRO
0
410
GitHub Actionsの痒いところを埋めるサードパーティーランナー
dora1998
2
250
FoodGram
iseruuuuu
0
230
戦略的DDDは重いのか? / Is strategic DDD heavy?
pictiny
3
2.1k
仕様と実装で学ぶOpenTelemetry
drumato
2
980
Try creating your own orderedmap
kazamori
1
280
Good first issues of TypeProf
mame
3
550
Deep Dive into React Stream/Serialize
mugi_uno
4
860
Ruby on Fails - effective error handling with Rails conventions
talyssonoc
0
300
RubyGems on ruby.wasm
kateinoigakukun
0
110
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
22
6.5k
KATA
mclloyd
16
12k
Creatively Recalculating Your Daily Design Routine
revolveconf
211
11k
Build your cross-platform service in a week with App Engine
jlugia
226
17k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
9
1.3k
Stop Working from a Prison Cell
hatefulcrawdad
266
19k
The Invisible Side of Design
smashingmag
294
49k
10 Git Anti Patterns You Should be Aware of
lemiorhan
649
58k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
15
1.6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
20
1.8k
jQuery: Nuts, Bolts and Bling
dougneiner
60
7.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
123
39k
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