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
20
Edomae 2015 - マルウェアを解析してみよう
mimura1133
0
50
Windows でも TeX 編集がしたい!
mimura1133
0
17
3本指ジェスチャの仮想デスクトップ機能を Windows に実装した話
mimura1133
0
21
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
mimura1133
0
16
マシン語によるコード実行
mimura1133
0
12
Iron python と c sharp
mimura1133
0
15
Unix と windows 世界の融合
mimura1133
0
16
Windows Phone 7 と XNA の世界
mimura1133
0
16
Other Decks in Programming
See All in Programming
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
110
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
140
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
210
Introducing ReActionView: A new ActionView-compatible ERB Engine @ Rails World 2025, Amsterdam
marcoroth
0
680
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
1.3k
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
250
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
140
testingを眺める
matumoto
1
140
Testing Trophyは叫ばない
toms74209200
0
860
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
360
JSONataを使ってみよう Step Functionsが楽しくなる実践テクニック #devio2025
dafujii
1
530
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
20
11k
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
Site-Speed That Sticks
csswizardry
10
810
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
The Invisible Side of Design
smashingmag
301
51k
A designer walks into a library…
pauljervisheath
207
24k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
840
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.9k
The Language of Interfaces
destraynor
161
25k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.8k
Done Done
chrislema
185
16k
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