Восстановление из инструкции, которая устанавливает EIP = 00000000 - PullRequest
3 голосов
/ 20 января 2012

Пока возился с каким-то ассемблером x86, я задался вопросом о случаях, когда из-за ошибки было установлено значение EIP 00000000 или другая область памяти, которая не существует. Можно ли отследить эти случаи с помощью SEH или аналогичных механизмов обработки ошибок и восстановить выполнение? (при условии, что стек, куча и регистры не были уничтожены)

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Нет действительно хорошего способа поймать это до того, как это произойдет, но одну вещь, которую вы можете попробовать, - это проверить стек (память на ESP и / или EBP) и проверить наличие указателей на код.

Если инструкция, вызвавшая это, была call, вам повезло - меч в ESP будет адресом возврата, указывающим сразу после нарушителя.

Если это был jmp шансы меньше, но вы все равно можете искать возможные следы выполнения.

Худший случай, когда это вызвано ret с мусором ESP - обычно в этот момент стекполностью фальшивыйВы по-прежнему можете проверять значения других регистров, возможно, один из них будет содержать указатель, который может дать вам некоторые подсказки, и вы сканируете всю область стека для поиска шаблонов кадров стека, как описано в этом посте .

0 голосов
/ 20 января 2012

Ваше наиболее вероятное и, вероятно, самое безопасное "решение" - это снимок состояния процесса, к которому можно безопасно вернуться, используя setjmp / longjmp (или CONTEXT), который хранится где-то уникальным дляпроцесс, но неприкасаемый, такой как FS / GS / ES сегменты, аналогично тому, как хранится PEB.Это позволяет корректно восстанавливать все регистры, не оставляя слишком много возможных дыр.

Конечно, это может привести к ошибкам в чем-то похожем на игру (зависит от того, где именно произошел взрыв), но на что-то вроде текстового процессора илиприложение, в котором незначительная потеря состояния не является серьезной проблемой, оно должно работать нормально (это напоминает мне о старой среде разработки Dev-C ++, которая использовалась для сбоя любого другого файла, но каким-то образом продолжала работать, хотя и заверяла меня в ''фатальное исключение, от которого невозможно было оправиться ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...