Инструкция call
не просто меняет eip
- она также должна записать текущий eip
(обновленный, чтобы указывать на следующую инструкцию) в стек до этого изменения.Инструкция типа jmp
будет действовать так, как вы предлагаете, но call
немного отличается тем, что вы должны иметь возможность ret
к текущему местоположению позже.
Я не могу быть уверен, так какВы не дали нам код, полное содержимое регистра и таблицы страниц (что будет большим объемом информации для вопроса), но мне кажется, что наиболее вероятным объяснением является то, что стек в настоящее время переключаетсяи должен быть выкуплен обратно.
Другая возможность, о которой я изначально думал, это то, что адрес, по которому вы переходили, был нерезидентным, но я не думаю, что это вызвало бы ошибку в call
сам по себе.
Это будет вызывать ошибку очень быстро после этого, поскольку процессор попытался получить следующую инструкцию, но я не думаю, что это то, что указано в вашем описании, поскольку:
- вы заявляете, что это происходит на
call
;и - , который будет ошибкой чтения, а не записью.
Значения esi
и edi
не являются проблемой - они не принимают участия в call
.