Más contenido relacionado
La actualidad más candente (10)
Similar a WHAT_A_KERNEL_IRQL (20)
Más de Satoshi Mimura (12)
WHAT_A_KERNEL_IRQL
- 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. 余談:この前。
• セキュリティキャンプ
ネットワークセキュリティクラスの問題を解くWrite-up を書きました。
• 問題ファイルはpcap で、その中からファイルを出してきて解くもの。
• なんか怖い人からこんなこと言われたので:
• がんばってみました。
• https://mimumimu.net/blog/ 4
- 8. はじめに
• 話題がディープすぎるので
何となく雰囲気を感じて頂くような内容にしました。
• ガチなドライバ開発者さん:
目一杯マサカリを飛ばしたくなるかもしれません
• カーネルモードドライバ書いてみたい!という人:
別所で。15分では無理です。
8
- 10. カーネルモードとユーザモード
• ユーザモード:
• 普段使うアプリケーションはここで動く
• よく見るWindows API はここで叩く。
• WoW64 もここ。
• 何かやろうとしたらWindows API やカー
ネルモードドライバを経由して指示を出す
• カーネルモード:
• HAL に直接触れられる
• Windows カーネルに必ずしもお伺いを立て
る必要なし。
• 各ビット用にプログラムを書く
ユーザモード
ユーザモード
ドライバ
カーネルモード
カーネルモード
ドライバ
Windows
カーネル
10
- 12. 簡単なOS の知識おさらい
• OSによるアプリケーションの保護
• OS は各アプリケーションに
仮想的なI/O と
仮想記憶による資源を提供する。
• 各アプリケーション毎にアドレスは仮想化されており、
互いに互いの領域に侵入したり値を書き換えたりは出来ない。
• アプリケーションは個別に実行されるので落ちても大丈夫
12
- 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. たとえば
• 普通にmain 関数から実行されるコード
PASSIVE_LEVEL
• タイマーを設定して呼び出されるコード
DISPATCH_LEVEL
[WdfExecutionLevelPassive を使ってPASSIVE_LEVEL で呼び出すことも出来る]
• PsSetCreateProcessNotifyRoutine で設定したコールバック
PASSIVE_LEVEL
• Windows のファイアウォールとして設定したプログラムの呼び出し
DISPATCH_LEVEL
21
- 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
- 24. つまり
• DISPATCH_LEVEL の例
• 波平によるカツオの呼び出し。
• クリティカル。
• 「勉強しろ」というのに
「遊んでいる」と
(許可されていない動作)
動作を強制停止させられる
(ブルースクリーン)
24
- 26. 詰まったところ。
• IRQL の問題
• ディスクI/O (ファイル書き込みとかファイル作成とか)が
全部PASSIVE_LEVEL じゃないと呼び出せない。
• でも仕掛けておいたタイマーはDISPATCH_LEVEL!
26
- 28. コード
void hogeo(int i)
{
// PASSIVE_LEVEL!!
}
void main(){
WORK_QUEUE_ITEM item;
ExInitalizeWorkItem(&item, hogeo,0);
ExQueueWorkItem(&item, DelayedWorkQueue);
} 28
- 29. イメージ
• カツオ(実行中のコンテキスト)が
波平の監視下にある(DISPATCH_LEVEL)
• 「終わったらお菓子食べるから取っといて」と
サザエに依頼する( ExQueueWorkItem )
• 処理が終わった時に、サザエがお菓子を持って現れる
(関数のコール)
• カツオ、お菓子を食べる(処理の実行)
29
- 30. コード
void hogeo(OKASHI okashi) // サザエによって呼び出される
{
// PASSIVE_LEVEL!!
}
void main(){ // ここは波平によって呼び出される
WORK_QUEUE_ITEM item;
ExInitalizeWorkItem(&item, hogeo,new OKASHI(“塩昆布”));
ExQueueWorkItem(&item, DelayedWorkQueue); // サザエにお菓子を依頼する。
} 30
- 31. まとめ
• カーネルモードドライバは慣れると楽しい
• サザエさんのカツオはいつになったら中学生になるのだろう
• IRQL は波平さんを思い出そう。
• 困ったらサザエさんを使おう
( ExQueueWorkItem )
• プロ生ちゃんis かわいい
31
Title : Windows のカーネルモード(ry
Twitter : @mimura1133