読者です 読者をやめる 読者になる 読者になる

Twitterに書ききれないこと

イベントや技術的なことを記したい・・・

SandPrint: Fingerprinting Malware Sandboxes to Provide Intelligence for Sandbox Evasionの紹介

この記事は情報セキュリティ系論文紹介 Advent Calendar 2016 13日目の記事である.

www.adventar.org

本記事で用いられている図表はこの論文から引用したものである.

筆者は英語に長けおらず,専門知識も乏しいので誤訳・誤解釈している場合があるので,詳細な内容は元論文を参考されたし.

SandPrint: Fingerprinting Malware Sandboxes to Provide Intelligence for Sandbox Evasion - Springer

全然要約できていおらず申し訳ない・・・ 概要,はじめに,おわりに,各章のまとめを流し読めば,だいたいの内容が理解できると思う. 有名所のサンドボックス検知手法を用いずに,サンドボックス検知しているところが面白いなと思った.

概要

増加するマルウェアに対処するため,自動的にプログラムを解析する技術が必要となる.特にマルウェアサンドボックスは,プログラムの動作を抽出するために標準的に用いられる.しかし,プログラムをサブミットできる人は,特定のサンドボックスの特性を学習してリークさせることができる.Windowsがターゲットのサンドボックスの特性を測定してリークさせるプログラムであるSandPrintを紹介する.我々は20のマルウェア分析サービスにツールをサブミットし,2666の分析レポートを収集し,76のサンドボックスクラスタ化する.次に,攻撃者が単一のサンドボックスの特性だけでなく,すべてのサンドボックスに固有の特性のサブセットを検出できるかどうかを評価する.実際に,教師付き学習技術を使用して,敵が自動的にサンドボックスと実際のシステムを区別できるクラスを自動的に生成できることを示す.最後に,3つの一般的なベンダーの市販のマルウェアセキュリティアプライアンスを同様の手法で密かに検出できることを示す.

1. はじめに

悪意のあるソフトウェアは,今日の主要なセキュリティ上の課題の1つである.さまざまな形で,マルウェアはビジネスと同様に消費者にとって脅威である.マルウェアの増加は亜種によるものだが,日常的にほぼ発見される新しい検体によっても引き起こされる.

防御側は大量のマルウェアに対処するために未知のプログラムを自動化する方法を分析するためのいくつかの補完的なアプローチを導入した.特に,Windowsベースのマルウェアサンドボックスは,学術的,業界的にも自動マルウェア分析[24]のデファクトスタンダードになっている.サンドボックスは,新種のマルウェア解析,マルウェア検出メカニズムのための入力データ,マルウェアのC&Cサーバ,バンキングトロイ,リバースエンジニアリングの手作業を支援で活用されて脅威情報を収集する.最後に,サンドボックスは動的マルウェア分析によって組織を保護することを目的の商業マルウェアセキュリティ・アプライアンスの一部として使用される.

未知のプログラムの分析を自動化すると,解析が無人であるというリスクがある. 多くの場合,サンプルを受信し,解析のためにスケジューリングして実行した後に解析結果をサンプル提出者に返すことさえも完全自動化された処理チェーンに組み込まれている.サンドボックスにサンプルを提出できる人は、特定のサンドボックスの特性をリークさせる可能性がある.通常は、自動マルウェア分析サービスにサンプルを提出し,その後サンドボックスのサンプルを再配布し,簡単にグローバルなサンドボックスの内部を洞察する大規模なソースを生成する.

本稿では,この一般的な考え方に沿ってサンドボックスの特性(正確なOS情報、ネットワーク構成、またはインストール,またはエミュレートされたハードウェアなど)を測定してリークするWindowsベースのプログラムであるSandPrintを紹介する.対象としたのは以下のマルウェア解析サービスである.これらの11のサービスから2666の分析レポートを収集した.

サンドボックスを把握しようとする試みでは,教師なし学習メカニズムを使用して,SandPrintレポートとそのさまざまな機能をグループ化し,サンドボックスを識別する. このプロセスは76のサンドボックスを暴く,それらの多くは、マルウェア解析サービスとの自動サンプル交換によってサンプルを得ることが多い.

マルウェアサンドボックスを検出することは可能か? 今のところ、多くのマルウェアファミリーは,個々のサンドボックスアーティファクトを特定する(仮想化を検出したり、特定のサンドボックス構成を回避する)手法を持っている. 我々は代わりに,攻撃者が単一のサンドボックスの特性だけでなく、すべてのサンドボックスに固有の特性を検出する可能性があるかどうかを調べる(たとえば、SandPrintのようなツールを使用して).収集された特徴に基づいた教師あり学習を活用し,サンドボックスを確実に検出する自動分類を訓練する.

最後に、一般的なベンダーのマルウェアアプライアンスを検出する可能性に着目する.これらのアプライアンスが内部的にサンドボックス技術も使用しているため,同様の回避攻撃を受ける可能性が高い. 実際には,上記のサンドボックスの上だけで分類器を訓練することによって,攻撃者がアプライアンスを回避する可能性があることを示している.

この論文の貢献を要約を以下に示す. * マルウェアサンドボックスの特性を評価するためのツールであるSandPrintを提供した.それを20のパブリックなマルウェア解析サービスに提出し,教師なし学習技術を使用して76のサンドボックスの特性を特定した. * その結果得られたSandPrintレポートを活用して,サンドボックスとユーザシステムを確実に区別することができるようになった. * マルウェアセキュリティアプライアンスサンドボックスの内部を事前に把握しなくても,それを検出するためにパブリックサンドボックスから学んだ特性を使用できることを示した.

2.背景

この論文全体で使用する用語について説明する.「サンドボックス」という用語は,未知のプログラム(サンプルと呼ぶ)を実行する動的解析環境を指す.サンドボックスは,現在のキャンペーン[19],最近のC&Cサーバーとトラッキングパターン[46,36,44]や攻撃対象[26]など,悪意のあるソフトウェア(マルウェア)に対する識見を得るために広く使用される.同様に、サンドボックスを使用して,疑わしい行動パターンをマルウェアファミリーに分類したり,特定したりすることができる[32]. Egeleらは,既知のサンドボックス実装[24]の包括的な概要を示している.

マルウェアサンドボックスを使用するのは学者だけではない.手動分析とは対照的に,サンドボックスは高度に自動化されている.そのため,アンチウイルス業界のマルウェア対策アプライアンスやセキュリティ会社は,サンドボックスに大きく依存している.

仮想化

分析の規模を拡大するために、ほとんどのサンドボックスは,何らかの形の仮想化に依存している.(ベアメタル型のサンドボックスは例外[30,31]) このためサンドボックスは,VMWare [15]やVirtualBox [10]やCPUエミュレータ[17,4]などのさまざまな仮想化技術に依存している.Cuckoo Sandbox [8]は人気のあるオープンソースサンドボックスである.しかし,多くのセキュリティ組織は商用のサンドボックスから選択するか,独自のソリューションを設計するなど,他のサンドボックスを運用している.仮想化は,多くの仮想マシンVM)を1つのシステムで並列に実行し,それぞれ1つのサンプルを解析できるという利点がある.さらに,仮想化ソフトウェアは,VMのスナップショットを取ることでVMの状態を元の状態に戻すことができる.スナップショットは、マルウェアが実行されるとシステムの状態をリセットするのに役立つ.そのためマルウェア実行の影響を受けない.

オペレーティングシステム

サンドボックスの実装に関係なく,一般的なサンドボックスは,MS Windowsなどの一般的なオペレーティングシステムでサンプルを実行する.Windowsベースのマルウェアが流行しているため,Windowsベースのサンドボックスに焦点を当てるが,本手法はAndroidベースの[37]またはLinuxベースの[39]サンドボックスにも適用できる.

マルウェア解析サービス

マルウェア解析サービス(以下、単に「サービス」)は,サンドボックスとは対照的にサンプルの提出を(例えば、ウェブインターフェースを介して)受け取り,提出されたサンプルを様々な方法で解析し,解析結果をユーザに提供する.これらのサービスは通常,サンプルを分析するために1つまたは複数のサンドボックスを使用する.さらに、VirusTotal [14]やJottiのマルウェアスキャン[28]などのサービスは、アンチウイルススキャンを提供する.また,サービスが他のサンドボックスとサンプルを共有することは一般的である.実際、一部のサービスでは,サンプルのハッシュ値アンチウイルスラベルなどのさまざまなキーワードを使用して他のユーザーの提出物を検索することや,有料のAPIを使用して検索とダウンロードを自動化することができる.表2は、各サービスが提供する分析結果をまとめたものである.サンプルの提出を受け入れるが、分析結果をユーザーに提供しない9つのサービスがある.ベンダーからのフィードバックに従って,提出されたサンプルは,インターネットアクセスなしの隔離された環境で手動で解析した.

表2: 論文から引用 論文から引用

マルウェアセキュリティアプライアンス

サンドボックスは、市販のマルウェアセキュリティアプライアンス(または単に以下のアプライアンス)の不可欠な部分となってる.アプライアンスは,未知のプログラムを動的に解析し,疑わしい動作の動作を検査することによってエンドポイントを保護する.アプライアンスは,しばしばネットワーク層で展開され,悪意のある電子メールの添付ファイルや悪意のあるファイルのダウンロードをエンドポイントから保護するなどウイルス対策に使用される.アプライアンスは内部的はサンドボックス技術を使用してプログラムの動作を解析する.

3. サンドボックスのフィンガープリンティング

このセクションでは,インターネットに接続されたサンドボックスの状況を調査するために,サンドボックスを掘り下げます.フィンガープリントは個々のサンドボックスに特有のアーティファクトを示す.3.1節ではサンドボックスの特定の特性を明らかにする属性(24個の機能)について説明する.次に、サンドボックスから特性を抽出するツールであるSandPrintを紹介する. 3.2節では,このツールを使用して20の一般的なマルウェア分析サービスに送信してフィンガープリントを収集し,取得したデータセットについて説明する.

3.1サンドボックスフィンガープリントの特徴

個々のサンドボックスの特性を記述するために,サンドボックスを区別するために使用するフィンガープリンティング機能を紹介する.表1に示すように、24の機能のリスト(非網羅的)を提案する.これらの特性を次の5つのカテゴリに分類する.

1. インストールされたシステム

サンドボックスでは,サンプルを実行するためにオペレーティングシステム(OS)が必要である.通常,マニュアル操作を最小限に抑えるために,サンドボックスオペレータはOSを一度インストールして設定後,システムのスナップショットを作成する.サンドボックス(例えばVM)のすべての並列インスタンスが同じシステムスナップショットを使用すると仮定すると,これは実行の中に多くの特徴をもたらす.

2. ハードウェア

エミュレートされているかどうかにかかわらず,基本となるハードウェアはサンドボックスの固有の特性を明らかにすることができる. すべての特徴はハードウェアがエミュレートされているか、実際に物理的に存在しているかには依存しない.

3. ネットワーク構成

サンドボックスは、典型的には、サンプルがインターネット(例えば、C&Cサーバ)と通信できるように構成されている.つまり,ネットワークの特徴とローカルの設定を収集することができる.

4.アクティビティ

システムスナップショットは,過去に(すなわち、インストール時に)発生した特定のイベントを明らかにする. 一般に,これらの特徴はシステムがデフォルト設定に近いかどうかを測定できる.

5. 実行開始

新しく感染していないサンドボックスが開始されると,アナリストが解析したいサンプルを配置する必要がある. このプロセスを自動化する方法は複数存在する.

このリストは、他の特徴でも簡単に拡張できる.我々は,潜在的に高いエントロピーを示し,特定のサンドボックスに特化した特徴を優先させる.選択された特徴のほとんどは決定論的であり,その値は離散的で信頼性がある.ステルス・サンドボックスは,特徴の値を多様化しようとする可能性があることに注意する必要がある.

3.2 SandPrintによるサンドボックスのフィンガープリントの抽出

上記のすべての特徴をシステムから抽出するためのツールSandPrintを実装した.SandPrintは、Cで書かれたWindows 32ビットPEバイナリであり,Windows APIとカスタム関数を使用してその特徴を明らかにする.Sand-Printが実行されると、HTTPを使用してSandPrintサーバーと通信する.各SandPrintサンプルに一意の識別子が割り当てられ,HTTPセッションが確立されるとHTTP POST要求に埋め込まれたこのIDがサーバーに送信される.IDが送信された後,要求を検出するためにチャレンジ・レスポンス認証が行われる.この最初のハンドシェイクの後,,SandPrintはシステムの特徴の収集を開始します.特徴抽出の実装にはsysteminfo,netstat,ipconfigなどのコマンドを使用していない.これらは,しばしばシステムの機能を収集するために使用されるので,実際にはいくつかのサンドボックスが制限していると考えている.さらに(例えば、遅いディスクI / Oのために)個々の特徴を収集することによって生じる潜在的デッドロックを回避するため,特徴収集関数を複数のスレッドに渡って分散させた.加えて実行時間全体を見積もるために,ハートビートスレッドが,SandPrintが実行中であることをサーバに定期的に通知する.各スレッドは,特徴収集処理が完了した後にサーバに特徴を送信する.すべてのSandPrintはHTTPプロトコルを模倣しているため,Webサーバーと通信しているように見える.

