Ida Proの誤ったケースジャンプテーブルを修正する方法はありますか?


3

私は2つの異なる場所に、インデックス付き間接ジャンプで、その結果、switchステートメントを使用しているようだ機能を分解しています(同じ機能!):

0005FA58     mov  al, [eax+112h] 
0005FA5E     cmp  al, 4 
0005FA60     ja  loc_5FBED 
0005FA66     and  eax, 0FFh 
0005FA6B     jmp  cs:off_5F98C[eax*4] 
0005FA73 


00060011     mov  al, byte ptr unk_A4E30[eax] 
00060017     cmp  al, 3 
00060019     ja  short loc_60053 
0006001B     and  eax, 0FFh 
00060020     jmp  cs:off_5F9A0[eax*4] 

0005F98C off_5F98C  dd offset loc_5FBCC, offset loc_5FA73, offset loc_5FAC5, offset loc_5FB14, offset loc_5FB66 
0005F98C           ; DATA XREF: FunctionStart+BB 
0005F9A0 off_5F9A0  dd offset loc_60049, offset loc_6003E, offset loc_60031, offset loc_60028 
0005F9A0           ; DATA XREF: FunctionStart+670 

最初のジャンプテーブルが5つのエントリ、秒を持っています残念なことに、コンパイラはそれらをメモリ内で互いに背後に置いていました。これらのノードのためのグラフの接続を計算するときにこれはIDAを混乱させるかもしれません:

Graph for 1st jump table

編集、質問の文言は、おそらく

を誤解されたようなグラフのノードが9つの発信接続を示しています。それらのうち5つは真の接続であり、次の4つはそうではありません - メモリ内のこのジャンプの直後に起こる別のジャンプテーブルに属します。私はIDAに "このジャンプテーブルには5つの有効なエントリがあり、グラフノードを作成するときは他のエントリは無視してください"と伝えたいと思います。これを行う方法はありますか?

元の質問は:

最初のジャンプテーブルは そのステートメントに属さない4そのうち9つの接続を持っています。 (ここでは簡潔にするためにここには記されていませんが、1つの接続しかありません)。最初のテーブルから余分な 接続を削除し、2番目のテーブルから対応するターゲットに新しい接続 を作成するようIDAに指示する方法はありますか?

私はすでに、ジャンプテーブルを配列として定義してから、関数を定義解除してコードとして再定義しましたが、何も変更されませんでした。

(私はIDA 5.0を使用しています。これはホビープロジェクトなので、年に何回か使用することに何百ドルも費やしたくありません)。

5

それは可能だが、いないフリーウェア版で:

  1. jmp
  2. の上にカーソルを置き
  3. 編集 - >その他 - >
  0

私が聞きたいと思ったものではありませんが、おそらく私が得る最高の答えです。 16 4月. 142014-04-16 12:09:48


3

私は私はあなたの問題を理解している場合、非常にわからないんだけど、私はジャンプテーブルを設定する方法である:

  1. は、テーブル全体がバイト、非配列、1行に1つのバイトをDBへ変換します。
  2. 先頭の要素を2バイト(dw)に設定し、次にに設定します。
  3. 先頭の要素から最後の要素まで強調表示し、配列(*)として設定しますが、配列のチェックボックスはオフにします。
  4. 最初のテーブルの直後に2番目のテーブルがある場合は、同じことをします。

編集: 私は少しあまりにも長ったらしいしてきました。私が必要と思うのは、ジャンプを行ごとに1つに分けることです。配列コマンド{*}を使用して行い、すべてのチェックボックスをオフにします。グラフビューでの私の経験は、ジャンプテーブルの設定方法にかかわらず、ジャンプテーブルの処理方法を知らないということです。

  0

申し訳ありませんが、私は私の推測...スイッチイディオムを指定します質問は誤解を招く(「最初の*テーブルから余分な接続を削除する」)。私の問題は、グラフノードには9つの発信接続があり、5つしかないため、リンクの一部が間違っていて、グラフがもっと複​​雑であることです。私は何とかIDAに "最後の4つのジャンプテーブルに属しているため、このジャンプテーブルには5つのエントリがあります(9つのように見えます)"と伝えたいと思います。残念ながら、あなたの "どのようにジャンプテーブルを処理するか分からない"ということは、おそらく不可能だということです。 15 4月. 142014-04-15 17:42:33

  0

私はそれについて間違っているかもしれませんが、グラフビューはジャンプテーブルによって壊れてしまったので、決して追い抜かなかったと思います。ジャンプテーブルの一部がある関数(proc)内にあり、別の関数(proc)内にあることをIDAに伝えなければならないようです。 15 4月. 142014-04-15 20:29:00