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
21
Windows のカーネルモードドライバで填まった話
Satoshi MIMURA
September 11, 2014
Tweet
Share
More Decks by Satoshi MIMURA
See All by Satoshi MIMURA
Inside wsl
mimura1133
0
18
Edomae 2015 - マルウェアを解析してみよう
mimura1133
0
46
Windows でも TeX 編集がしたい!
mimura1133
0
13
3本指ジェスチャの仮想デスクトップ機能を Windows に実装した話
mimura1133
0
18
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
mimura1133
0
12
マシン語によるコード実行
mimura1133
0
9
Iron python と c sharp
mimura1133
0
12
Unix と windows 世界の融合
mimura1133
0
13
Windows Phone 7 と XNA の世界
mimura1133
0
12
Other Decks in Programming
See All in Programming
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
900
採用事例の少ないSvelteを選んだ理由と それを正解にするためにやっていること
oekazuma
2
1.1k
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
260
testcontainers のススメ
sgash708
1
120
情報漏洩させないための設計
kubotak
3
520
モバイルアプリにおける自動テストの導入戦略
ostk0069
0
110
Beyond ORM
77web
8
1.1k
php-conference-japan-2024
tasuku43
0
350
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
340
Security_for_introducing_eBPF
kentatada
0
110
テストコード書いてみませんか?
onopon
2
180
Go の GC の不得意な部分を克服したい
taiyow
3
820
Featured
See All Featured
Making Projects Easy
brettharned
116
6k
Fireside Chat
paigeccino
34
3.1k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
It's Worth the Effort
3n
183
28k
Navigating Team Friction
lara
183
15k
Typedesign – Prime Four
hannesfritz
40
2.4k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
GitHub's CSS Performance
jonrohan
1031
460k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
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