Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Windows の 
カーネルモードドライバで 
填まった話 
みむら(@mimura1133) 
1
自己紹介 
2
こんなひと 
• みむら( @mimura1133 / Satoshi Mimura ) 
• http://mimumimu.net/ 
• セキュリティキャンプ2014 
ソフトウェアセキュリティクラスチュータ(予定) 
• SECCON ...
余談:この前。 
• セキュリティキャンプ 
ネットワークセキュリティクラスの問題を解くWrite-up を書きました。 
• 問題ファイルはpcap で、その中からファイルを出してきて解くもの。 
• なんか怖い人からこんなこと言われたので:...
余談:この前。 
5
こういう話ではなくてですね 
→本題に戻る 
6
Windows の 
カーネルモードドライバで 
填まった話 
みむら(@mimura1133) 
7
はじめに 
• 話題がディープすぎるので 
何となく雰囲気を感じて頂くような内容にしました。 
• ガチなドライバ開発者さん: 
目一杯マサカリを飛ばしたくなるかもしれません 
• カーネルモードドライバ書いてみたい!という人: 
別所で。15...
そもそも「カーネルモード」ってなんぞ 
• カーネル空間で動作するもの! 
• 簡単ですね 
• カーネルモードとユーザモードがあって・・。 
9
カーネルモードとユーザモード 
• ユーザモード: 
• 普段使うアプリケーションはここで動く 
• よく見るWindows API はここで叩く。 
• WoW64 もここ。 
• 何かやろうとしたらWindows API やカー 
ネルモー...
つまり 
ユーザデータ 
ユーザモードの 
プロセス 
カーネルモードの 
プロセス 
11
簡単なOS の知識おさらい 
• OSによるアプリケーションの保護 
• OS は各アプリケーションに 
仮想的なI/O と 
仮想記憶による資源を提供する。 
• 各アプリケーション毎にアドレスは仮想化されており、 
互いに互いの領域に侵入し...
カーネルモードドライバでは 
• メモリアドレスは仮想化される: 
• でもカーネル含んで全体で一つの仮想化テーブルを共有する 
• カーネルモードドライバから 
カーネルのメモリ空間にアクセスしたりその逆が出来る 
• カーネルモードドライバ...
つまり 
ユーザモードの 
プロセス 
障害発生 
カーネルモードの 
プロセス 
障害発生 
14
15
16
つまり 
ユーザモードの 
障害発生カーネルモードの 
プロセス 
障害発生 
プロセス 
17
でもいろいろと出来る 
• ハードウェアに直接触っていじれる。 
→ハードディスクに直接命令出せる。 
• プロセスの起動を阻害する事とかできる。 
• ファイアウォールとしてジャッジを下せる。 
• ネットワークパケットを回収できる。 
→正...
そんな良さそうな環境にも 
カーネルならではの障壁が 
IRQL のはなし 
19
IRQL (割り込みレベル) 
• 各コードの実行に関して 
IRQL というレベルが設定されている。 
• 通常実行時は 
PASSIVE_LEVEL 
• 緊急度の高いコールバックは 
DISPATCH_LEVEL 
で呼び出される。 
S...
たとえば 
• 普通にmain 関数から実行されるコード 
PASSIVE_LEVEL 
• タイマーを設定して呼び出されるコード 
DISPATCH_LEVEL 
[WdfExecutionLevelPassive を使ってPASSIVE_L...
何か意味あるの 
• これって何か意味あるの? 
• 上のレベルから下のレベル 
のコードは直接呼べない。 
• 呼ぶとどうなるの 
IRQL_NOT_LESS_OR_EQUAL 
でBSoD. 
• 某R社のドライバで 
一時期よくありました...
つまり 
• 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)...
イメージ 
• カツオ(実行中のコンテキスト)が 
波平の監視下にある(DISPATCH_LEVEL) 
• 「終わったらお菓子食べるから取っといて」と 
サザエに依頼する( ExQueueWorkItem ) 
• 処理が終わった時に、サザエ...
コード 
void hogeo(OKASHI okashi) // サザエによって呼び出される 
{ 
// PASSIVE_LEVEL!! 
} 
void main(){ // ここは波平によって呼び出される 
WORK_QUEUE_ITE...
まとめ 
• カーネルモードドライバは慣れると楽しい 
• サザエさんのカツオはいつになったら中学生になるのだろう 
• IRQL は波平さんを思い出そう。 
• 困ったらサザエさんを使おう 
( ExQueueWorkItem ) 
• プロ...
Upcoming SlideShare
Loading in …5
×

WHAT_A_KERNEL_IRQL

710 views

Published on

Microsoft Windows Kernel Driver.

Published in: Devices & Hardware
  • Be the first to comment

  • Be the first to like this

WHAT_A_KERNEL_IRQL

  1. 1. Windows の カーネルモードドライバで 填まった話 みむら(@mimura1133) 1
  2. 2. 自己紹介 2
  3. 3. こんなひと • みむら( @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
  4. 4. 余談:この前。 • セキュリティキャンプ ネットワークセキュリティクラスの問題を解くWrite-up を書きました。 • 問題ファイルはpcap で、その中からファイルを出してきて解くもの。 • なんか怖い人からこんなこと言われたので: • がんばってみました。 • https://mimumimu.net/blog/ 4
  5. 5. 余談:この前。 5
  6. 6. こういう話ではなくてですね →本題に戻る 6
  7. 7. Windows の カーネルモードドライバで 填まった話 みむら(@mimura1133) 7
  8. 8. はじめに • 話題がディープすぎるので 何となく雰囲気を感じて頂くような内容にしました。 • ガチなドライバ開発者さん: 目一杯マサカリを飛ばしたくなるかもしれません • カーネルモードドライバ書いてみたい!という人: 別所で。15分では無理です。 8
  9. 9. そもそも「カーネルモード」ってなんぞ • カーネル空間で動作するもの! • 簡単ですね • カーネルモードとユーザモードがあって・・。 9
  10. 10. カーネルモードとユーザモード • ユーザモード: • 普段使うアプリケーションはここで動く • よく見るWindows API はここで叩く。 • WoW64 もここ。 • 何かやろうとしたらWindows API やカー ネルモードドライバを経由して指示を出す • カーネルモード: • HAL に直接触れられる • Windows カーネルに必ずしもお伺いを立て る必要なし。 • 各ビット用にプログラムを書く ユーザモード ユーザモード ドライバ カーネルモード カーネルモード ドライバ Windows カーネル 10
  11. 11. つまり ユーザデータ ユーザモードの プロセス カーネルモードの プロセス 11
  12. 12. 簡単なOS の知識おさらい • OSによるアプリケーションの保護 • OS は各アプリケーションに 仮想的なI/O と 仮想記憶による資源を提供する。 • 各アプリケーション毎にアドレスは仮想化されており、 互いに互いの領域に侵入したり値を書き換えたりは出来ない。 • アプリケーションは個別に実行されるので落ちても大丈夫 12
  13. 13. カーネルモードドライバでは • メモリアドレスは仮想化される: • でもカーネル含んで全体で一つの仮想化テーブルを共有する • カーネルモードドライバから カーネルのメモリ空間にアクセスしたりその逆が出来る • カーネルモードドライバが落ちるときは カーネル含めて落ちる。一心同体。 13
  14. 14. つまり ユーザモードの プロセス 障害発生 カーネルモードの プロセス 障害発生 14
  15. 15. 15
  16. 16. 16
  17. 17. つまり ユーザモードの 障害発生カーネルモードの プロセス 障害発生 プロセス 17
  18. 18. でもいろいろと出来る • ハードウェアに直接触っていじれる。 →ハードディスクに直接命令出せる。 • プロセスの起動を阻害する事とかできる。 • ファイアウォールとしてジャッジを下せる。 • ネットワークパケットを回収できる。 →正義の目的にも、悪い目的にもどちらにも使える。 18
  19. 19. そんな良さそうな環境にも カーネルならではの障壁が IRQL のはなし 19
  20. 20. 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
  21. 21. たとえば • 普通にmain 関数から実行されるコード PASSIVE_LEVEL • タイマーを設定して呼び出されるコード DISPATCH_LEVEL [WdfExecutionLevelPassive を使ってPASSIVE_LEVEL で呼び出すことも出来る] • PsSetCreateProcessNotifyRoutine で設定したコールバック PASSIVE_LEVEL • Windows のファイアウォールとして設定したプログラムの呼び出し DISPATCH_LEVEL 21
  22. 22. 何か意味あるの • これって何か意味あるの? • 上のレベルから下のレベル のコードは直接呼べない。 • 呼ぶとどうなるの 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
  23. 23. つまり • PASSIVE_LEVEL の例: • 中島くんによる カツオの呼び出し。 • クリティカルではない。 • 何してもとりあえずOK 23
  24. 24. つまり • DISPATCH_LEVEL の例 • 波平によるカツオの呼び出し。 • クリティカル。 • 「勉強しろ」というのに 「遊んでいる」と (許可されていない動作) 動作を強制停止させられる (ブルースクリーン) 24
  25. 25. どの状態なら何して良いかわからない • MSDN を見ると書いてある 25
  26. 26. 詰まったところ。 • IRQL の問題 • ディスクI/O (ファイル書き込みとかファイル作成とか)が 全部PASSIVE_LEVEL じゃないと呼び出せない。 • でも仕掛けておいたタイマーはDISPATCH_LEVEL! 26
  27. 27. どう解決したか • ExQueueWorkItem をDelayedItem を引数にとって動かすと 指定した関数をPASSIVE_LEVEL で呼び出せる! • やった! 27
  28. 28. コード void hogeo(int i) { // PASSIVE_LEVEL!! } void main(){ WORK_QUEUE_ITEM item; ExInitalizeWorkItem(&item, hogeo,0); ExQueueWorkItem(&item, DelayedWorkQueue); } 28
  29. 29. イメージ • カツオ(実行中のコンテキスト)が 波平の監視下にある(DISPATCH_LEVEL) • 「終わったらお菓子食べるから取っといて」と サザエに依頼する( ExQueueWorkItem ) • 処理が終わった時に、サザエがお菓子を持って現れる (関数のコール) • カツオ、お菓子を食べる(処理の実行) 29
  30. 30. コード void hogeo(OKASHI okashi) // サザエによって呼び出される { // PASSIVE_LEVEL!! } void main(){ // ここは波平によって呼び出される WORK_QUEUE_ITEM item; ExInitalizeWorkItem(&item, hogeo,new OKASHI(“塩昆布”)); ExQueueWorkItem(&item, DelayedWorkQueue); // サザエにお菓子を依頼する。 } 30
  31. 31. まとめ • カーネルモードドライバは慣れると楽しい • サザエさんのカツオはいつになったら中学生になるのだろう • IRQL は波平さんを思い出そう。 • 困ったらサザエさんを使おう ( ExQueueWorkItem ) • プロ生ちゃんis かわいい 31 Title : Windows のカーネルモード(ry Twitter : @mimura1133

×