Информация об изменениях

Сообщение Узнать адрес, откуда вызвали от 19.06.2023 3:33

Изменено 19.06.2023 3:35 пффф

Узнать адрес, откуда вызвали
Привет!

Есть ли возможность более или менее легально, без грязных хаков, узнать, откуда вызвали функцию?

Предполагаем, что у нас фон-неймановская архитектура, стек растёт вниз — т.е. обычная винда или линукс на не экзотическом железе.

Я краем уха слышал о способах передачи параметров, как стек организован, и тп, и вот что родилось:

1) При вызове функций компилятор складывает параметры на стек, затем вызывает функцию, при этом на стек помещается адрес возврата, т.е он у нас ниже последнего параметра
2) Все параметры кладутся на стек, расширяясь до int'а, как минимум. Тут не очень понятно, а на x64 как оно происходит, до какого размера расширяется параметр, до 4х байт или до 8им?
3) Если у нас единственный аргумент, то отнимаем 4/8 байт от его адреса, и получаем адрес, где лежит адрес возврата, так?
4) Если у нас несколько параметров, и мы в общем случае не знаем порядок их укладки на стек (stdcall/cdecl), то мы берём адреса крайних параметров и выбираем из них меньший, так?

Тут не понятно, а как быть, если у функции нет параметров? Или функция — какая-нибудь fastcall, которая передаёт первый(ые) параметр(ы) в регистрах? Или, вроде, на x64 никакого fastcall там вроде стандартное соглашение о передаче параметров через регистр. Как быть?

С передачей структур/классов по значению тоже не очень понятно, сколько в итоге они там места на стеке занимать будут.

Что посоветуете?
Узнать адрес, откуда вызвали
Привет!

Есть ли возможность более или менее легально, без грязных хаков, узнать, откуда вызвали функцию?

Предполагаем, что у нас фон-неймановская архитектура, стек растёт вниз — т.е. обычная винда или линукс на не экзотическом железе.

Я краем уха слышал о способах передачи параметров, как стек организован, и тп, и вот что родилось:

1) При вызове функций компилятор складывает параметры на стек, затем вызывает функцию, при этом на стек помещается адрес возврата, т.е он у нас ниже последнего параметра
2) Все параметры кладутся на стек, расширяясь до int'а, как минимум. Тут не очень понятно, а на x64 как оно происходит, до какого размера расширяется параметр, до 4х байт или до 8им?
3) Если у нас единственный аргумент, то отнимаем 4/8 байт от его адреса, и получаем адрес, где лежит адрес возврата, так?
4) Если у нас несколько параметров, и мы в общем случае не знаем порядок их укладки на стек (stdcall/cdecl), то мы берём адреса крайних параметров и выбираем из них меньший, так?

Тут не понятно, а как быть, если у функции нет параметров? Или функция — какая-нибудь fastcall, которая передаёт первый(ые) параметр(ы) в регистрах? Или, вроде, на x64 никакого fastcall для этого специально указывать не надо, там вроде стандартное соглашение о передаче параметров через регистр. Как быть?

С передачей структур/классов по значению тоже не очень понятно, сколько в итоге они там места на стеке занимать будут.

Что посоветуете?