2

構造体がmallocされると、その構造体の大きさは明らかです。ただし、256バイトの構造体に対して64個のダミーdwordフィールドを宣言するのは非常に面倒です。要素に個別に名前を付けることはできないため、構造体に固定サイズの配列を宣言してもあまり役に立ちません。現在、フィールドを追加するためにAutoHotKeyスクリプトを使用していますが、何らかの理由で今日は機能しなくなりました。

だから:構造体宣言に一度に複数のフィールドを追加する方法はありますか?多分いくつかのidcapiを介して?

4

2 に答える 2

5

私がいつも使用しているIDAでこれを行うには、巧妙ですが直感的ではないトリックがあります。配列を定義しますが、配列ダイアログで[配列として作成]チェックボックスをオフにします。これは、構造体に必要な数の要素を作成しますが、それらから配列を作成することはありません。

ワークフローは次のとおりです。

  • 要素のリストが必要なオフセットに、必要なタイプの単一の要素(dwordなど)を作成します。(サイズがわかっているが、内部構造については何も知らない空の構造体を作成している場合、これは多くの場合ゼロになります)。
  • 作成した要素にカーソルを合わせて*キーを押します。
  • 配列ダイアログに必要な要素の数を入力します。
  • ダイアログボックスの左下にある[配列として作成]チェックボックスのチェックを外します。
  • OKを押します。

IDAは、必要な数の要素を作成しますが、配列としては作成しません。すべてが何であるかを学ぶときに、後で何かを再入力する必要があるかもしれませんが、これはあなたに最初から良いスケルトンを与えます。

于 2018-01-06T21:01:38.523 に答える
4

2つの解決策を紹介します。状況によっては、最初のものはあなたが望むものと正確に一致しない場合があります。よろしければ、どちらの方法でも詳しく説明できます。

安価な方法:フィラー配列を使用する

構造が大きく、目的やサイズがわかっているメンバーが少ない場合は、一時的なダミー配列を作成して構造のギャップを埋めると便利なことがよくあります。これにより、構造体の定義がIDAで読みやすく、保守しやすくなります。また、必要以上のメンバーを定義しなくても、構造体を特定のサイズに整形できます。

サイズが0x400バイトであることがわかっている構造体があり、オフセット+0x0および+0x384でのメンバーの定義を知っているとします。また、+0x4と+0x6に単語があることは知っているが、それらが何を表しているのかまだわからないとします。次に、構造を次のように定義します。

00000000 MY_STRUCT       struc ; (sizeof=0x400)
00000000 ProcessID       dd
00000004 field_4         dw
00000006 field_6         dw
00000008 __filler1       db 892 dup(?)
00000384 ProcessObject   dd ?
00000388 __filler2       db 116 dup(?)
000003FC __filler3       dd ?
00000400 MY_STRUCT       ends

__fillerXこれは、要素がない場合よりもはるかに読みやすくなります。また、構造体のすべてのメンバーが実際にqwordsであるかどうかを事前に知る方法がないため、これは間違いなくより正確です。

一番下にある理由__filler3は、の領域で要素を定義したい場合、構造の全体的なサイズを縮小することなく、__filler2ワイプ__filler2(および後でそのスペースに新しいフィラーメンバーを追加)できるためです。実際、構造体の定義時にサイズだけがわかっている場合は、最終的な要素を定義することがおそらく最初に行う必要があります。そうすれば、フィラー配列のサイズを自分で把握する必要はありません。IDAが提供するデフォルトの配列サイズは常に正しいものになります。これをすばやく行うために、私は通常、サイズN-4の配列を作成し、最後にdwordを追加します。

しかし、私は実際に32のqwordsが欲しいです!

これが役立つ実際的な状況は考えられませんが、多分あなたはそうすることができます!

いずれの場合も、実際には、IDAAPIを介してこれを行うことができます。AddStrucEx必要な関数はとですAddStrucMember。IDAヘルプドキュメントから必要な情報のほとんどを取得できるはずです。

IDCスクリプトの実用的な例で構造を生成する場合は、自分で構造を生成できます。いくつかの構造を作成してから、に移動しFile > Produce File > Dump typeinfo to IDC file...ます。

または、これも機能するはずです(IDAPythonを使用):

id = AddStrucEx(-1, "EXAMPLE_STRUCT", 0)
for i in xrange(0,256,8):
    AddStrucMember(id, "field_%x"%i, i, FF_DATA|FF_QWRD, -1, 8)
于 2013-03-10T19:25:36.737 に答える