1

x64 コールスタックをアンワインドしたいので、ここで見つけた「UNWIND プロシージャ」に従おうとしています:
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx

RIP がエピローグにある場合、まだ実行する必要がある操作を考慮して RSP のオフセットを計算する必要があることは理解していますが、RIP がエピローグにあるかどうかを確認する方法は不明です (セクション3.a)?
誰かが私にこれを説明できますか?(リンクまたはコード例も大歓迎です)

4

1 に答える 1

2

巻き戻し手順から

RIP がエピローグ内にあるかどうかを判断するために、RIP からのコード ストリームが調べられます。セクション CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAA REF _Ref496092425 \r \h 0 で説明されているように、そのコード ストリームが正当なエピローグの末尾部分と一致する場合、それはエピローグにあり、エピローグの残りの部分はコンテキスト レコードでシミュレートされます。各命令が処理されるたびに更新されます

、およびProlog と Epilogから(理解を深めるために記事全体をお勧めします)

これらは、エピローグの唯一の正当な形式です。これは、add RSP,constant または lea RSP,constant[FPReg] のいずれかで構成され、その後に一連の 0 個以上の 8 バイト レジスタ ポップと return または jmp が続く必要があります。(エピローグでは jmp ステートメントのサブセットのみが許可されます [...])。他のコードは表示できません。特に、戻り値のロードを含め、エピローグ内では何もスケジュールできません。

フレーム ポインターが使用されていない場合、エピローグは add RSP,constant を使用して、スタックの固定部分の割り当てを解除する必要があることに注意してください。代わりに lea RSP,constant[RSP] を使用しない場合があります。この制限が存在するのは、アンワインド コードがエピローグを検索するときに認識するパターンが少ないためです。

コードがそのような状況に陥った場合、現在実行されているコードでそれらの特定の命令をチェックし、一致した場合、それ自体がエピローグにあると見なすようです。

于 2013-05-08T16:28:25.850 に答える