Перехват функций под windows

170
17 апреля 2018, 04:17

Доброго вечера! Делал перехват вам по статье http://rsdn.org/article/baseserv/IntercetionAPI.xml 1-м методом. И... Все получилось. Вот только я никак не могу понять принцип, цитирую:

Практика показала, что вместо обычного jmp лучше применять комбинацию push xxxx ret, где xxxx - адрес заменяющей функции

Так вот, как команда push может заменить jmp? Я бы ещё понял call... Но push, она ведь просто ложит значение в стек (в данном случае - адрес функции), но каким образом она запускает эту функцию?

Answer 1

При вызове call выполняется две операции: на стек кладется адрес возврата и происходит переход на процедуру. Т.е. по сути push и jmp.

При возврате (ret) выполняются обратные операции: со стека снимается адрес возврата, и выполняется переход по нему. Т.е. pop и jmp.

Если сделать push, потом ret, то это будет эквивалентно push, потом pop, потом jmp. Т.е. с точки зрения стека push и pop скомпенсируют друг друга (положили на стек, потом снова сняли), и останется просто переход.

Преимущество push и ret от просто jmp может быть в том, что для jmp нужно указывать относительный адрес перехода (его еще нужно вычислить), а ret со стека берет абсолютный адрес, и переходит по нему.

Можно конечно делать косвенный переход по адресу в регистре (например, jmp [eax]), но это может не подойти, если регистры нельзя менять.

В общем, нюансов много, в разных случаях могут быть удобны разные варианты переходов.

Answer 2

Так ведь что делает ret? возвращает управление по адресу, сохраненному в стеке. А push этот адрес и сохраняет.

"По-моему, так" (с) Пух

READ ALSO
Как искать критические секции в сложном и запутанном проекте?

Как искать критические секции в сложном и запутанном проекте?

Пишу многопоточное высоконагруженное клиент-серверное приложение на С++В приложении чётко определены четыре основных потока и так-же во время...

212
Проблема с чтением бинарных данных

Проблема с чтением бинарных данных

Всем приветВозникла проблема при чтении бинарных данных( *

175
Не работает обработчик ошибки 404 в node.js

Не работает обработчик ошибки 404 в node.js

Привет!Я учу nodejs и попутно создаю свой API сервер с MongoAtlas

173