コマンドスクリプトは、特定のタスクに関連するコマンドは、一緒にグループ化されたスクリプトファイルに格納されて完成させることですが、私たちの目的を達成するために、実装にWindbgのにロードされます。あなたは、Cやアセンブラのようなスクリプト言語の一種として理解することができるが、彼は、実行可能ファイルにコンパイルするコンパイラを必要としませんが、インタプリタによって、その内容は、対応するアクションに翻訳します。Windbgのスクリプトアクションの実際のコンテンツのためのスクリプトを翻訳、通訳としてWindbgのを使用することです。
それは言語として使用することができますので、それは多くの場合、一般的な言語の要素を含んでいますので、データ型、変数、式、文、関数、および、ここでは話をし、単純でした。
まず、データの種類
数値と文字列の両方、データ型については、助けWindbgのは、具体的に列挙していないが、一般的に使用する際に遭遇します。
- 数値
の値が説明するために多くの必要性、およびすべてのプログラミング言語の整数の意味を持たない、時間の点のバイナリ表現を持っています。
コード:
バイナリ0B
。0N 8進
10 0T進
16進0X - ストリング
ハローwindbgの」「は、上記のように、囲まれた」一対のストリング。
第二に、変数
変数のWinDbgで定義されているが、実際に、それは変数の概念がありませんので、学習するときには非常に不快に感じるだろう、非常に特別です。しかし、我々は思考に変更される可能性があり、変数はちょうどあなたが、その後の疑似レジスタが(参照して、いくつかの値を保持したい場合は、一時的な結果を保存するために実際にある文法規則シリーズのWindbgのコマンドを)より良い選択である必要があり、windbgのは20擬似を提供しています$ t0- $のT19を登録し、一時的なコマンド数値変数のために保存します。単に定義されてwindbgの名前を付け、C ++の式でrコマンドは、@記号の前に必要とされている使用している、最初、理由登録疑似とその操作を登録し、それらを呼び出しますが、彼らは実際に登録されていませんのみ。これらの疑似レジスタを使用すると、非常に便利です:
コード:
0:000> R $ T0 = 0x123 0:000> R $ t0の $ T0 = 00000123 0:000> R EAX 、EAX = 004c1b89 0:000> R $ T0 = @ EAX 0:000> R $ t0のを $ t0の= 004c1b89
上記の例では、コマンドのR @以下見ることができるから省略されてもよいです。
第三には、エイリアス
エイリアス変数、およびいくつかの違いが、彼は実行時に変数の値をとり、などのマクロエイリアスは、直接コンテンツを解釈する際に、元のオペランドを交換してください。エイリアスは、2があり、1は固定の名前があり、一つはカスタムです。
- 固定されたエイリアス名
固定エイリアス名と疑似レジスタが似ている、Windbgのは$ u0- $ U9、10を提供します。rコマンドはまだ使用された場合、このように、「U」1が先行する「」:
コード:
0:000> R $ .u0 = "123" 0:000> .echo $ U0 123
- カスタムエイリアス
カスタムエイリアスは、しかし、その存在を、我々はメモリの別名を定義する文字列の一部と考えることができ、より複雑になります。操作は3つのカスタムaliasコマンドがあります:広告、アル、など。
電源は、メモリアドレスを指定することができるエイリアスの定義、メモリ別名定義の次に内容として。
コード:
0:000> .dvalloc 10の 00010000から始まる割り当て1000のバイト 0:000> EA 00010000 "123456" 0:0x00010000:000>のMA $ {テスト/ V} /として 0:000>試験.echo 123456
コード:
/ MAパラメータは、ASCII文字列としてメモリアドレスを指定します。
/ムーパラメータは、Unicode文字列としてメモリアドレスを指定します。
パラメータ文字列のANSI_STRINGとして指定/ MSAメモリアドレス。
パラメータUNICODE_STRING文字列として指定/ MSUのメモリアドレス。
指定されたファイルの内容に等しい/ F別名パラメータ。
/指定された環境変数に等しい電子エイリアスパラメータ。
アルショーエイリアスすでに定義され、削除された定義された別名ADは、その後、ちょうど次のコマンドを入力します。例を続ける:
コード:
0:000>ら エイリアス値 ------- ------- 試験123456 0:000>広告$ {/ V:試験} 0:000>ら ませんエイリアス
今度は、$ {}で変だった例を説明しましょう、インタプリタエイリアスと呼ばれるこの事は、エイリアスは内部バックブレース、Windbgのは、それが翻訳する必要があり、別名があることを知っています。実際には、このシンボルなしにすることができますが、彼が書いたとき、私は発散しないだろう誰が、知っている人は、最良の提案が使用すると、スクリプトの複合体は、問題がある可能性があります。通訳も/ Vの上、オプションがあります。それは一つでした。
/ V:完全なエイリアスではなく、翻訳、定義を維持し、使用時に削除します。
/ N:エイリアス定義翻訳されたコンテンツの場合、または任意の翻訳なし。
/ F:エイリアス定義がコンテンツを翻訳した場合は、別の空のように変換。
/ D:別名#IFDEFに対応する、翻訳、または0に翻訳として定義されている場合。
第四に、表現
(参照アセンブラとC ++の式式:Windbgのには2つの式を提供文法シリーズWindbgのコマンドのルール)。いずれかのこれらの式の演算子とオペランドは若干異なります。
デフォルトでは、式の値が値のC ++表現を探している?してコンパイルされた見つけ、表現の集大成です??。
これらの算術演算子も時々オフ機能に、最初のパラメータは次のように、文字列へのポインタであり、そのようなPOIのようないくつかの同様の変換演算子を持っている以外に、*、/ -コンパイルされた表現を使用可能な加算演算子+、行うこの文字列を印刷する方法?ESP + 4、および、結果からDAと、POIと、単一のコマンドを行うことができるddを得るよう、DDのPOI(ESP + 4) 。
C ++の式のほぼすべてのC ++の式を使用することができ、より豊富であり、そして含まれ- >演算子Windbgのは、説明の仕方によってC ++の式をしたい、と@@ C ++の式の前に()を必要とします。
第五に、文は
少ない制御文も流れましできるか、それがプログラムされているので、スクリプトは、プログラミングの考え方に基づいて書かれるべきであると言いましたか?:windbgのには、次のフロー制御文をサポート
.IF
.ELSE
.ELIF
.FOR
.while
.BREAK
.CONTINUE
.doという
ことに慣れ.printf形式の出力を、。
.block文ブロック
$$ノートには、奇妙に見えます
そこでは、個別に話をする.block、囲まれた、いわゆる文ブロックは、{}実際には、離れて.ELSE事実ステートメントブロック文、別名内部のブロック文の背後にある.IFを含む文の山、、から(覚えていますエイリアスの定義を変更した場合、ブロックに入った後、ブロックを入力するときに、それが)変換され、それは(あなたが従う必要がある場合は、このブロック内の後続の文で)それを交換することであるとして、別名を覚えているので、無効です文はブロック内の単一のステートメントに、次の文を有効にするには、{A}}一緒にそれらを含むが、直接Windbgのを{識別することができない、すなわち、それが.blockだったので、参照、物事を含んでいますここで、あなたが翻訳するためのエイリアスを必要とする場合、彼は文のブロックで行わなければならない、覚えておいてください。
シックス・機能(ビルトイン)
彼らが話すと、2つの組み込み関数$ $ sicmpは、SCMP列比較、大文字と小文字を区別し、大文字と小文字を区別しません。これら二つの機能に障害を持っている、それがリテラル文字列を受け取り、あなただけの$ SCMP(「123」、「書くことができる、つまり、唯一のパラメータである 123」)、 あなたは$のSCMP(POI(ESP + 4を書き込むことができません "、) 123「)、まあ、使用は何であるこれら二つの機能に書き込めない切望していましたか?我々は(これは、最も便利な場所の別名である)エイリアスを使用することができ、心配、または単にその一例を踏襲しないでください:
コード:
0:000> / MAの$ {/ V:試験}として00010000 0:000>?$のSCMP( "$ {試験}"、 "123456")が 式評価する:0 = 00000000 > 000:0?$のSCMP( "$ {試験}"、 "123457") 評価式:-1 = FFFFFFFF
あなたは文字列変数を比較できるように。
さて、上記の知識と、windbgのスクリプトは根拠を持つべきで書き、残りはあなたが「API」を知っているどのくらい見ることで、より詳細な情報は、Windbgの者を助けるために掘るする必要があります。
最後に、完全な例を掲載足がCreateFileWフック使用して、この例では長くはありませんが、ハハ、ああの本質です。
コード:
.dvalloc / B 0x79990000 30 EW 0x79990000 0xc033 編0x79990002 0x00001cc2 BP kernel32の CreateFileW!" など /ミュー$ {/ V:ファイル名}ポイ(ESP + 4 ); .block { 。もし($ sicmp(\ " $ {ファイル名} \」 、\ "C:\\ 1.TXT \")== 0){ .echo \ " オープン1.TXTの\"; R EIP = 0x79990000 } } 広告$ { / V:ファイル名}; GC; "
七、実行
スクリプトの簡単な作品に最初の
コード:
.echo「ハローwindbgの」
"ハローwindbgの"文字列は、Cに保存し、このコマンドで表示:\ 1.TXTファイルは、その後、Windbgのコマンドウィンドウを入力します。
$> <C:\ 1.TXT 入力し、
画面上で行っているものを見て?
Windbgのコマンドが実行されるようwindbgの内容を1.TXTます。これは、単純なスクリプトです。$> <、この例によれば、彼が完成Windbgのは、TXT Windbgのコマンドキー変換に変わります説明するために、スクリプトファイルの役割であることを確認することは容易です。実際には、あなたはこれを知って、Windbgのスクリプトにもエントリー場合、私たちは、この文書に記述されたコマンドの多くを入れて、その後、$> <ロード実行を使用することができます。
ここでWindbgのコマンドの実行、5つの関連コマンドの合計の下でロードからスクリプトです、$ <、$> <、$$ <、$$> <と$$> <コマンドは、指定したスクリプトファイルの内容を読み取りデバッガのコマンド入力として、その内容を使用します。次のように:
$ <ファイル名 $> <ファイル名 $$ <ファイル名 $$> <ファイル名 $$> A <ファイル名[引数1 arg2のARG3 ...]
パラメータ:
- ファイル名は、
ファイルが有効なデバッガ・コマンド・テキストが含まれている指定します。ファイル名は、Microsoft Windowsのファイル命名規則に従わなければなりません。ファイル名にスペースが含まれていてもよいです。 - ARGN
スクリプトに渡されるデバッガの文字列の任意の数のパラメータを指定します。デバッガは、{$ $ Argのフォーム任意の文字列に置き換えられますN-対応するスクリプトファイルを持つ} ARGNを前にスクリプトを実行します。パラメータは、引用符やセミコロンを含めることはできません。複数の引数は、スペースで区切る必要があります。パラメータにスペースが含まれる場合、それは引用符で囲む必要があります。すべての引数はオプションです。
環境:
モード |
ユーザーモードでは、カーネルモード |
目標 |
リアルタイムのクラッシュダンプ |
プラットフォーム |
完成 |
詳細:
$$ <および$ <文字通り実行するスクリプトは、ファイル内のコマンドを見つけることがトークン。しかし、のために$ <あなたは含まセミコロンを含め、任意のファイル名を指定することができます。ので、$は<ファイルの名前のようにセミコロンを使用して接続することができないことができます$ <コマンドのパーティションの区切りとファイル名の部分はセミコロンを使用することができないので、他のデバッガコマンド。
$$> <と$> <トークン文字通りこれは、彼らのオープンスクリプトファイルというセミコロンを意味し、キャリッジリターンとテキストブロックを生成し、単一のコマンドで実行されたすべてを置き換えるために、スクリプトファイルの中のコマンドを実行します。同様に$ <議論されてきた、$> <バリアントは、ファイル名にセミコロンが含まれていることができ、シリーズの無いことを意味している$> <コマンドおよびその他のデバッガ。
$$> <と$> <スクリプトデバッガ・コマンド・プログラムが含まれている場合、トークンは便利です。
あなたは、ファイル名にセミコロンが含まれていない限り、2つの使用を必要としない$ <または$> <を。
$$> <トークンスクリプトにパラメータを渡すために、デバッガを有効にします。場合は、ファイル名にスペースが含まれ、それは引用符で囲む必要があります。パラメータはあまり提供されている場合、余分なパラメータは無視されます。いかなるパラメータが少なすぎるが供給されていない場合、$トークンのArg $の任意のソースを形成する{ N }位置nが保持されるテキストの形で提供されたパラメータの数よりも大きく、任意のコンテンツで置き換えられません。あなたは、コマンドにセミコロンや他のコマンドを使用することができます。パラメータリストを終了するセミコロンがあります。
場合は、スクリプトデバッガの実行、コマンド出力とそれに対応するデバッガ・コマンド・ウィンドウ。スクリプトファイルの末尾に到達すると、デバッガに制御を返します。
次の表は、これらのトークンの使用方法をまとめたものです。
トークン | これは、セミコロンを含むファイル名を許可します | セミコロンで区切られた他のコマンドとの間に直列を許可します | 単一のブロックを命令します | スクリプトのパラメータを許可します |
---|---|---|---|---|
$ < |
それはあります |
ノー |
ノー |
ノー |
$> < |
それはあります |
ノー |
それはあります |
ノー |
$$ < |
ノー |
それはあります |
ノー |
ノー |
$$> < |
ノー |
それはあります |
それはあります |
ノー |
$$> A < |
ノー |
それはあります |
それはあります |
それはあります |
$ <、$> <、$$ <および$$> <コマンドはバックコマンドファイルへの明示的なスクリプトを含んでおり、これらのコマンドの出力を表示します。$$> <コマンドは、スクリプトファイルにコマンドをエコー見つけ、だけで、その出力を表示しません。ネストすることができますスクリプトファイル。スクリプトデバッガがどのトークンに遭遇した場合、実行は新しいスクリプトファイルに移動し、新しいスクリプトファイルを完了し、前の位置に戻ります。また、再帰的にスクリプトを呼び出すことができます。WinDbgのでは、テキストウィンドウにデバッガ・コマンド他のコマンドを貼り付けることができます。
参考:
https://blog.csdn.net/superliuxing/article/details/19206985