我々は20種類のマルウェア解析サービスにSandPrintを提出し,フィンガープリントを収集した.表2にパブリックサービスをまとめた.これには,一般的な学術的サービスと非学術的サービスを含んでいる. 2016年1月5日から2016年1月18日まで,SandPrintを定期的に提出した.

各サービスについて,どこのファイルがどこにアップロードされたかをマップできるように,独自のSandPrintインスタンスを作成した.つまりセマンティクス機能は変更されていないが,その結果のハッシュは区別できる.さらに,実行時に計算される一意の識別子をサーバに報告し,そのサービスが生成する公開分析レポートと対応付ける.分析レポートの対応する識別子と後で一致させることで,レポートが特定のサービスによって生成されたことがわかる.合計で,440回の提出のちの221回から2666個の SandPrintレポートを収集した.平均して1提出ごとに6件のレポートが作成できた.レポートは33カ国を含む395のIPアドレスから送信された.後で説明するように、これは、(i)同じサンプルを複数回(同じサンドボックスまたはわずかに異なるサンドボックスで)再実行し、(ii)サンドボックス/サービス全体でサンプルを共有する傾向が強いことを示している.この観察をより詳細に研究し,さらなる分析のために同様のSandPrintレポートをグループ化する.

4サンドボックスクラスタリング

フィンガープリントの収集は2500以上のレポートから行った.しかし,本当に多くのサンドボックスが存在するのか?複数のレポートを返すサンドボックスがあるか?この質問に答えるために、このセクションでは,類似のレポートをグループ化し,どのレポートがどのサンドボックスによって送信されたかを識別するクラスタリング手法を紹介する.

4.1 クラスタリング

最初の観測では,レポートのリスト全体のサブセットが実際に同様の特性を共有していることが示されている.サンドボックスがすぐに複数のレポートを送信すると,2つのサンプルの実行全体に変わらない可能性が高い特徴が存在する.どちらのレポートにも同じ特徴が含まれているかどうかを確認することができる.しかし,実際には(意図的にでもそうでなくても)サンドボックスの特徴の一部が多様化することがわかった.我々は,同様のレポートをまとめるために教師なし学習技術を使用することを提案する.サンドボックスのラベルや根拠がないため、ここでは古典的な教師なし問題に直面している.集約的な階層的クラスタリングを使用してレポートをグループ化することを選択した.階層的クラスタリングは、カスタム距離関数を指定することができ,事前に予想されるクラスタの数を決定する必要がないという利点がある.距離関数は,2つのレポートがどのように異なるかを決定する.表1のすべての"クラスタリング"特徴(「チェックマーク」を参照)に対応する距離関数を定義する.すなわち,一対のレポートR1とR2について,すべての対の特徴の距離を合計し,平均距離を達成するために特徴の数で割る. 公式で表すとR1とR2との間の距離関数は以下のようになる.

distkは特定の特徴kの値の間の距離である.2つのレポート間で特徴を比較すると等価(EQ)が予想され,そうでない場合は最大相違点が仮定される.すなわち,両方のレポートにおいて特徴kが等しい場合にはdistk(R1; R2)はゼロであり,そうでない場合には1となる.個々のサンドボックスで変化することが観察された選択された特徴に対して,我々は平等になること期待しない・つまり,正規化編集距離(ED)を使用してホスト名を比較し,ユークリッド距離(EU)を展開してディスク名とサンプル名の長さを比較し,Jaccard距離(JD)を使用して最近開いたファイルを比較する.表1に,それに応じて分類した特徴比較方法を示す.すべての距離関数は,範囲[0; 1]を使用して,単一の特徴が偏りを生じさせないようにする. 場合によっては,比較対象のレポートに特徴が存在しない場合がある.この場合は,サンドボックスの解析時間が短すぎてすべての測定を完了できなかった場合など,SandPrintはいくつかの特徴を収集できなかった可能性がある.(たとえば,プログラムディレクトリ内のすべてのファイルを追跡するのに時間がかかる場合がある).疎な特徴に取り組むために,表1のチェックマークで示されているほとんどのレポートに含まれている特徴に焦点を当てる.レポートに残りのフィーチャの特徴がない場合は,2つの特徴が似ているかどうかを判断できない.この問題に対象するため,両方のレポートには存在しない特徴を無視し,それに応じてN(特徴の数)を減らし,平均を取ることで偏りを回避する. 次に,すべてのレポート間の距離を計算し,最も類似したものをグループ化し,凝集単一リンククラスタリングを使用する.このプロセスにより,樹状図(樹状図)が生成され,レポートがどれと一緒にクラスタ化されているかを表すことができる.クラスタリングの後,0.5未満の距離を有するグループをクラスタとみなす.このしきい値は,特徴の少なくとも半分が単一のサンドボックスのレポートで似ていると予想してつけた.

4.2 クラスタリングの結果と検証

クラスタリングは、2666のレポートを76クラスタに減らすのに役立った.これらのうち16個はシングルトンクラスタであり,データセットに1つのレポートのみを提供するサンドボックスである.最大のクラスタは233のレポートにまたがっており,カバレッジクラスタは44のレポートで構成される.シングルトンクラスタを除外すると35のレポートで構成される. クラスタリング出力を検証するために,私たちの研究チームを2つの別々のグループに分けた.1つのグループが独立して自動クラスタリングを設計し実行していた間に,もう1つのグループがクラスタリング出力を検証した.この目的のために,特定のサンドボックスに対して識別された独自の特性に基づいて,同様のサンドボックスを手動でグループ化した.このような優れた特徴ごとに,サンドボックスのすべてのレポートに一致する正規表現を定義した.エントロピーが偶然の衝突を回避するのに十分な大きさの特徴を選択し,サンドボックスごとに少なくとも2つの特徴を定義した. 次に、クラスタリングの結果を、検証グループによって行われた手動の「クラスタリング」の結果と比較した.手動による割り当ての結果は,クラスタ化の結果と同じだったが,自動のクラスタリングでは,手動でグループ化しなかった2つのサンドボックスがマージされていた.このケースでは,ユーザー名,ワーキンググループ名,およびホスト名は似ていたが,OSのインストール日は3年以上離れていた.それ以外は、それ以上の矛盾はなかったため,クラスタリング手法がSandPrintレポート(およびその特徴)を少数のサンドボックスに正確にマッピングできることを示していると言える.

4.3 サンドボックス vs サービス

表2は20のマルウェア解析サービスに対するSandPrintの提出の結果をまとめたものである.9つのサービスからのレポートはなかった.これは,これらのサービスによってデプロイされたサンドボックスにインターネット接続がないこと,または提出されたサンプルに対して動的解析を行わなかったことを意味する.SandPrintは,特徴を収集する前にまずサーバに報告するように実装されている.9つのサービスの初期接続も存在しないためレポートの欠如がフィンガープリントを避けようとしているからではないことが言える.データがないため,これらの9つのサービスを除外し,残りの11つのサービスに焦点を当てる.

4.4 マルウェア解析サービスとサンドボックスマッピング

次に,SandPrintレポートをマルウェア解析サービスにマップすることを目指す.サンドボックスをサービスにマッピングする方法は2つある. 1つ目は,サービスによって返された分析レポート(すなわちSandPrintではなくサービスによって提供されるもの)を調査する.これらのレポートには,提出されたサンプルの挙動が含まれる.そして,それぞれのSandPrintサブミッションに一意の識別子をエンコードした.これが解析レポートに表示される.サービス#2、#11、#13、#20の解析レポートでは,この識別子が見つかった. 2つ目に,残りのサービスをマップするため,サンプルを特定のサービスに提出したときに,一部のサンドボックスが排他的に使用されたかどうかを解析した.つまり,特定のサービスが利用するサンドボックスを特定する.図3(付録参照)は,11個のマルウェア分析サービス(y軸)に提出されたすべてのサンプルとレポートクラスタリング(x軸)に従って76個のサンドボックス間のマッピングを示している.いくつかのマッピングは,解析レポートによって確認することができた.一部のサンドボックスは同じサービスで頻繁に排他的に使用されていることがわかる.たとえば,Sandbox 69はService#11では常に使用され,他のサービスは使用されていない.そのような場合,サービス専用のサンドボックスだと結論づけることができる.合計で、11のサービスのうちの4つの専用サンドボックスを明らかにした. サービスにサンドボックスにマップした後,サービスに1つも属さない71個のサンドボックスが残った.これは図3にも示されているが,さまざまなサービスのサンプルを解析するために一般的に使用される多くのサンドボックスがリストされている.サンプルがサービス間で積極的に共有されることを強調する.

4.5 実証的サンドボックス分析

まず,システムのインストール時の特徴を調べた.これらのサンドボックスでOSが特定できた71個のサンドボックスのうち37個がWindows XPで,29のサンドボックスWindows 7であった.他の5つのサンドボックスWindows 8を実行する.インストール日は,サンドボックスの年齢に近似できる.インストール日が偽装されていないと仮定すると,取得されたOSのインストール日はすべて2008年から2016年の間であった.また,サンドボックスの半分以上が少なくとも3歳以上である.2014年に10のサンドボックスがインストールされていた.2015年または2016年にはすでに18のサンドボックスがインストールされていた.41のサンドボックスWindowsプロダクトIDは静的であり,18のサンドボックスはこの値を変更する.マルウェアWindows製品IDをサンドボックス識別の特徴として使用することが確認されているため,これは多様な目的に役立つ. サンドボックスのホスト名と所有者名の分布は,多様化しているか,完全に静的か2つの極端なケースに分類される.これは,サンドボックス開発者のが偽造されないようにする対策を講じるからだと推測する.ほとんどのホスト名と所有者名を多様化するサンドボックスのランダム化された名前は,一般的なプレフィックスや文字列の固定長などの共通パターンを示す. 場合によっては,サンドボックスの実装を推論することもできる.Cuckoo Sandboxには,サンプルの解析時に動作していなければならないagent.pyという特定のファイルが含まれる.最近の実行したファイルリストにagent.pyが含まれているかどうかを確認することで,Cuckoo Sandboxがインストールされ実行されているかを推測できる.サンドボックスが同じテクノロジを使用していても一緒にクラスタ化されていないことに注意する必要がある.これは主に,Cuckooなどの共通のフレームワークを使用しているかどうかにかかわらず,サンドボックスオペレータが独自のVMイメージを設定する必要があるためである.サンドボックスの中には同じ仮想化テクノロジを使用するものもありますが,これらのサンドボックスはインストール機能(OSのインストール日や製品IDなど)に基づいて区別される. 次に,サンドボックスで使用されているインターネットアップリンクを調べた.64のサンドボックスは,GeoIPに従う単一の国の外部IPアドレスを使用する.その中で1位は米国で22のサンドボックス,ドイツが6つのサンドボックスで2位,中国は5つのサンドボックスで3位,アイルランドは4つのサンドボックスで4位となった.スウェーデン,ロシア,韓国には3つのサンドボックスルーマニア,日本,イギリスには2つのサンドボックスがある.私たちは,外部IPアドレスの多様性が高く地理的位置を特定できない2つのサンドボックスが存在することに気付いた.これらのサンドボックスはTorを使用してIPアドレスを多様化している.また,29のサンドボックスでは固定IPアドレスが1つしか使用されていないため,サーバ側からの検出が容易である.たとえば,マルウェアサンプルがC&Cサーバーにコマンドを送信した場合,IPアドレスはそのサーバ上のブラックリストと照合され,そのサーバーは実行を停止するようにクライアントに指示できる. MACアドレスは,収集したすべての特徴の中で最高の多様性を示す.複数のSandPrintレポートで考慮されるように,単一の固定MACアドレスを使用するのは12のサンドボックスだけであった.大部分のMACアドレスは、少なくとも部分的に多様化されている(例えば、最初の3オクテット,すなわちベンダーIDは,しばしば固定されるが,残りは多様化される). これは,サンドボックスが複数のVMを並列に実行し,同じVMイメージを共有しているが,すべてが一意のMACアドレスを持ち,イーサネットレイヤ上での衝突を避けるためであると考えられる.ベンダーのプレフィックスを隠していないサンドボックスのうち,6つのVMwareベース(pre x:00-50-56)および21のVirtualBoxベース(pre x:08-00-27)のサンドボックスであることが明らかになった.

5. サンドボックス分類

フィンガープリントを使用して,特定のレポートが同じサンドボックスに属することを発見することができた.ここで,抽出した特徴を利用して,システムがサンドボックスであるかどうかを判断できるかどうかを検討する.直観的に,ハードウェアの制約、スナップショットベースの操作,ユーザーの操作不足からサンドボックス固有の特徴を探索する.これらの固有の特徴を使用して,教師あり機械学習技術を使用してサンドボックスを検出する方法を示す.まず,SVMSupport Vector Machine)[21]を使用したサンドボックスの分類と評価について述べる.

