いくつかのx86 asmを使いこなしている間に、バグによってEIPが00000000
、または存在しない別のメモリ位置に設定されたケースについて疑問に思っています。 SEHまたは同様のエラー処理メカニズムを使用してこれらのケースをキャッチし、実行を回復することは可能ですか?EIP = 00000000に設定された復旧
答えて
これが起こる前にこれをキャッチする方法はありませんが、スタック(メモリはESP
および/またはEBP
)を調べることができます。コードへのポインタを確認してください。
これが原因の命令がcall
だった場合は、ESP
のdwordが違反者の直後を指す戻りアドレスになります。
jmp
の場合は、よりスリムである可能性がありますが、引き続き実行可能なトレースを探すことができます。
ごみがret
でゴミ箱ESP
である場合、最悪の場合があります。通常、この時点でスタックは完全に偽です。他のレジスタの値をチェックすることはできますが、そのうちの1つに手がかりを与えるポインタが含まれていて、in this postのようにスタックフレーム全体のスタック領域をスキャンすることができます。どこかのプロセスに固有の、しかし、アンタッチャブル保存されている
スタック内の最後の呼び出し元アドレスに戻った場合、おそらくすべてが破損する可能性があります、またはスタック割り当てのために実際のリターンアドレスの前にアドレスを持っている)、または潜在的なコードを悪夢に挿入する... – Necrolis
あなたの最も可能性の高い、そしておそらく最も安全な、「溶液」setjmp
/longjmp
(またはCONTEXT
)を使用して、に戻っても安全であるプロセス状態のスナップショットです、 PEBがどのように格納されるかと同様に、FS
/GS
/ES
セグメントのようなセグメントである。これにより、あまりに多くの可能性のある穴を残すことなく、すべてのレジスタを正しく復元することができます。
もちろん、これはゲームのようなもの(正確にどこが爆発するかによって異なります)でも、ワープロやマイナーな状態の損失が大きな問題ではないアプリの場合はうまくいくはずです他のすべてのファイルをクラッシュさせていた古いDev-C++ IDEを思い出させますが、復旧できない「致命的な」例外を私に保証していましたが...。
- 1. 削除されたビルド定義を復旧する方法
- 2. Gmailで復旧用メールアドレスをプログラムで設定または読む
- 3. コード化されたPHPコードを復旧/復号化
- 4. 例外復旧後の復旧
- 5. Windowsのアップデート後にIEの設定を復旧する方法
- 6. 壊れたデータベースを復旧するMongoDb
- 7. 削除されたDjango移行を復旧しました
- 8. セッション復旧時にVim、NERDtreeが復旧しない
- 9. Tomcatデータソース復旧
- 10. バイナリツリーの復旧
- 11. オーケストレーションされたデプロイメントの障害からの復旧
- 12. 削除された変更セットを復旧する方法
- 13. InnoDBデータベースの復旧
- 14. mongodbデータベース復旧スクリプト
- 15. #00000000
- 16. Apache Camel - JVMクラッシュから復旧する
- 17. スマートフォンにインストールされているプロジェクトを復旧する方法
- 18. git rebaseから復旧しました
- 19. 壊れたXamppからSQLテーブルを復旧するには
- 20. postgreSQL rake db:セットアップ復帰バックデータ復旧
- 21. WindbgのショートカットでEIPをソースの行に設定する
- 22. Xcodeで自動生成されたプロビジョニングプロファイルを復旧しました
- 23. 春バッチ - エラー後の復旧
- 24. カスタムポストタイプデータを復旧する
- 25. オラクルクラスタノードを復旧します
- 26. MassTransit with RabbitMQ:エラーキューの復旧
- 27. ホストクラッシュ後のVVVの復旧
- 28. サンドボックスからのデータ復旧
- 29. 復旧可能クラスFbdエラー
- 30. AWSアカウントの復旧方法
このような状況で「実行を回復する」方法を知っていますか?私は起こりうるスタック破損シナリオから回復できる信頼できる行動を想像することはできません。 – Zuljin
EIPが0のときにスタックが壊れていないと仮定することはできません。なぜなら、スタックの戻りアドレスの破損は、間違ったEIP値を引き起こす最も一般的な問題であるからです。 – Zuljin
実際、私が考えていたケースはポインタへの条件付きジャンプでした。 'je [eax]'。 – Polynomial