
みなさんこんにちは。 私たちの愛するIDA Proの近代化に関する一連の記事を始めることにしました。
各チュートリアルでは、かなり複雑でほとんど研究されていないトピックを明らかにしようとします:異なるモジュールを書く:
- ローダー;
- プラグイン
- デバッガプラグイン;
- プロセッサモジュール;
- スクリプト。
そして、 プロセッサモジュール 、 プラグイン 、およびスクリプトがまだあまり公開されていないトピックである場合、他のすべてはほぼ完全に暗闇です( 記事の最後に、少なくとも何かがあるリファレンスとプロジェクトのリストを示します )。
したがって、シリーズの最初の記事は、 デバッガプラグインの作成 、またはむしろ予備的な理論に専念します 。 IDA SDKの標準配信では、メインデバッガー( Windows 、 Linux 、 Mac )のソースが既にあります。 しかし、たとえば、 Amiga 、 M68000はどうでしょうか。
この記事は、退屈であまり理論ではない可能性が高いでしょう。 次のように、自分自身をよく理解することを強くお勧めします。 将来の多くのポイントは、一般的な概念を提示することができないため、正確に理解できない場合があります。
手始めに、デバッグプラグインが何であるかを決めましょう。
デバッガープラグインの種類
IDAデバッガプラグインには、主に2つのタイプがあります。
- local-デバッグプロセスが行われるのと同じマシンで実行されます。
- remote( RPC ) -リモートで実行されます。 ローカルプラグインでプルする必要があります。
他にもいくつかありますが、これらの記事では考慮されません(または考慮されますか?)。 ここでは、 ローカルデバッガーについてのみ説明します。 リモートのコードは2倍のコード(クライアントとサーバー)を必要とし、まだ十分に研究されていません。
デバッガプラグインのコンポーネント
- 実際には、 IDA 。 コマンドを送信し、 デバッガーからのメッセージを受信して応答し、デバッグの現在の状態を表示します。
- 必要なプロセッサまたはコードのエミュレータ 。 指示に従う方法、ブレークポイントを報告する方法、エミュレーションプロセスを一時停止して続行する方法、プロセスを開始および終了する方法を知っているとします。
- まあ、 デバッガー自体はプラグインです。 エミュレータと対話し、 IDAにメッセージを送信し、レジスタ、メモリの現在の状態を読み取る必要があります。
だから、すべてのコンポーネントについて順番に。
IDA-ビジュアルインターフェイス
実際、 IDA自体は、ユーザーインターフェイスとデバッガーの間のアダプターであり、 コマンドを送信し、反応( メッセージ )を待機します 。 チームは次のようになります。
- 現在のイベントの処理の完了。
- プロセスまたはスレッドの開始/一時停止/終了。
- ステップ( ステップイン 、 ステップオーバー 、 リターンまでステップ );
- 休憩のインストール/削除;
- メモリまたはレジスタの読み取り/書き込み。
デバッガープラグイン
プラグインのタスクは、 IDAからのコマンドに応答し( 上記を参照 )、 エミュレータで動作する次のタイプのイベントを送信することです:
- プロセスの開始/一時停止/参加/切断/終了。
- ストリームの開始/終了。
- ブレークポイント;
- ステップ( ステップイン 、 ステップオーバー 、 リターンまでステップ );
- 例外。
メッセージを送信して、 IDAが現在何が起こっているかを把握し、デバッグの現在の状態を表示する必要があります。 たとえば、ブレークまたはステップのイベントが発生した場合、ユーザーからのさらなるアクションを待つために、デバッガーウィンドウを表示する必要があります。
エミュレータ-頭の周り
エミュレータの目的は何ですか? もちろん、命令の実行。 また、コンテキストを維持する方法も知っています。 ブレークポイントに関する情報を保持する場合もあります(保持しない場合もあります- デバッガレベルで実装する必要があります )。 また、 エミュレータ自体には実行を一時停止/継続する機能がなく、何らかの方法でそれを実装する必要があります。 一つのことは良いことです-通常、多くのプラットフォーム用のエミュレーターのソースコードはすでに存在しており、多くの場合、タスクのためにわずかに近代化する必要があります。
そのため、 エミュレーターは、 デバッガー自体にイベントの発生について報告します 。
- プロセス/スレッドが開始/終了しました。
- ブレークポイントは機能しました。
- 一歩進んだ。
- 例外がスローされました。
イベント
Stepイベントを分析しましょう :
- IDAで F7キー( ステップイン )を押します。
- デバッガーは、 この前に来た最後のイベントを完了するコマンドを取得します 。 通常、この場合のデバッガーは、 エミュレーターに実行を継続するように指示する必要があります 。
- 次に、 デバッガーは、ストリーム内のステップを実行するコマンドを受け取り、1つのエミュレーター命令を実行することでこれに反応します 。
- エミュレーターは、 STEPイベントが発生したことをデバッガーに報告し、イベントキューに配置します( 以下のイベントキューについて読む )。
- デバッガーは、ディスパッチされたイベントをイベントキューから取得し、 IDAに報告します。
- IDAはイベントに応答します。 この場合、彼はステップが完了したことを認識し、ステップの完了後に起きた現在のEIPアドレスを表示します。
- レジスタなどのステータスが表示されたIDAウィンドウが十分に表示され、さらに何かを実行したい場合(たとえば、 F7を押して別のステップ)、最初の項目へのサイクルが再び発生します。
イベントキュー :
このようなことは、新しいエミュレーターイベントの発生を見越して、別個のデバッガーストリームで絶えず回転しています 。 新しいイベントを受信すると、エミュレーションを一時停止して(ステップがプロセスの凍結を意味するため)、イベントをIDAに転送する必要があります。 イベントが処理されたことをIDAが報告すると、現在のイベントの処理を完了するコマンドがデバッガーに送信されます 。
ご覧のとおり、このトピックは非常に濁っており、それほど単純ではありません。 しかし、一見そうそうです。 次の記事では、 デバッガプラグインの作成を開始し、同時に何をどのように理解するかを説明します。
-参照とプロジェクト:
- IDA Bookは、 IDA Proに関するその種の最高の本です。 ほとんどすべてがあります( まあ、デバッガーを除く )。
持っている必要があります!; - deci3dbgは、2つのパブリックデバッガモジュールの1つです。
PS3のデバッガー。 - idadosは、ひどく曲がったものではありますが、2番目のデバッガーモジュールです( ただし、トピックはほとんど研究されていないため、著者は許されます )。
MS-DOSデバッガー - idados_dosboxは、以前のプロジェクトのフォークです。 少なくとも大丈夫だし、それほど悪くない。
- IDASDK \ plugins \ debuggerは、誰もが開始する場所です。 難しい、理解できない。