5.1 特徴選択

特徴選択の背後にある重要なアイデアは,人間の制御下にあるマシンではほとんど起こらないサンドボックス操作に特徴的なパターンを探すことである.特定のサンドボックスの特定のフィンガープリントを特定するのではなく,すべてのサンドボックスに共通のサンドボックス固有の機能を探す.

特徴選択プロセス

特徴選択のために,サンドボックスとしては使用されておらず,人間の管理下にある50の汎用WindowsワークステーションでSandPrintを実行する,次に,レポートを手動で調べ,サンドボックスレポートで確認した固有の意味のあるパターンを調査したが,ユーザーレポートではそれほど特徴が存在しなかった.表3はに,ハードウェア,履歴,実行の3つのカテゴリに分けて選択した特徴をまとめる.

2番目の列は特徴名,3番目はサンドボックスレポートからの観測値,最後の列は特徴値をSVMに渡す前に特徴値を整数に変換する方法を示している(5.2節で述べる). 従来の方法では,4:3の表示解像度といった具体的なサンドボックスシグネチャ値でレポートを検索していた.しかし,具体的な値を選択する際にはいくつかの問題がある.具体的な特徴値は必ず正確ではない.このため,このタスクをSVMクラスのトレーニングプロセスに任せる. 同様に,仮想化技術の検出も控え,サンドボックス固有の特徴に焦点を当てう.仮想化はサンドボックスの存在を示唆するが,保証でもない. たとえば,VMWare仮想マシンを示す1つのユーザーレポートが見つかった場合,このマシンをサンドボックスではなくユーザマシンとして分類する必要がある.逆に,サンドボックスたとえば,ベアメタルのサンドボックスの場合など,必ずしも仮想化を使用するとは限らない.私たちのクラスは,サンドボックスがスナップショットを使用し,リソースが制限されていて,ユーザーとのやり取りが乏しいという観察に基づいているため,仮想化が存在に依存せずシステムをサンドボックスとして分類できる.

特徴説明

これらの特徴について,より詳細に説明する.

  • ハードウェア特徴

    • CPUコア数
    • RAM容量
    • PS/2マウスの有無
    • ディスプレイ解像度

    サンドボックスオペレーターが並列化を活用するためにリソースを制限するという事実に基づく.したがって、サンドボックスはシングルコアであり,RAMをほとんど使用せず,ディスクのサイズが小さいのが一般的である.しかし平均的なユーザーPCではこれらの量がはるかに大きい.第2に,サンドボックスは通常人間によってインタラクティブに使用されないため,オペレータはしばしばハードウェア構成をカスタマイズしない.PS/2マウスや小さなディスプレイサイズ,珍しいディスプレイ解像度は,すべてサンドボックスの指標として利用できる.サンドボックスのこれらの構成は通常はデフォルトと同様である.ユーザは自分のVMを対話的に使用し,画面の解像度をカスタマイズし,より多くのコアとRAMを使用して計算能力を向上させる可能性が高い.

  • 履歴特徴

    • ログイン履歴
    • IEのアクセス履歴
    • システムの稼働時間

    サンドボックスがスナップショットテクノロジを活用するという観点に基づく.マルウェアサンプルを分析する前に,サンドボックスはシステム状態を以前にキャプチャされたクリーン状態(スナップショットと呼ばれる)に復元する.スナップショットは,通常サンドボックスの設定時に一度取得され,サンドボックスで使用される(更新されない限り).よって,履歴アーチファクトを示す可能性が高い.たとえば,スナップショットが数か月前に取得された場合,スナップショットが復元されるたびに,ログイン履歴によって最後のログインがその時点であったことがわかる.同様にIEのアクセス履歴も用いることができる.さらに,多くのサンドボックスがユーザーPCは通常より長い稼働時間を持つ.サンドボックスのレポートでは,システムの稼働時間が数秒で表示されることがよくあるが,アップタイムが大きいと感染している脆弱なシステム(たとえば、ドライブバイダウンロードによる)の可能性はかなり高くなる.

  • 実行特徴

    まれな実行パターンを示すサンドボックスが存在することに基づく.たとえば,サンドボックスはイメージの実行ファイル名を自動化の観点から扱いやすいものに変更する傾向があることがある.サンドボックスではMD5ハッシュやvirus.exeなどの総称名を使用するのが一般的であるが,ユーザーの報告によるとそのような名前変更は起こりにくい.また,サンドボックスクリップボードは空であるかランダムではない文字列が含まれていましたが,ユーザーのクリップボードはリンク,テキスト,またはオブジェクトなどの意味のある値を含む傾向がある. 最後に,サンドボックスはシステム製造元の値をユーザレポートでは確認できなかった空の文字列やランダムな文字列など,実際の名前を隠す可能性がある.

5.2 分類

前述の特徴を使用して,未知の特徴レポートがサンドボックスまたはユーザーPCのものかをどうかを予測するためのモデルを自動的に学習できる分類器を訓練する.このために,50のユーザーレポートすべてと,各サンドボックスクラスタからの選択した3つのランダムサンプルで構成されるトレーニングデータセットを構築した.合計で,202レポートのトレーニングセットを提供する.そのうちの50レポートはユーザーレポートで,152レポートはサンドボックスレポートである. 分類器を構築するために,ラジアル基底関数カーネルを持つSVMを使用する.SVMに渡す特徴ベクトルを正規化するには,特徴値を数値に変換する必要がある.この方法は表3の最後の列に示す.idは単純に数値を取ることを意味し,lenは特徴文字列の長さを考慮することを意味し,[0,1]はブール値である(PS / 2マウスがあるかないか).同様に、イメージ名の特徴については,イメージ名が変更されているかどうかをチェックする.4章で説明した理由により,すべての特徴がすべてのレポートで使用できるわけではないため,欠損値を推定するために平均代用を使用することにした.最後に値を[0; 1]の範囲で最小 - 最小スケーリングして使用する. クラスを構築するには,SVM正規化定数Cとカーネルパラメータの有効な組み合わせを指定する必要がある.この目的のために,グリッド検索と10-fold cross validationによるハイパーパラメータチューニングを使用して,クラスの精度を計算する.最初のステップでは,個々の特徴の強さを評価するために,個々の特徴ごとにクラスを作成した.この実験の結果は図1に示す.単一の特徴であっても,トップのRAM特徴で98:06%の精度でサンドボックスを検出することができた.

ただし,1つの特徴は,複数の特徴よりもサンドボックスオペレーターが簡単に修正できる. 我々はまた、すべての機能を訓練するクラスを作成しました。 図1の右端のグラフは,この分類器が100%の完全精度(偽陽性0および偽陰性0)を有し,複数の検出特徴を組み合わせる強度を示している.

5.3 既存のソリューションとの比較

私たちの分類器の評価ために,提案手法と既存の研究と比較する. 評価のためにマルウェアによって使用されているよく知られたサンドボックス検出技術のコレクションからなる人気のあるフレームワークParanoid Fish(Pafish)を使用した. PafishがSandPrintで使用した45の検出手法をエンコードし,実行した.これらの45件の検出結果を使用し,以前と同じ方法で分類器を構築した.各検出結果は1つのクラスを構築するための特徴であると考えており,45種類のすべての機能を組み合わせたクラスも作成した.これらの分類器の精度結果を図2に示す.明るい色の各グラフは単一の特徴の精度を示し,黒いバーはすべての特徴を組み合わせた分類器の精度を示す.単一の特徴の精度は推測より良くない.2つの機能は80%以上の精度を持ち,最も優れた単一特徴(仮想化を検出するためのrdtsc時間測定[18])は93%の精度である.組み合わせたバージョンの精度は97.8%であった.

より良い精度を持つことに加えて,提案手法がPafishよりも2つの理由で優れている.一つ目は,Pafishが主に仮想化の成果物をチェックしている点である.これは前述の理由から控えるべきである.2つ目は,Pafishのチェックの大半は,レジストリネットワークアダプタなどの情報である.こらはサンドボックスによって監視される可能性が高い.このため,Pafishはマルウェアとして検出される危険性がある.対照的に提案手法で用いる情報の抽出はよりステルスである.

5.4 まとめ

これまでに述べたように、サンドボックス固有の機能に基づいて,サンドボックスとユーザーマシンを確実に区別することができる. フィーチャの数は非常に少ないように見えるが,これらの特徴を非表示にすると,サンドボックスオペレーターに多くの苦労がある.画面サイズを変更し,USBエミュレートされたマウスに切り替えることは可能ですが,並列計算アーティファクトを取り除くことは簡単ではない.コアの数とメモリの量を増やすことは,サンドボックスの生産性を低下させるので,オペレータの選択肢ではない可能性がある.これはサンドボックスに多くのリソースを与えることで解決できる.同様に,スナップショットによって導入された履歴アーティファクトを回避するのにも苦労する.サンドボックスオペレータは、システム上のすべての関連する履歴情報が正常であるかどうかを確認できる.解決策は,サンドボックススナップショットをカスタマイズし,非サンドボックスシステムのように最新の状態に保つことである.残念ながらこれカスタマイズは労力が多く,エラーが発生しやすくなり,解析中のすべてのオペレーティングシステムを再実装する必要がある.サンドボックスオペレータが適用できる他の対策については,7.1節で述べる.そこでは,この側面と作業の倫理的な議論を組み合わせて議論する.

6. マルウェアアプライアンスの検出

アプライアンスは,マルウェアの完全な動作を分析するのではなく,機密性の高いインフラストラクチャをサイバー攻撃から保護するためにマルウェアを検出することが主な目的であるという点でサンドボックスとは異なります.高度な攻撃者は,アプライアンスを検出する技術に興味を持つかもしれない.攻撃者がアプライアンスを検出できた場合,アプライアンス内のアラートをトリガーしないように,プログラムの悪意ある動作を隠すことができる.5章の特徴選択を見ると,アプライアンスサンドボックスと同じ特徴特性を持っている可能性があることがわかる.これを検証するため,我々は有名なベンダーの人気のある3つのアプライアンスでSandPrintを実行した(個々のアプライアンスの弱点を突き止めないようにベンダー名を省略).この目的のために、アプライアンスのさまざまなインスタンスWindows 7Windows XP,32/64ビット,さまざまなサービスパックなど)に導入した.各インスタンスでSandPrintを4回実行し,40のレポートを収集した.アプライアンスはネットワーク通信を許可していないため,公開されているサンドボックスと同様に,特徴を取得するのは簡単ではなかった.この問題を解決するため,SandPrintを実行後,アプライアンスが作成した解析レポートに抽出された特徴をエンコードした.特徴レポートを手動で調べると,特徴の特性に関する仮定が正しいことがわかった.サンドボックスと同様に、アプライアンスは全ての特徴を持つ.いくつかの特徴はサンドボックスの場合よりもさらに強力であった.たとえば、すべての40のレポートには,画面幅が小さく,画面解像度が4:3であった. 次に,アプライアンスごとにサンドボックスおよびユーザーレポートでトレーニングした分類器がアプライアンスレポートをどれくらい正確に判定できるかを測定した.100%の精度で,分類器はすべてのアプライアンスを非ユーザーマシンとして検出した.しかし,重要なのは検出方法を隠蔽することである.アプライアンスが作成したレポートを確認すると,SandPrintがマザーボード情報,BIOS情報,シリアル番号などの情報を読み取ることで,多くのセキュリティ警告を作成していることがわかった.次に,Sandprintに使用された特徴がアラートのリストにも含まれているかどうかを確認した.Pafishがチェックがする多くの項目は,アプライアンスによって検出された.大部分のサンドボックス固有の特徴はアプライアンスのアラートにならなかったが,あるアプライアンスではディスク情報の読み取りを疑わしい動作とみなされた.これに対処するために,特徴ベクトルからディスク特徴を除去し,アプライアンスのレポートでクラスを再度評価し,ステルス回避について考慮した上で精度100%にした. 要約すると,攻撃者は公開されているサンドボックスの特性を明らかにし,収集した情報を使用して,ユーザーのPCとアプライアンスを完全に区別できるクラスを構築できる.セキュリティアプライアンスについての知識があれば,攻撃者は微調整することで,アプライアンスで検出されないようにすることができる.

7. 議論と制限

私たちの研究の倫理的側面と潜在的な限界について述べる.

7.1 倫理的な考慮事項

省略

7.2 責任ある開示

省略

7.3 独立したサンドボックス

