Как аргументы загружаются в $ esp? - PullRequest
1 голос
/ 13 мая 2011

Допустим, у меня есть два аргумента, arg1 и arg2, и функция, которую я хочу вызвать. Если я загружу arg1 в $ esp + 4 и arg2 в $ esp, что я буду делать:

func(arg1, arg2)

или

func(arg2, arg1)

Я использую IA32.

Ответы [ 4 ]

4 голосов
/ 13 мая 2011

Эта - чрезвычайно полезная статья, которая очень хорошо объясняет стек приложений.

4 голосов
/ 13 мая 2011

О, черт возьми, я отвечаю своим любимым способом!

Это зависит!

Это зависит от используемого вами механизма вызова.Взгляните на x86 соглашения о вызовах и удивитесь.

Однако обратите внимание, что в наиболее распространенных по умолчанию параметрах функции cdecl помещаются в стек в порядке справа налево,Фактически, они также помещаются справа налево в stdcall, который использует Windows.

Теперь, чтобы выяснить, каким образом esp+x идет в порядке следования функций.Стек увеличивается от верхнего конца адресного пространства вниз, и упорядочение справа налево подразумевает, что самый правый объект сначала попадает в стек, поэтому самые правые аргументы имеют более высокие адреса памяти.Таким образом, когда вы добавляете в esp или любой другой регистр отслеживание самого низкого (с точки зрения адреса памяти) аргумента в стеке, вы перемещаетесь по аргументам справа налево.

Я хочу добавить, что ebpимеет тенденцию быть базовым указателем, а esp перемещается, чтобы обеспечить локальное хранение переменных в соответствии с этим описанием пролога функции .

1 голос
/ 13 мая 2011

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

1 голос
/ 13 мая 2011

f (arg2, arg1)

Размер стека уменьшается, а аргументы выкладываются в виде массива, в частности такого, что первый аргумент (то, что в вашем примере называется arg2 * 1004)*) находится в одном и том же месте независимо от количества аргументов в вызове.

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

Платформа, теоретически, могла бы делать это по-другому, но это не относится к любому крупному случаю.

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