構造体がmallocされると、その構造体の大きさは明らかです。ただし、256バイトの構造体に対して64個のダミーdwordフィールドを宣言するのは非常に面倒です。要素に個別に名前を付けることはできないため、構造体に固定サイズの配列を宣言してもあまり役に立ちません。現在、フィールドを追加するためにAutoHotKeyスクリプトを使用していますが、何らかの理由で今日は機能しなくなりました。
だから:構造体宣言に一度に複数のフィールドを追加する方法はありますか?多分いくつかのidcapiを介して?
構造体がmallocされると、その構造体の大きさは明らかです。ただし、256バイトの構造体に対して64個のダミーdwordフィールドを宣言するのは非常に面倒です。要素に個別に名前を付けることはできないため、構造体に固定サイズの配列を宣言してもあまり役に立ちません。現在、フィールドを追加するためにAutoHotKeyスクリプトを使用していますが、何らかの理由で今日は機能しなくなりました。
だから:構造体宣言に一度に複数のフィールドを追加する方法はありますか?多分いくつかのidcapiを介して?
私がいつも使用しているIDAでこれを行うには、巧妙ですが直感的ではないトリックがあります。配列を定義しますが、配列ダイアログで[配列として作成]チェックボックスをオフにします。これは、構造体に必要な数の要素を作成しますが、それらから配列を作成することはありません。
ワークフローは次のとおりです。
IDAは、必要な数の要素を作成しますが、配列としては作成しません。すべてが何であるかを学ぶときに、後で何かを再入力する必要があるかもしれませんが、これはあなたに最初から良いスケルトンを与えます。
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を追加します。
これが役立つ実際的な状況は考えられませんが、多分あなたはそうすることができます!
いずれの場合も、実際には、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)