ほとんどのサンドボックスは解析中のプログラムをインターネット上で通信することができましたが,9つのサービスと3つのアプライアンスは通信することができなかった.解析レポートのイベントに特徴をエンコードすることで分離されたサンドボックスアプライアンス)の特徴をある程度抽出することができる.ただし,これには分離されたサンドボックスにアクセスする必要があるため,攻撃者にとって特徴を入手しにくい可能性がある.提案するサンドボックス分類はネットワーク構成に依存する特徴を使用しなかったことに注意する必要がある.原則として,分類結果は非接続サンドボックスにも一般化する必要がある.提案する分類器では不十分な非接続のサンドボックスがある可能性を除外することはできないが,アプライアンスの検出に成功している.インターネットに接続されたサンドボックスが想定されているため実際のサンドボックスの数は,クラスタリング結果の示唆よりも高くなる可能性がある.しかし,分析は最も一般的な解析サービスサービス,統計的に重要なサンドボックスを対象に行っている.

8. 関連研究

省略

9. おわりに

現実のマルウェアサンドボックスの調査において,マルウェアサンドボックスであるかを把握することは非常に簡単である.調査用のバイナリを20のサービスにアップロードすることで,76のサンドボックスを識別しました.これらのサービスは,サンドボックス固有の特性に基づいて検出され回避された.マルウェアアプライアンスの検出と回避が同様に可能であることを示唆した.これは,今後のサンドボックス回避の脅威から,どのように保護することができるのかという疑問を呼び起こした.また,サンドボックスオペレータがマルウェアによって悪用されている可能性のある脅威について知らせるためのヘッドアップとして役立つ.

エンジニアが友利奈緒になるべき10の理由

本記事は「友利奈緒 Advent Calendar 2016」の1日目の記事です.

www.adventar.org

某日に発表したエンジニアが友利奈緒になるべき10の理由です.
さあみんなで友利奈緒になろうぜ!

www.slideshare.net

エクストリームCTFはつらい(Open xINTのWriteup?)

CTF

AVTOKYO内で開催されているOpen xINTに参加した。 初エクストリームCTFだったのでその記録。

Challenge1

ハッカーが運営しているWebサイトは、http://pinja.xyz だ。
そこからハッカーのメールアドレスを探し、入力せよ。

whoisしたらメールアドレスがあった。

Challenge2

ハッカーはFacebookのアカウントを持っているようだ。
そのアカウントのアドレスを入手し、入力せよ。
アドレスは https:// を含む形で入力すること。

Challenge1のメールアドレスをFacebookで検索したらでた.

Challenge3

ハッカーのFacebookを見ていると、食事の写真が投稿されている。どうやら誰かと食事をしているようだ。その人物から何か情報を引き出せるかもしれない。
まずは、その写真の飲食店を特定し、飲食店の座標を「Nxx xx xx:Exxx xx xx」の形式で入力せよ。
例. N35°41′35″E135°0′11″の場合、回答は「N35 41 35 E135 0 11」

これは、ExifとかstringsとかCTFっぽいことしてみたけどだめ・・・ わからんかったので諦め・・・

解法はこちら

Challenge4

どうやらハッカーと一緒に食事をしている人物は、私たちと同じくハッカーを調査しているようだ。その人物のFacebookアカウントを探し、アドレスを入手し、入力せよ。
アドレスは https:// を含む形で入力せよ。

共通の友達がどんどん増えてるアカウントがあったからそれを解答した. 申請送るのはやはりスパイとしてだめか・・・

Challenge5

Facebookに投稿された情報から推測される人物に接触し、うまく信用させて情報を引き出せ。
その情報を入力せよ。

Challenge4の人物と接触する必要がある。 プロフィール写真と"背中で語る"とあったのでそれっぽいシャツを着ている人を探す必要がある。 "同じくハッカーを調査しているようだ"とあったのでメッセージで協力を要請してみたが既読無視辛い。 メタを読んで中の人が頼みそうな人でそれっぽいシャツを着てた相戸さんに声をかけた。 どうやら一人っぽい

こんな紙をもらった

よく考えると高嶺ってことで一人に絞れたな・・・

Challenge6

もらった情報から推測される「モノ」を回収して調査、得られる適切な情報を入力せよ。

ここから地獄・・・ ターゲットの投稿を見ると

代々木公園駅つきました。

途中で、資料の入ったメモリを落としたらしい。

MAMORIOつけているから大丈夫かな。

ここでまたメタると,エクストリームCTFか・・・
AVTOKYO中に会場の外行かせるってまじかーーー

とりあえずMAMORIOをインストールして,代々木公園駅へ行く。
この時点で17:30くらい・・・MAMORIOの仕様がわからなかったり、駅から会場までの道のどちら側にあるかわからずに苦戦。

行きと逆の方向でMAMORIOに反応があった! きたーーーーーーーーーーーーーーーってなったものの周りにそれらしきものはなかった。

一時間経過したころ。 Facebookに新しい投稿があった・

こういうときは専用アプリで見つけられると思う。駅から会場までの間に落としたのかも。ずっと右側通行できたから、帰りに見つけられるかな。

おせえよ・・・反応あったけどみつからないよ・・・どんな形のものとこか、色とか教えてくれ・・・

とりあえず私有地はありえんだろうということで草をかき分け、空き缶を拾い、ピーポくんのストラップを拾い、電話ボックスの中に入り、捨ててあるゴミ袋を開いたり・・・完全に不審者。

結局見つからずもうすぐAVTOKYOも終わるということで帰った・・・

MAMORIOには反応があったのにな・・・

Challenge7

モノ」を調査した結果、闇サイト運営者のハッカーの正体が分かる。早速その「モノ」に罠ファイル(リンク貼る)を仕掛けろ。その後、ハッカーに接触して、不審に思われないよう「モノ」を渡せ。
その人物から渡された「ご褒美ワード」を入力せよ。

ダメ

結果

5位だった・・・お部屋にいて講演聞いている人に負けた。 いろいろ探し回ってる間に抜かれてた・・・ つらいな・・・

あと@luminさんと回収に行ったら探してたとこにあった。 まじか・・・ USBメモリがそのまま置いてあったので、暗かったし見つけれなかったんだろうか・・・ 辛い。

いつもみたいにミンティアに入ってるだろーって予想して細かく見れてなかったのが敗因かもしれない。

エクストリームCTFはつらい。

SECCON2016 大阪大会参加してきた・・・(だめ)

CTF

SECCON2016 大阪大会に参加してきた。
集まれバイナリアンとか書いてあって不安だった。

結果はたぶん8位
自分は全然だめだった・・・
自動化まで完成させて点を取ってくれたチームメイトに感謝。

しかし面白い形式のCTFだったので楽しめた。
せっかくなのでもっと解ければよかった。

以下問題と反省

(追記) チームメイトの記事

SECCON2016 大阪大会(アツマレバイナリアン)ひとり反省会 - ヾノ*>ㅅ<)ノシ帳

問題

問題数は多いが形式は4つ。

とりあえずバックドアを探す簡単なやつをみた。 バイナリを読むと特定のバイナリ列をある値で一文字ずつxorしてその値と一致するればsecretを読み込んで出力していることがわかった。 このロジックはバイナリが変更されても変わらず、バイナリ列とxorのキーが変更されるだけだった。

angrで書くとこんな感じ f:id:pinksawtooth:20161002220814p:plain こいつの出力をbase64してバイナリに渡すとフラグが出る。

ほんとうは競技中angr使えてません・・・手動でやった。

(追記) せっかくだからangrに必要なアドレスの取得まで自動化までしてみようということで書いたスクリプトと簡単な説明。

サーバとの接続,バイナリのダウンロードは岩村さんがサンプルとしてくれてたのでそれを利用する。

いくつかのバイナリを解析するとこんな感じのフラグ出力の前後で命令列が共通していることがわかる。

  40015b:       75 ed                   jne    0x40014a
  40015d:       e8 1e 00 00 00          call   0x400180
  400162:       6a 00                   push   0x0
  400164:       e8 b8 00 00 00          call   0x400221

call 0x400180ではsecretをopen,read,writeしている 。 小さいバイナリなのでpush 0x0の"6a 00"で該当箇所を絞り、さらにjneの直後で現れるという条件を足すとangrに必要なアドレスを求めることができた。 テストケースは手元にあった10個くらいなのでほんとうに全部いけるかわからない。

import commands, angr, base64


bin_file = "bin_213a7d9cd94ce0a17e8a821875f3046f.elf"
cmd = "objdump -d  -Mintel %s | grep -B 2  -A 1 '6a 00' | grep 'jne' -A 1 | awk 'NR==2' | awk -F: '{print $1}'" % bin_file
#print cmd

def main():
    str = commands.getoutput(cmd)
    addr = str.strip()
    #print addr
    p = angr.Project(bin_file, load_options={'auto_load_libs': False})
    ex = p.surveyors.Explorer(find=(int(addr,16)))
    ex.run()

    return ex.found[0].state.posix.dumps(0).strip('\0\n')

if __name__ == '__main__':
    print base64.b64encode(main())

反省

”実行ファイルを解析するのはもう普通!これからの時代は、いかに速く解析できるかだ!!” とHPにあったとおり,今回の競技はいかにはやく自動化するかが勝負を分けた。

手動解析でロジックを特定したが,自動化に手間取ってしまったため出遅れたかなと思う。 とくに自分自身をインポートするという頭付いてないことしてて競技中に動かなかった・・・ひどいミスをしてangrを使えなかったのが無限につらい・・・

WinDbgでシステムコールをフックして引数を確認する

今回はWinDbgシステムコールをフックして,システムコール呼び出し時の引数を確認する.

環境構築は前のブログを参照.

pinksawtooth.hatenablog.com

まずはNtCreateUserProcessのアドレスの確認する.

u nt!NtCreateUserProcess:
fffff803`d04cce1c 4c8bdc          mov     r11,rsp
fffff803`d04cce1f 53              push    rbx
fffff803`d04cce20 56              push    rsi
fffff803`d04cce21 57              push    rdi
fffff803`d04cce22 4154            push    r12
fffff803`d04cce24 4155            push    r13
fffff803`d04cce26 4156            push    r14
fffff803`d04cce28 4157            push    r15

ブレークポイントを設定する.

bp fffff803`d04cce1c

再開して,プロセスを実行する. 今回はcmd.exeからnotepad.exeを起動した.

kd> g
Breakpoint 0 hit
nt!NtCreateUserProcess:
fffff803`d04cce1c 4c8bdc          mov     r11,rsp

スタックトレースを確認する. cmdからCreateProcessWが呼ばれて最終的にNtCreateUserProcessに到達したことがわかる.

kkd> kb
 # RetAddr           : Args to Child                                                           : Call Site
00 fffff802`139e2263 : fffff6fb`5fff2c80 fffff6bf`fe590250 fffff920`7bec5a65 00000000`00000000 : nt!NtCreateUserProcess
01 00007ffc`b20840ea : 00007ffc`af4473ab 00000000`00000008 000000c1`4807e5a0 00000000`00000001 : nt!KiSystemServiceCopyEnd+0x13
02 00007ffc`af4473ab : 00000000`00000008 000000c1`4807e5a0 00000000`00000001 00000000`00000000 : ntdll!NtCreateUserProcess+0xa
03 00007ffc`af484c06 : 00000000`00000012 00000000`00000020 000000c1`480c0318 000000c1`4807ede8 : KERNELBASE!CreateProcessInternalW+0xc5b
04 00007ffc`b1e8df33 : 00000000`00000000 00007ff6`665f80e8 000000c1`480cd2ee 00007ff6`00000003 : KERNELBASE!CreateProcessW+0x66
*** ERROR: Module load completed but symbols could not be loaded for cmd.exe
05 00007ff6`665d630c : 00000000`00000001 000000c1`4807f870 000000c1`480ca860 00000002`fffffa56 : KERNEL32!CreateProcessWStub+0x53
06 00000000`00000001 : 000000c1`4807f870 000000c1`480ca860 00000002`fffffa56 00000000`00000001 : cmd+0x630c
07 000000c1`4807f870 : 000000c1`480ca860 00000002`fffffa56 00000000`00000001 00000000`00080000 : 0x1
08 000000c1`480ca860 : 00000002`fffffa56 00000000`00000001 00000000`00080000 00000000`00000000 : 0x000000c1`4807f870
09 00000002`fffffa56 : 00000000`00000001 00000000`00080000 00000000`00000000 00007ff6`66610920 : 0x000000c1`480ca860
0a 00000000`00000001 : 00000000`00080000 00000000`00000000 00007ff6`66610920 000000c1`4807eed0 : 0x00000002`fffffa56
0b 00000000`00080000 : 00000000`00000000 00007ff6`66610920 000000c1`4807eed0 000000c1`4807eeb8 : 0x1
0c 00000000`00000000 : 00007ff6`66610920 000000c1`4807eed0 000000c1`4807eeb8 000000c1`c80005cd : 0x80000

引数を確認するためにスタックとレジスタを表示する.

kd> r
rax=0000000002000000 rbx=0000000000000008 rcx=0000006582ede970
rdx=0000006582ede9d8 rsi=0000000000000001 rdi=0000000000000000
rip=00007ffafbe140e0 rsp=0000006582ede888 rbp=0000006582edfdf0
 r8=0000000002000000  r9=0000000002000000 r10=0000000000000200
