GetSegmentAttr を使用して現在のセグメントの開始と終了を取得し、現在のセグメントの終了が次のセグメントの開始であると仮定する単純なループを作成しようとしましたが、この仮定は誤りでした。いくつかのセグメントでは機能しましたが、セグメント間にギャップがある可能性があることがわかりました。
それで、私が疑問に思っているのは、見つかったすべてのセグメントを確実に反復する方法ですか?
GetSegmentAttr を使用して現在のセグメントの開始と終了を取得し、現在のセグメントの終了が次のセグメントの開始であると仮定する単純なループを作成しようとしましたが、この仮定は誤りでした。いくつかのセグメントでは機能しましたが、セグメント間にギャップがある可能性があることがわかりました。
それで、私が疑問に思っているのは、見つかったすべてのセグメントを確実に反復する方法ですか?
次の結果を反復処理できますidautils.Segments()
。
for seg in idautils.Segments():
# ...
FirstSeg() と NextSeg() を次のように使用します
#include <idc.idc>
static main() {
auto seg;
auto start;
auto end;
seg = FirstSeg();
while(seg != BADADDR)
{
start = SegStart(seg);
end = SegEnd(seg);
Message("Seg: %a Start: %a End: %a\n", seg, start, end);
// do looping here
seg = NextSeg(seg);
}
}
次に、変数を「開始」から「終了」を含むまでループします
私の現在のプロジェクトでは、上記は次のようになります。
Seg: ROM:00000000 Start: ROM:00000000 End: ROM2:00880000
Seg: ROM2:00880000 Start: ROM2:00880000 End: 0:009FFFFF
Seg: CHIP:40000000 Start: CHIP:40000000 End: 0:4004FFFF
Seg: CHIP:40050000 Start: CHIP:40050000 End: 0:4005FFFF
Seg: CHIP:40070000 Start: CHIP:40070000 End: 0:4007FFFF
Seg: CHIP:40130000 Start: CHIP:40130000 End: 0:4013FFFF
Seg: CHIP:40180000 Start: CHIP:40180000 End: 0:4018FFFF
Seg: CHIP:401D0000 Start: CHIP:401D0000 End: 0:401DFFFF
Seg: CHIP:50000000 Start: CHIP:50000000 End: 0:5001FFFF
Seg: s6800:68000000 Start: s6800:68000000 End: 0:6800FFFF
Seg: CHIP:6F000000 Start: CHIP:6F000000 End: 0:6F00FFFF
Seg: RAM:8F800000 Start: RAM:8F800000 End: 0:8F9FFFFF
Seg: RAM:8FB00000 Start: RAM:8FB00000 End: 0:8FFFFFFF
Seg: RAM:CD000000 Start: RAM:CD000000 End: 0:CEFFFFFF