r11=0000006582ede860 r12=0000000000000008 r13=00000065830c9230
r14=00000065830cda90 r15=0000000000000204
iopl=0         nv up ei pl nz na pe nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
ntdll!NtCreateUserProcess:
0033:00007ffa`fbe140e0 4c8bd1          mov     r10,rcx
kd> dq rsp
00000065`82ede888  00007ffa`f92973ab 00000000`00000008
00000065`82ede898  00000065`82edeb20 00000000`00000001
00000065`82ede8a8  00000000`00000000 00000000`00000000
00000065`82ede8b8  00000000`00000000 00000000`00000204
00000065`82ede8c8  00000065`00000001 00000065`830cda90
00000065`82ede8d8  00000065`82edebc0 00000065`82edee50
00000065`82ede8e8  00000000`00000000 00000065`82edec00
00000065`82ede8f8  00000000`00000000 00000000`00000000

x64呼び出し規約では,第1引数から第4引数まではRCX,RDX,R8,R9に格納される.第5引数以降はスタックに格納される. スタックには戻りアドレスの後,第1引数から第4引数のHome領域が確保される.このためrspから40バイト目以降が引数となる. (00000065`82ede8a8の2つめの値からが引数)

NtCreateUserProcessの引数は以下の様に定義されている.

NtCreateUserProcess(
    PHANDLE ProcessHandle,
    PHANDLE ThreadHandle,
    ACCESS_MASK ProcessDesiredAccess,
    ACCESS_MASK ThreadDesiredAccess,
    POBJECT_ATTRIBUTES ProcessObjectAttributes,
    POBJECT_ATTRIBUTES ThreadObjectAttributes,
    ULONG ProcessFlags,
    ULONG ThreadFlags,
    PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
    PPROCESS_CREATE_INFO CreateInfo,
    PPROCESS_ATTRIBUTE_LIST AttributeList
    );

つまり

1  PHANDLE ProcessHandle = rcx = 0000006582ede970 
2  PHANDLE ThreadHandle = rdx = 0000006582ede9d8
3  ACCESS_MASK ProcessDesiredAccess = r8  = 0000000002000000
4  ACCESS_MASK ThreadDesiredAccess = r9  = 0000000002000000
5  POBJECT_ATTRIBUTES ProcessObjectAttributes = 00000000`00000000
6  POBJECT_ATTRIBUTES ThreadObjectAttributes = 00000000`00000000
7  ULONG ProcessFlags = 00000204
8  ULONG ThreadFlags = 00000001
9  PRTL_USER_PROCESS_PARAMETERS ProcessParameters = 00000065`830cda90
10 PPROCESS_CREATE_INFO CreateInfo = 00000065`82edebc0
11 PPROCESS_ATTRIBUTE_LIST AttributeList = 00000065`82edee50

となる.

Pというプレフィックスがついているのはポインタとなっているため値を確認するためには,そのアドレスの値を見る必要がある.

PRTL_USER_PROCESS_PARAMETERS ProcessParameters の詳細を確認する. ProcessParametersはRTL_USER_PROCESS_PARAMETERS構造体へのポインタとなっている. RTL_USER_PROCESS_PARAMETERS構造体はWindows Vista以降で変更されている模様.

kd> dt _RTL_USER_PROCESS_PARAMETERS
ntdll!_RTL_USER_PROCESS_PARAMETERS
   +0x000 MaximumLength    : Uint4B
   +0x004 Length           : Uint4B
   +0x008 Flags            : Uint4B
   +0x00c DebugFlags       : Uint4B
   +0x010 ConsoleHandle    : Ptr64 Void
   +0x018 ConsoleFlags     : Uint4B
   +0x020 StandardInput    : Ptr64 Void
   +0x028 StandardOutput   : Ptr64 Void
   +0x030 StandardError    : Ptr64 Void
   +0x038 CurrentDirectory : _CURDIR
   +0x050 DllPath          : _UNICODE_STRING
   +0x060 ImagePathName    : _UNICODE_STRING
   +0x070 CommandLine      : _UNICODE_STRING
   +0x080 Environment      : Ptr64 Void
   +0x088 StartingX        : Uint4B
   +0x08c StartingY        : Uint4B
   +0x090 CountX           : Uint4B
   +0x094 CountY           : Uint4B
   +0x098 CountCharsX      : Uint4B
   +0x09c CountCharsY      : Uint4B
   +0x0a0 FillAttribute    : Uint4B
   +0x0a4 WindowFlags      : Uint4B
   +0x0a8 ShowWindowFlags  : Uint4B
   +0x0b0 WindowTitle      : _UNICODE_STRING
   +0x0c0 DesktopInfo      : _UNICODE_STRING
   +0x0d0 ShellInfo        : _UNICODE_STRING
   +0x0e0 RuntimeData      : _UNICODE_STRING
   +0x0f0 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
   +0x3f0 EnvironmentSize  : Uint8B
   +0x3f8 EnvironmentVersion : Uint8B
   +0x400 PackageDependencyData : Ptr64 Void
   +0x408 ProcessGroupId   : Uint4B
   +0x40c LoaderThreads    : Uint4B
   +0x060 ImagePathName    : _UNICODE_STRING
   +0x070 CommandLine      : _UNICODE_STRING

には実行されたプロセスのフルパスとコマンドライン引数が格納されている.

ImagePathNameの値を確認するため

00000065`830cda90+0x060

のメモリを見る. ImagepathNameは,UNICODE_STRING型となっている.UNICODE_STRING型は

kd> dt _UNICODE_STRING
ntdll!_UNICODE_STRING
   +0x000 Length           : Uint2B
   +0x002 MaximumLength    : Uint2B
   +0x008 Buffer           : Ptr64 Uint2B

と定義されている.

00000065`830cda90+0x060+0x008

のメモリ上にbufferのアドレスが格納されている.

バッファのアドレスにはフルパスの文字列が格納されている.

同様にコマンドライン引数も格納されている.

00000065`830cda90+0x070+0x008

Rekall 1.5.1

ぐぐっても古い情報?しかでなくて困ったのでメモ。

インストール

sudo pip install rekall
sudo apt-get install cabextract

使い方

rekallのバージョン

バージョンごとにオプションの指定の仕方が結構変わってる.

$ rekall --version
{u'full-revisionid': u'fbb28d93a67aa514ed4744e1d49edafc4eb5f8f7', u'dirty': False, u'version': u'1.5.1', u'error': None}

PEファイルのversionをチェック

$ rekall -f ntoskrnl.exe version_scan
  Offset (P)             GUID/Version                         PDB
-------------- --------------------------------- ------------------------------
0x0000002957e0 C68EE22FDCF6477895C54A862BE165671 ntkrnlmp.pdb

PDBをダウンロード

$ rekall fetch_pdb ntoskrnl.exe
Extracting cabinet: /tmp/tmpnrPvPW/ntkrnlmp.pd_
  extracting ntkrnlmp.pdb

All done, no errors.

PDBをパースしてJSON形式にする

$ rekal parse_pdb  ntkrnlmp.pdb > ntkrnlmp.json

Windows10 64bitのKiServiceTableとRVAの取得

WinDbgを使ってWindows10のKiServiceTableを確認するしたときのメモ。

環境

設定

VmWare Playerの設定

設定からシリアルポートの追加する. VmWare Playerでは,シリアルポート2が割り当てられる. f:id:pinksawtooth:20160614165634p:plain

f:id:pinksawtooth:20160614165625p:plain 仮想プリンタを環境設定で有効にする必要がありますと言われたら,%programdata%\VMware\VMware Workstation以下のsettings.iniの内容をTRUEに変更する.

printers.enabled = "TRUE"

Windows10

msconfigからデバッグ用の設定,デバッグポートはVmWare Playerと合わせてCOM2にする. f:id:pinksawtooth:20160614165612p:plain

WinDbg

Ctrl-kでカーネルデバッグの設定. \.\pipe\com_1にpipeにチェックを入れて接続. f:id:pinksawtooth:20160614170535p:plain

KiServiceTableの取得

Windows Internals, Part 1 (6th Edition) によると 32bitだと

dds KiServiceTable

で取得できる

64bitだとシステムコールの相対ポインタ(オフセット)を使用するため,lnコマンドを使ってオフセットと関数をマッピングする.4ビット右シフトし,KiServiceTableのベースに足して求める.

0: kd> ln @@c++(((int *)@@(nt!KiServiceTable))[3] >> 4) + nt!KiServiceTable
Browse module
Set bu breakpoint

(fffff800`03577a80)   nt!NtReadFile   |  (fffff800`035781bc)   nt!FsRtlCurrentBatchOplock
Exact matches:
    nt!NtReadFile (<no parameter info>)

KiServiceTableとオフセットを確認する方法は以下で見つけた.

KiServiceTable · GitHub

KiServiceLimitは0x1b9h

kd> dw nt!KiServiceLimit
fffff800`0410c408  01b9

KiServiceTableとアドレス

.for(r $t0=0; @$t0<dwo(nt!KiServiceLimit); r $t0=@$t0+1){.printf "%y\n", nt!KiServiceTable+(dwo(nt!KiServiceTable+@$t0*4)>>4)}
fffff801`5dcf9364
fffff801`5dcfc850
nt!NtAcceptConnectPort (fffff801`4e13766c)
nt!NtMapUserPhysicalPagesScatter (fffff801`4e2aad00)
nt!NtWaitForSingleObject (fffff801`4e02b420)
fffff801`5dd587d0
nt!NtReadFile (fffff801`4e028d10)
nt!NtDeviceIoControlFile (fffff801`4e036a00)
nt!NtWriteFile (fffff801`4e028100)
nt!NtRemoveIoCompletion (fffff801`4e1115b0)
nt!NtReleaseSemaphore (fffff801`4e0f93a0)
nt!NtReplyWaitReceivePort (fffff801`4e01db6c)
nt!NtReplyPort (fffff801`4e11be04)
nt!NtSetInformationThread (fffff801`4e01e400)
nt!NtSetEvent (fffff801`4e034410)
nt!NtClose (fffff801`4e029f90)
nt!NtQueryObject (fffff801`4e09f4e0)
nt!NtQueryInformationFile (fffff801`4e033860)
nt!NtOpenKey (fffff801`4e08b2f4)
nt!NtEnumerateValueKey (fffff801`4e09e520)
nt!NtFindAtom (fffff801`4e0c2bac)
nt!NtQueryDefaultLocale (fffff801`4e0be834)
nt!NtQueryKey (fffff801`4e03a750)
nt!NtQueryValueKey (fffff801`4e03b0b0)
nt!NtAllocateVirtualMemory (fffff801`4e00fd30)
nt!NtQueryInformationProcess (fffff801`4e0aeed0)
nt!NtWaitForMultipleObjects32 (fffff801`4e111170)
nt!NtWriteFileGather (fffff801`4e128c90)
nt!NtSetInformationProcess (fffff801`4e04f3d0)
nt!NtCreateKey (fffff801`4e1139a8)
nt!NtFreeVirtualMemory (fffff801`4e00f370)
nt!NtImpersonateClientOfPort (fffff801`4e2a21cc)
nt!NtReleaseMutant (fffff801`4e045690)
nt!NtQueryInformationToken (fffff801`4e093370)
nt!NtRequestWaitReplyPort (fffff801`4e120d08)
nt!NtQueryVirtualMemory (fffff801`4e011af8)
nt!NtOpenThreadToken (fffff801`4e0acf04)
nt!NtQueryInformationThread (fffff801`4e040310)
nt!NtOpenProcess (fffff801`4e091dc0)
fffff801`5dc9bd30
nt!NtMapViewOfSection (fffff801`4e015500)
nt!NtAccessCheckAndAuditAlarm (fffff801`4e04cb28)
nt!NtUnmapViewOfSection (fffff801`4e1294fc)
nt!NtReplyWaitReceivePortEx (fffff801`4e01db80)
nt!NtTerminateProcess (fffff801`4e0aa210)
nt!NtSetEventBoostPriority (fffff801`4e2f25a0)
nt!NtReadFileScatter (fffff801`4e131c8c)
nt!NtOpenThreadTokenEx (fffff801`4e0acf20)
nt!NtOpenProcessTokenEx (fffff801`4e112dd0)
nt!NtQueryPerformanceCounter (fffff801`4e11bb98)
nt!NtEnumerateKey (fffff801`4e09c170)
nt!NtOpenFile (fffff801`4e08b204)
nt!NtDelayExecution (fffff801`4e0aaa50)
nt!NtQueryDirectoryFile (fffff801`4e028020)
nt!NtQuerySystemInformation (fffff801`4e08bc40)
nt!NtOpenSection (fffff801`4e11b080)
nt!NtQueryTimer (fffff801`4e2f2444)
nt!NtFsControlFile (fffff801`4e088684)
nt!NtWriteVirtualMemory (fffff801`4e1303e8)
nt!NtCloseObjectAuditAlarm (fffff801`4e125c1c)
nt!NtDuplicateObject (fffff801`4e0c49e0)
nt!NtQueryAttributesFile (fffff801`4e1135b0)
nt!NtClearEvent (fffff801`4e112d50)
nt!NtReadVirtualMemory (fffff801`4e044754)
nt!NtOpenEvent (fffff801`4e1223a4)
nt!NtAdjustPrivilegesToken (fffff801`4e04c098)
nt!NtDuplicateToken (fffff801`4e0494f4)
fffff801`5dd562a0
nt!NtQueryDefaultUILanguage (fffff801`4e151590)
nt!NtQueueApcThread (fffff801`4e0be424)
fffff801`5dce83c0
nt!NtAddAtom (fffff801`4e2fa228)
nt!NtCreateEvent (fffff801`4e091e40)
nt!NtQueryVolumeInformationFile (fffff801`4e087ad0)
nt!NtCreateSection (fffff801`4e017400)
nt!NtFlushBuffersFile (fffff801`4e12db54)
nt!NtApphelpCacheControl (fffff801`4e0a1eac)
nt!NtCreateProcessEx (fffff801`4e140bbc)
nt!NtCreateThread (fffff801`4e2c211c)
nt!NtIsProcessInJob (fffff801`4e0aa64c)
nt!NtProtectVirtualMemory (fffff801`4e011910)
nt!NtQuerySection (fffff801`4e12a420)
nt!NtResumeThread (fffff801`4e0bee10)
nt!NtTerminateThread (fffff801`4e0bec80)
nt!NtReadRequestData (fffff801`4e2a22a8)
nt!NtCreateFile (fffff801`4e08b270)
nt!NtQueryEvent (fffff801`4e1299f0)
nt!NtWriteRequestData (fffff801`4e2a23cc)
nt!NtOpenDirectoryObject (fffff801`4e11c3d0)
nt!NtAccessCheckByTypeAndAuditAlarm (fffff801`4e04cbac)
nt!NtQuerySystemTime (fffff801`4e2ef858)
nt!NtWaitForMultipleObjects (fffff801`4e029e60)
nt!NtSetInformationObject (fffff801`4e10e180)
nt!NtCancelIoFile (fffff801`4e0a511c)
fffff801`5dcafea0
nt!NtPowerInformation (fffff801`4e076150)
nt!NtSetValueKey (fffff801`4e01b3a0)
fffff801`5dd045e4
fffff801`5dd0e9d4
fffff801`5dcfe80c
fffff801`5de44de8
nt!NtAccessCheckByTypeResultListAndAuditAlarm (fffff801`4e16adf8)
nt!NtAccessCheckByTypeResultListAndAuditAlarmByHandle (fffff801`4e2d730c)
nt!NtAddAtomEx (fffff801`4e122448)
nt!NtAddBootEntry (fffff801`4e2f5e64)
nt!NtAddDriverEntry (fffff801`4e2f5e84)
nt!NtAdjustGroupsToken (fffff801`4e1282b0)
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtAlertResumeThread (fffff801`4e2c928c)
nt!NtAlertThread (fffff801`4e2c9398)
nt!NtAlertThreadByThreadId (fffff801`4e0c9440)
nt!NtAllocateLocallyUniqueId (fffff801`4e116a20)
nt!NtAllocateReserveObject (fffff801`4e2c2810)
nt!NtAllocateUserPhysicalPages (fffff801`4e2a9bdc)
nt!NtAllocateUuids (fffff801`4e13a3ac)
nt!NtAlpcAcceptConnectPort (fffff801`4e0478e8)
nt!NtAlpcCancelMessage (fffff801`4e13b0fc)
nt!NtAlpcConnectPort (fffff801`4e0479ac)
nt!NtAlpcConnectPortEx (fffff801`4e047064)
nt!NtAlpcCreatePort (fffff801`4e12b2fc)
nt!NtAlpcCreatePortSection (fffff801`4e046b4c)
nt!NtAlpcCreateResourceReserve (fffff801`4e0db7d0)
nt!NtAlpcCreateSectionView (fffff801`4e118cf4)
nt!NtAlpcCreateSecurityContext (fffff801`4e042184)
nt!NtAlpcDeletePortSection (fffff801`4e1277b0)
nt!NtAlpcDeleteResourceReserve (fffff801`4e2a31e8)
nt!NtAlpcDeleteSectionView (fffff801`4e125548)
nt!NtAlpcDeleteSecurityContext (fffff801`4e04204c)
nt!NtAlpcDisconnectPort (fffff801`4e0f67d8)
nt!NtAlpcImpersonateClientContainerOfPort (fffff801`4e2a3414)
nt!NtAlpcImpersonateClientOfPort (fffff801`4e01fe50)
nt!NtAlpcOpenSenderProcess (fffff801`4e125070)
nt!NtAlpcOpenSenderThread (fffff801`4e12a5c4)
nt!NtAlpcQueryInformation (fffff801`4e10d210)
nt!NtAlpcQueryInformationMessage (fffff801`4e11dc00)
nt!NtAlpcRevokeSecurityContext (fffff801`4e2a3894)
nt!NtAlpcSendWaitReceivePort (fffff801`4e0224d0)
nt!NtAlpcSetInformation (fffff801`4e08804c)
nt!NtAreMappedFilesTheSame (fffff801`4e0a680c)
nt!NtAssignProcessToJobObject (fffff801`4e0a7b94)
fffff801`5dc8b7f0
nt!NtCancelIoFileEx (fffff801`4e0a4ba4)
nt!NtCancelSynchronousIoFile (fffff801`4e278d48)
fffff801`5dd068b8
fffff801`5dc8b498
fffff801`5dc0a018
fffff801`5dc0a020
fffff801`5dc0a028
nt!NtCompactKeys (fffff801`4e25589c)
nt!NtCompareObjects (fffff801`4e2afff4)
nt!NtCompareTokens (fffff801`4e0f2324)
nt!ArbPreprocessEntry (fffff801`4e13812c)
nt!NtCompressKey (fffff801`4e255ab8)
nt!NtConnectPort (fffff801`4e11facc)
nt!NtCreateDebugObject (fffff801`4e26cbb4)
nt!NtCreateDirectoryObject (fffff801`4e128a74)
nt!NtCreateDirectoryObjectEx (fffff801`4e128a6c)
fffff801`5dc0a030
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtCreateIRTimer (fffff801`4e167f14)
nt!NtCreateIoCompletion (fffff801`4e0477dc)
nt!NtCreateJobObject (fffff801`4e06fa90)
nt!ArbAddReserved (fffff801`4e1a9cd4)
nt!NtCreateKeyTransacted (fffff801`4e11384c)
nt!NtCreateKeyedEvent (fffff801`4e19c15c)
nt!NtCreateLowBoxToken (fffff801`4e0f3f44)
nt!NtCreateMailslotFile (fffff801`4e12d7e0)
nt!NtCreateMutant (fffff801`4e103250)
nt!NtCreateNamedPipeFile (fffff801`4e12d8d8)
nt!NtCreatePagingFile (fffff801`4e197bc8)
nt!NtCreatePartition (fffff801`4e2a7f74)
nt!NtCreatePort (fffff801`4e167280)
nt!NtCreatePrivateNamespace (fffff801`4e12c4f4)
nt!NtCreateProcess (fffff801`4e2c20a0)
nt!NtCreateProfile (fffff801`4e2fba70)
nt!NtCreateProfileEx (fffff801`4e2fbb44)
fffff801`5dc0a038
nt!NtCreateSemaphore (fffff801`4e043b44)
nt!NtCreateSymbolicLinkObject (fffff801`4e0f2c94)
nt!NtCreateThreadEx (fffff801`4e0c0d78)
nt!NtCreateTimer (fffff801`4e044e90)
nt!NtCreateTimer2 (fffff801`4e047a20)
nt!NtCreateToken (fffff801`4e2d7dc8)
nt!NtCreateTokenEx (fffff801`4e04b474)
fffff801`5dc0a040
fffff801`5dc0a048
nt!NtCreateUserProcess (fffff801`4e0bce1c)
nt!NtCreateWaitCompletionPacket (fffff801`4e11c6b8)
nt!NtCreateWaitablePort (fffff801`4e167cfc)
nt!NtCreateWnfStateName (fffff801`4e07a59c)
nt!NtCreateWorkerFactory (fffff801`4e047484)
nt!NtDebugActiveProcess (fffff801`4e26cd7c)
nt!NtDebugContinue (fffff801`4e26cf74)
nt!NtDeleteAtom (fffff801`4e0c9280)
nt!NtDeleteBootEntry (fffff801`4e2f5ea4)
nt!NtDeleteDriverEntry (fffff801`4e2f60c0)
nt!NtDeleteFile (fffff801`4e1a0fd8)
nt!NtDeleteKey (fffff801`4e064e30)
nt!NtDeleteObjectAuditAlarm (fffff801`4e00644c)
nt!NtDeletePrivateNamespace (fffff801`4e2b1bd8)
nt!NtDeleteValueKey (fffff801`4e0d5f54)
nt!NtDeleteWnfStateData (fffff801`4e1a1f1c)
nt!NtDeleteWnfStateName (fffff801`4e07164c)
nt!NtDisableLastKnownGood (fffff801`4e171f70)
nt!NtDisplayString (fffff801`4e2f18f8)
fffff801`5de5887c
nt!NtEnableLastKnownGood (fffff801`4e170754)
nt!NtEnumerateBootEntries (fffff801`4e2f62dc)
nt!NtEnumerateDriverEntries (fffff801`4e2f6940)
nt!NtEnumerateSystemEnvironmentValuesEx (fffff801`4e2f6e90)
fffff801`5dc0a050
nt!NtExtendSection (fffff801`4e2a82c8)
nt!NtFilterBootOption (fffff801`4e2d8fa4)
nt!NtFilterToken (fffff801`4e0f1328)
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtFlushBuffersFileEx (fffff801`4e12db70)
nt!NtFlushInstallUILanguage (fffff801`4e1a3dd0)
nt!ArbPreprocessEntry (fffff801`4e13812c)
nt!NtFlushKey (fffff801`4e0efbc4)
fffff801`5dc7874c
nt!NtFlushVirtualMemory (fffff801`4e10eb98)
nt!NtFlushWriteBuffer (fffff801`4e2ab438)
nt!NtFreeUserPhysicalPages (fffff801`4e2aa304)
fffff801`5dddb084
fffff801`5dc0a058
nt!NtGetCachedSigningLevel (fffff801`4e2d33ec)
nt!NtGetCompleteWnfStateSubscription (fffff801`4e072b58)
nt!NtGetContextThread (fffff801`4e1375d0)
nt!NtGetCurrentProcessorNumber (fffff801`4e2c2960)
nt!NtGetCurrentProcessorNumberEx (fffff801`4e2c2990)
nt!NtGetDevicePowerState (fffff801`4e2bb3fc)
nt!NtGetMUIRegistryInfo (fffff801`4e1225fc)
nt!NtGetNextProcess (fffff801`4e14c324)
nt!NtGetNextThread (fffff801`4e1395c4)
nt!NtGetNlsSectionPtr (fffff801`4e0f1bdc)
fffff801`5dc0a060
fffff801`5dc6c9f0
nt!NtImpersonateAnonymousToken (fffff801`4e0f2758)
nt!NtImpersonateThread (fffff801`4e1002f4)
nt!NtInitializeNlsFiles (fffff801`4e0dd764)
nt!NtInitializeRegistry (fffff801`4e1670dc)
nt!NtInitiatePowerAction (fffff801`4e14975c)
nt!NtIsSystemResumeAutomatic (fffff801`4e14dfa4)
nt!NtIsUILanguageComitted (fffff801`4e140680)
nt!NtListenPort (fffff801`4e1a5264)
nt!NtLoadDriver (fffff801`4e155874)
nt!NtLoadKey (fffff801`4e14311c)
nt!NtLoadKey2 (fffff801`4e167eec)
nt!NtLoadKeyEx (fffff801`4e063ec4)
nt!NtLockFile (fffff801`4e121028)
nt!NtLockProductActivationKeys (fffff801`4e18f518)
nt!NtLockRegistryKey (fffff801`4e19aa70)
fffff801`5dc77734
nt!NtMakePermanentObject (fffff801`4e149308)
nt!NtMakeTemporaryObject (fffff801`4e0eed54)
nt!NtManagePartition (fffff801`4e2a816c)
nt!NtMapCMFModule (fffff801`4e1229b4)
nt!NtMapUserPhysicalPages (fffff801`4e2aa81c)
nt!NtModifyBootEntry (fffff801`4e2f7274)
nt!NtModifyDriverEntry (fffff801`4e2f7290)
nt!NtNotifyChangeDirectoryFile (fffff801`4e1274b0)
nt!NtNotifyChangeKey (fffff801`4e0efe88)
nt!NtNotifyChangeMultipleKeys (fffff801`4e0efef0)
nt!NtNotifyChangeSession (fffff801`4e13e908)
fffff801`5dc0a068
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtOpenIoCompletion (fffff801`4e278b08)
nt!NtOpenJobObject (fffff801`4e2c6fb8)
nt!NtOpenKeyEx (fffff801`4e08bc2c)
nt!NtOpenKeyTransacted (fffff801`4e255c38)
nt!NtOpenKeyTransactedEx (fffff801`4e1338bc)
nt!NtOpenKeyedEvent (fffff801`4e2fbeec)
nt!NtOpenMutant (fffff801`4e11b100)
nt!NtOpenObjectAuditAlarm (fffff801`4e118428)
nt!NtOpenPartition (fffff801`4e2a81d4)
nt!NtOpenPrivateNamespace (fffff801`4e04b150)
nt!NtOpenProcessToken (fffff801`4e112db8)
fffff801`5dc0a070
nt!NtOpenSemaphore (fffff801`4e133e34)
nt!NtOpenSession (fffff801`4e148e30)
nt!NtOpenSymbolicLinkObject (fffff801`4e119368)
nt!NtOpenThread (fffff801`4e08bc00)
nt!NtOpenTimer (fffff801`4e2f23a0)
fffff801`5dc0a078
fffff801`5dc0a080
nt!NtPlugPlayControl (fffff801`4e0b220c)
fffff801`5dc0a088
fffff801`5dc0a090
fffff801`5dc0a098
fffff801`5dc0a0a0
nt!NtPrivilegeCheck (fffff801`4e04f1b0)
nt!NtPrivilegeObjectAuditAlarm (fffff801`4e164000)
nt!NtPrivilegedServiceAuditAlarm (fffff801`4e137304)
fffff801`5dc0a0a8
fffff801`5dc0a0b0
nt!NtPulseEvent (fffff801`4e03fc6c)
nt!NtQueryBootEntryOrder (fffff801`4e2f72ac)
nt!NtQueryBootOptions (fffff801`4e2f75a8)
fffff801`5dc919f8
nt!NtQueryDirectoryObject (fffff801`4e1107e0)
nt!NtQueryDriverEntryOrder (fffff801`4e2f7934)
nt!NtQueryEaFile (fffff801`4e121bc8)
nt!NtQueryFullAttributesFile (fffff801`4e1133c0)
nt!NtQueryInformationAtom (fffff801`4e0c81a4)
fffff801`5dc0a0b8
nt!NtQueryInformationJobObject (fffff801`4e0f4d08)
nt!NtQueryInformationPort (fffff801`4e2a21ec)
fffff801`5dc0a0c0
fffff801`5dc0a0c8
fffff801`5dc0a0d0
fffff801`5de5b214
nt!NtQueryInstallUILanguage (fffff801`4e133a04)
nt!NtQueryIntervalProfile (fffff801`4e1453b8)
nt!NtQueryIoCompletion (fffff801`4e168160)
nt!NtQueryLicenseValue (fffff801`4e00804c)
nt!NtQueryMultipleValueKey (fffff801`4e0d73e4)
nt!NtQueryMutant (fffff801`4e004060)
nt!NtQueryOpenSubKeys (fffff801`4e255e30)
nt!NtQueryOpenSubKeysEx (fffff801`4e256078)
nt!NtQueryPortInformationProcess (fffff801`4e2c2a1c)
nt!NtQueryQuotaInformationFile (fffff801`4e27a274)
nt!NtQuerySecurityAttributesToken (fffff801`4e092f40)
nt!NtQuerySecurityObject (fffff801`4e0a1140)
nt!NtQuerySemaphore (fffff801`4e004480)
nt!NtQuerySymbolicLinkObject (fffff801`4e116c10)
nt!NtQuerySystemEnvironmentValue (fffff801`4e2f7d88)
nt!NtQuerySystemEnvironmentValueEx (fffff801`4e167b44)
nt!NtQuerySystemInformationEx (fffff801`4e127400)
nt!NtQueryTimerResolution (fffff801`4e139fbc)
nt!NtQueryWnfStateData (fffff801`4e0ae8dc)
nt!NtQueryWnfStateNameInformation (fffff801`4e132cd8)
nt!NtQueueApcThreadEx (fffff801`4e0be44c)
fffff801`5dd564e0
nt!NtRaiseHardError (fffff801`4e2f9a14)
fffff801`5dc0a0d8
fffff801`5dc0a0e0
fffff801`5dc0a0e8
fffff801`5dc0a0f0
fffff801`5dc0a238
nt!NtRegisterThreadTerminatePort (fffff801`4e13f338)
nt!NtReleaseKeyedEvent (fffff801`4e137c04)
fffff801`5dcd1f40
nt!NtRemoveIoCompletionEx (fffff801`4e12aea0)
nt!NtRemoveProcessDebug (fffff801`4e26d1dc)
nt!NtRenameKey (fffff801`4e256514)
fffff801`5dc0a240
nt!NtReplaceKey (fffff801`4e256b0c)
fffff801`5de67c88
nt!NtReplyWaitReplyPort (fffff801`4e2a232c)
nt!NtRequestPort (fffff801`4e129da0)
nt!NtResetEvent (fffff801`4e086828)
fffff801`5dcbadb0
nt!NtRestoreKey (fffff801`4e256fdc)
nt!NtResumeProcess (fffff801`4e0062d8)
fffff801`5de39f5c
fffff801`5dc0a0f8
fffff801`5dc0a100
fffff801`5dc0a108
fffff801`5dc0a248
nt!NtSaveKey (fffff801`4e257450)
nt!NtSaveKeyEx (fffff801`4e257824)
nt!NtSaveMergedKeys (fffff801`4e257c60)
nt!NtSecureConnectPort (fffff801`4e11fb14)
nt!NtSerializeBoot (fffff801`4e1a40a0)
nt!NtSetBootEntryOrder (fffff801`4e2f8158)
nt!NtSetBootOptions (fffff801`4e2f83e4)
nt!NtSetCachedSigningLevel (fffff801`4e170514)
nt!NtSetContextThread (fffff801`4e2c6e8c)
nt!NtSetDebugFilterState (fffff801`4e18c4c0)
nt!NtSetDefaultHardErrorPort (fffff801`4e1a4230)
nt!NtSetDefaultLocale (fffff801`4e150e20)
nt!NtSetDefaultUILanguage (fffff801`4e150e0c)
nt!NtSetDriverEntryOrder (fffff801`4e2f8678)
nt!NtSetEaFile (fffff801`4e279ac8)
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
fffff801`5dd0ad74
nt!NtSetInformationDebugObject (fffff801`4e26d324)
fffff801`5dc0a110
nt!NtSetInformationJobObject (fffff801`4e0a69ec)
nt!NtSetInformationKey (fffff801`4e09e950)
fffff801`5dc0a118
nt!NtSetInformationSymbolicLink (fffff801`4e2ae08c)
nt!NtSetInformationToken (fffff801`4e04cc54)
fffff801`5dc0a120
fffff801`5dc0a250
nt!NtSetInformationVirtualMemory (fffff801`4e11d39c)
fffff801`5dcd2a10
nt!NtSetIntervalProfile (fffff801`4e145458)
nt!NtSetIoCompletion (fffff801`4e088b24)
nt!NtSetIoCompletionEx (fffff801`4e278c18)
fffff801`5dd4416c
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtSetQuotaInformationFile (fffff801`4e27ab50)
nt!NtSetSecurityObject (fffff801`4e11e260)
nt!NtSetSystemEnvironmentValue (fffff801`4e2f8904)
nt!NtSetSystemEnvironmentValueEx (fffff801`4e2f8cd0)
nt!NtSetSystemInformation (fffff801`4e051d70)
nt!NtSetSystemPowerState (fffff801`4dfe9ef8)
nt!NtSetSystemTime (fffff801`4e2ef8c4)
nt!NtSetThreadExecutionState (fffff801`4e1483f4)
fffff801`5dc0dbd4
fffff801`5dc47dd0
nt!NtSetTimerResolution (fffff801`4e12e224)
nt!NtSetUuidSeed (fffff801`4e19cc94)
nt!NtSetVolumeInformationFile (fffff801`4e14405c)
nt!NtSetWnfProcessNotificationEvent (fffff801`4e12d388)
nt!NtShutdownSystem (fffff801`4e2f1a9c)
fffff801`5dd05680
fffff801`5de29068
fffff801`5dc0a258
nt!NtStartProfile (fffff801`4e2fbba0)
nt!NtStopProfile (fffff801`4e2fbe04)
nt!NtSubscribeWnfStateChange (fffff801`4e071fb8)
nt!NtSuspendProcess (fffff801`4e005684)
nt!NtSuspendThread (fffff801`4e12f1b0)
nt!NtSystemDebugControl (fffff801`4e2fd570)
nt!NtTerminateJobObject (fffff801`4e12c1d4)
nt!NtTestAlert (fffff801`4e0c0584)
fffff801`5dddb0d8
fffff801`5dc0a128
nt!NtTraceControl (fffff801`4e0aac30)
nt!NtTranslateFilePath (fffff801`4e2f8f3c)
nt!NtUmsThreadYield (fffff801`4e29e140)
nt!NtUnloadDriver (fffff801`4e27e044)
nt!NtUnloadKey (fffff801`4e1a57d4)
nt!NtUnloadKey2 (fffff801`4e1644e4)
nt!NtUnloadKeyEx (fffff801`4e1194c0)
nt!NtUnlockFile (fffff801`4e125d5c)
fffff801`5dc62c70
nt!NtUnmapViewOfSectionEx (fffff801`4e0158f0)
nt!NtUnsubscribeWnfStateChange (fffff801`4e070e00)
nt!NtUpdateWnfStateData (fffff801`4e073448)
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtWaitForAlertByThreadId (fffff801`4e112934)
nt!NtWaitForDebugEvent (fffff801`4e26d51c)
nt!NtWaitForKeyedEvent (fffff801`4e137a24)
fffff801`5dc4b850
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)
nt!NtAdjustTokenClaimsAndDeviceGroups (fffff801`4e1a9ce4)

ここからstart addressを引くとRVAになる

kd> lmDvmnt
Browse full module list
start             end                 module name
fffff801`4dc09000 fffff801`4e45b000   nt         (pdb symbols)          c:\symbols\ntkrnlmp.pdb\C68EE22FDCF6477895C54A862BE165671\ntkrnlmp.pdb
    Loaded symbol image file: ntkrnlmp.exe
    Image path: ntkrnlmp.exe
    Image name: ntkrnlmp.exe
    Browse all global symbols  functions  data
    Timestamp:        Fri Jul 10 12:29:30 2015 (559F3C1A)
    CheckSum:         007AFB58
    ImageSize:        00852000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4

pythonで書いた

import re

with open("KiServiceTable.txt", "r") as f:
    str_list = f.readlines()

for str in str_list:
    if str.find('nt!') != -1 :
        sprit_str =str.split('(')
        print "%s %x" % (sprit_str[0].strip('nt!').replace('\n',''), int(sprit_str[1].replace(')','').replace('`',''),16)-0xfffff8014dc09000)
python systable.py
NtAcceptConnectPort  52e66c
NtMapUserPhysicalPagesScatter  6a1d00
NtWaitForSingleObject  422420
NtReadFile  41fd10
NtDeviceIoControlFile  42da00
NtWriteFile  41f100
NtRemoveIoCompletion  5085b0
NtReleaseSemaphore  4f03a0
NtReplyWaitReceivePort  414b6c
NtReplyPort  512e04
NtSetInformationThread  415400
NtSetEvent  42b410
NtClose  420f90
NtQueryObject  4964e0
NtQueryInformationFile  42a860
NtOpenKey  4822f4
NtEnumerateValueKey  495520
NtFindAtom  4b9bac
NtQueryDefaultLocale  4b5834
NtQueryKey  431750
NtQueryValueKey  4320b0
NtAllocateVirtualMemory  406d30
NtQueryInformationProcess  4a5ed0
NtWaitForMultipleObjects32  508170
NtWriteFileGather  51fc90
NtSetInformationProcess  4463d0
NtCreateKey  50a9a8
NtFreeVirtualMemory  406370
NtImpersonateClientOfPort  6991cc
NtReleaseMutant  43c690
NtQueryInformationToken  48a370
NtRequestWaitReplyPort  517d08
NtQueryVirtualMemory  408af8
NtOpenThreadToken  4a3f04
NtQueryInformationThread  437310
NtOpenProcess  488dc0
NtMapViewOfSection  40c500
NtAccessCheckAndAuditAlarm  443b28
NtUnmapViewOfSection  5204fc
NtReplyWaitReceivePortEx  414b80
NtTerminateProcess  4a1210
NtSetEventBoostPriority  6e95a0
NtReadFileScatter  528c8c
NtOpenThreadTokenEx  4a3f20
NtOpenProcessTokenEx  509dd0
NtQueryPerformanceCounter  512b98
NtEnumerateKey  493170
NtOpenFile  482204
NtDelayExecution  4a1a50
NtQueryDirectoryFile  41f020
NtQuerySystemInformation  482c40
NtOpenSection  512080
NtQueryTimer  6e9444
NtFsControlFile  47f684
NtWriteVirtualMemory  5273e8
NtCloseObjectAuditAlarm  51cc1c
NtDuplicateObject  4bb9e0
NtQueryAttributesFile  50a5b0
NtClearEvent  509d50
NtReadVirtualMemory  43b754
NtOpenEvent  5193a4
NtAdjustPrivilegesToken  443098
NtDuplicateToken  4404f4
NtQueryDefaultUILanguage  548590
NtQueueApcThread  4b5424
NtAddAtom  6f1228
NtCreateEvent  488e40
NtQueryVolumeInformationFile  47ead0
NtCreateSection  40e400
NtFlushBuffersFile  524b54
NtApphelpCacheControl  498eac
NtCreateProcessEx  537bbc
NtCreateThread  6b911c
NtIsProcessInJob  4a164c
NtProtectVirtualMemory  408910
NtQuerySection  521420
NtResumeThread  4b5e10
NtTerminateThread  4b5c80
NtReadRequestData  6992a8
NtCreateFile  482270
NtQueryEvent  5209f0
NtWriteRequestData  6993cc
NtOpenDirectoryObject  5133d0
NtAccessCheckByTypeAndAuditAlarm  443bac
NtQuerySystemTime  6e6858
NtWaitForMultipleObjects  420e60
NtSetInformationObject  505180
NtCancelIoFile  49c11c
NtPowerInformation  46d150
NtSetValueKey  4123a0
NtAccessCheckByTypeResultListAndAuditAlarm  561df8
NtAccessCheckByTypeResultListAndAuditAlarmByHandle  6ce30c
NtAddAtomEx  519448
NtAddBootEntry  6ece64
NtAddDriverEntry  6ece84
NtAdjustGroupsToken  51f2b0
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtAlertResumeThread  6c028c
NtAlertThread  6c0398
NtAlertThreadByThreadId  4c0440
NtAllocateLocallyUniqueId  50da20
NtAllocateReserveObject  6b9810
NtAllocateUserPhysicalPages  6a0bdc
NtAllocateUuids  5313ac
NtAlpcAcceptConnectPort  43e8e8
NtAlpcCancelMessage  5320fc
NtAlpcConnectPort  43e9ac
NtAlpcConnectPortEx  43e064
NtAlpcCreatePort  5222fc
NtAlpcCreatePortSection  43db4c
NtAlpcCreateResourceReserve  4d27d0
NtAlpcCreateSectionView  50fcf4
NtAlpcCreateSecurityContext  439184
NtAlpcDeletePortSection  51e7b0
NtAlpcDeleteResourceReserve  69a1e8
NtAlpcDeleteSectionView  51c548
NtAlpcDeleteSecurityContext  43904c
NtAlpcDisconnectPort  4ed7d8
NtAlpcImpersonateClientContainerOfPort  69a414
NtAlpcImpersonateClientOfPort  416e50
NtAlpcOpenSenderProcess  51c070
NtAlpcOpenSenderThread  5215c4
NtAlpcQueryInformation  504210
NtAlpcQueryInformationMessage  514c00
NtAlpcRevokeSecurityContext  69a894
NtAlpcSendWaitReceivePort  4194d0
NtAlpcSetInformation  47f04c
NtAreMappedFilesTheSame  49d80c
NtAssignProcessToJobObject  49eb94
NtCancelIoFileEx  49bba4
NtCancelSynchronousIoFile  66fd48
NtCompactKeys  64c89c
NtCompareObjects  6a6ff4
NtCompareTokens  4e9324
ArbPreprocessEntry  52f12c
NtCompressKey  64cab8
NtConnectPort  516acc
NtCreateDebugObject  663bb4
NtCreateDirectoryObject  51fa74
NtCreateDirectoryObjectEx  51fa6c
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtCreateIRTimer  55ef14
NtCreateIoCompletion  43e7dc
NtCreateJobObject  466a90
ArbAddReserved  5a0cd4
NtCreateKeyTransacted  50a84c
NtCreateKeyedEvent  59315c
NtCreateLowBoxToken  4eaf44
NtCreateMailslotFile  5247e0
NtCreateMutant  4fa250
NtCreateNamedPipeFile  5248d8
NtCreatePagingFile  58ebc8
NtCreatePartition  69ef74
NtCreatePort  55e280
NtCreatePrivateNamespace  5234f4
NtCreateProcess  6b90a0
NtCreateProfile  6f2a70
NtCreateProfileEx  6f2b44
NtCreateSemaphore  43ab44
NtCreateSymbolicLinkObject  4e9c94
NtCreateThreadEx  4b7d78
NtCreateTimer  43be90
NtCreateTimer2  43ea20
NtCreateToken  6cedc8
NtCreateTokenEx  442474
NtCreateUserProcess  4b3e1c
NtCreateWaitCompletionPacket  5136b8
NtCreateWaitablePort  55ecfc
NtCreateWnfStateName  47159c
NtCreateWorkerFactory  43e484
NtDebugActiveProcess  663d7c
NtDebugContinue  663f74
NtDeleteAtom  4c0280
NtDeleteBootEntry  6ecea4
NtDeleteDriverEntry  6ed0c0
NtDeleteFile  597fd8
NtDeleteKey  45be30
NtDeleteObjectAuditAlarm  3fd44c
NtDeletePrivateNamespace  6a8bd8
NtDeleteValueKey  4ccf54
NtDeleteWnfStateData  598f1c
NtDeleteWnfStateName  46864c
NtDisableLastKnownGood  568f70
NtDisplayString  6e88f8
NtEnableLastKnownGood  567754
NtEnumerateBootEntries  6ed2dc
NtEnumerateDriverEntries  6ed940
NtEnumerateSystemEnvironmentValuesEx  6ede90
NtExtendSection  69f2c8
NtFilterBootOption  6cffa4
NtFilterToken  4e8328
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtFlushBuffersFileEx  524b70
NtFlushInstallUILanguage  59add0
ArbPreprocessEntry  52f12c
NtFlushKey  4e6bc4
NtFlushVirtualMemory  505b98
NtFlushWriteBuffer  6a2438
NtFreeUserPhysicalPages  6a1304
NtGetCachedSigningLevel  6ca3ec
NtGetCompleteWnfStateSubscription  469b58
NtGetContextThread  52e5d0
NtGetCurrentProcessorNumber  6b9960
NtGetCurrentProcessorNumberEx  6b9990
NtGetDevicePowerState  6b23fc
NtGetMUIRegistryInfo  5195fc
NtGetNextProcess  543324
NtGetNextThread  5305c4
NtGetNlsSectionPtr  4e8bdc
NtImpersonateAnonymousToken  4e9758
NtImpersonateThread  4f72f4
NtInitializeNlsFiles  4d4764
NtInitializeRegistry  55e0dc
NtInitiatePowerAction  54075c
NtIsSystemResumeAutomatic  544fa4
NtIsUILanguageComitted  537680
NtListenPort  59c264
NtLoadDriver  54c874
NtLoadKey  53a11c
NtLoadKey2  55eeec
NtLoadKeyEx  45aec4
NtLockFile  518028
NtLockProductActivationKeys  586518
NtLockRegistryKey  591a70
NtMakePermanentObject  540308
NtMakeTemporaryObject  4e5d54
NtManagePartition  69f16c
NtMapCMFModule  5199b4
NtMapUserPhysicalPages  6a181c
NtModifyBootEntry  6ee274
NtModifyDriverEntry  6ee290
NtNotifyChangeDirectoryFile  51e4b0
NtNotifyChangeKey  4e6e88
NtNotifyChangeMultipleKeys  4e6ef0
NtNotifyChangeSession  535908
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtOpenIoCompletion  66fb08
NtOpenJobObject  6bdfb8
NtOpenKeyEx  482c2c
NtOpenKeyTransacted  64cc38
NtOpenKeyTransactedEx  52a8bc
NtOpenKeyedEvent  6f2eec
NtOpenMutant  512100
NtOpenObjectAuditAlarm  50f428
NtOpenPartition  69f1d4
NtOpenPrivateNamespace  442150
NtOpenProcessToken  509db8
NtOpenSemaphore  52ae34
NtOpenSession  53fe30
NtOpenSymbolicLinkObject  510368
NtOpenThread  482c00
NtOpenTimer  6e93a0
NtPlugPlayControl  4a920c
NtPrivilegeCheck  4461b0
NtPrivilegeObjectAuditAlarm  55b000
NtPrivilegedServiceAuditAlarm  52e304
NtPulseEvent  436c6c
NtQueryBootEntryOrder  6ee2ac
NtQueryBootOptions  6ee5a8
NtQueryDirectoryObject  5077e0
NtQueryDriverEntryOrder  6ee934
NtQueryEaFile  518bc8
NtQueryFullAttributesFile  50a3c0
NtQueryInformationAtom  4bf1a4
NtQueryInformationJobObject  4ebd08
NtQueryInformationPort  6991ec
NtQueryInstallUILanguage  52aa04
NtQueryIntervalProfile  53c3b8
NtQueryIoCompletion  55f160
NtQueryLicenseValue  3ff04c
NtQueryMultipleValueKey  4ce3e4
NtQueryMutant  3fb060
NtQueryOpenSubKeys  64ce30
NtQueryOpenSubKeysEx  64d078
NtQueryPortInformationProcess  6b9a1c
NtQueryQuotaInformationFile  671274
NtQuerySecurityAttributesToken  489f40
NtQuerySecurityObject  498140
NtQuerySemaphore  3fb480
NtQuerySymbolicLinkObject  50dc10
NtQuerySystemEnvironmentValue  6eed88
NtQuerySystemEnvironmentValueEx  55eb44
NtQuerySystemInformationEx  51e400
NtQueryTimerResolution  530fbc
NtQueryWnfStateData  4a58dc
NtQueryWnfStateNameInformation  529cd8
NtQueueApcThreadEx  4b544c
NtRaiseHardError  6f0a14
NtRegisterThreadTerminatePort  536338
NtReleaseKeyedEvent  52ec04
NtRemoveIoCompletionEx  521ea0
NtRemoveProcessDebug  6641dc
NtRenameKey  64d514
NtReplaceKey  64db0c
NtReplyWaitReplyPort  69932c
NtRequestPort  520da0
NtResetEvent  47d828
NtRestoreKey  64dfdc
NtResumeProcess  3fd2d8
NtSaveKey  64e450
NtSaveKeyEx  64e824
NtSaveMergedKeys  64ec60
NtSecureConnectPort  516b14
NtSerializeBoot  59b0a0
NtSetBootEntryOrder  6ef158
NtSetBootOptions  6ef3e4
NtSetCachedSigningLevel  567514
NtSetContextThread  6bde8c
NtSetDebugFilterState  5834c0
NtSetDefaultHardErrorPort  59b230
NtSetDefaultLocale  547e20
NtSetDefaultUILanguage  547e0c
NtSetDriverEntryOrder  6ef678
NtSetEaFile  670ac8
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtSetInformationDebugObject  664324
NtSetInformationJobObject  49d9ec
NtSetInformationKey  495950
NtSetInformationSymbolicLink  6a508c
NtSetInformationToken  443c54
NtSetInformationVirtualMemory  51439c
NtSetIntervalProfile  53c458
NtSetIoCompletion  47fb24
NtSetIoCompletionEx  66fc18
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtSetQuotaInformationFile  671b50
NtSetSecurityObject  515260
NtSetSystemEnvironmentValue  6ef904
NtSetSystemEnvironmentValueEx  6efcd0
NtSetSystemInformation  448d70
NtSetSystemPowerState  3e0ef8
NtSetSystemTime  6e68c4
NtSetThreadExecutionState  53f3f4
NtSetTimerResolution  525224
NtSetUuidSeed  593c94
NtSetVolumeInformationFile  53b05c
NtSetWnfProcessNotificationEvent  524388
NtShutdownSystem  6e8a9c
NtStartProfile  6f2ba0
NtStopProfile  6f2e04
NtSubscribeWnfStateChange  468fb8
NtSuspendProcess  3fc684
NtSuspendThread  5261b0
NtSystemDebugControl  6f4570
NtTerminateJobObject  5231d4
NtTestAlert  4b7584
NtTraceControl  4a1c30
NtTranslateFilePath  6eff3c
NtUmsThreadYield  695140
NtUnloadDriver  675044
NtUnloadKey  59c7d4
NtUnloadKey2  55b4e4
NtUnloadKeyEx  5104c0
NtUnlockFile  51cd5c
NtUnmapViewOfSectionEx  40c8f0
NtUnsubscribeWnfStateChange  467e00
NtUpdateWnfStateData  46a448
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtWaitForAlertByThreadId  509934
NtWaitForDebugEvent  66451c
NtWaitForKeyedEvent  52ea24
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4
NtAdjustTokenClaimsAndDeviceGroups  5a0ce4