Сборка: возвращаемое значение __p___argv - PullRequest
0 голосов
/ 12 февраля 2019

Я только начинаю изучать сборку и реверс-инжиниринг.Я знаю, что это очень простой вопрос, но все же я не на 100% уверен, что получил правильный ответ.__p___argv возвращает аргументы, переданные программе и сохраняет возвращаемое значение в eax.
Мой вопрос относится к коду:

call    __p___argv
mov     edi, [eax]
  • Как я понял, eax будет содержатьадрес памяти argv[0], это правильно?
  • argv[0] на самом деле не первый параметр, передаваемый пользователем, а что-то еще, и параметры, передаваемые пользователем, начинаются с argv[1]?
  • Поскольку [eax] будет обращаться к памяти в месте, указанном в eax, значение argv[0] перемещается в edi?

1 Ответ

0 голосов
/ 12 февраля 2019

В VC ++ __p___argv объявляется следующим образом:

__declspec(dllimport) char***    __cdecl __p___argv (void);

В MinGW __p___argv объявляется следующим образом:

extern char***   __p___argv(void);

В обоих случаях функция возвращаетуказатель на местоположение, которое содержит адрес массива argv (т. е. адрес первого элемента) в eax/rax.

Первый параметр, передаваемый пользователем, всегда равен argv [1] иадрес этого параметра хранится во втором элементе массива argv.Таким образом, вам придется сначала разыменовать eax/rax, а затем добавить 4/8 байтов к результирующему адресу, чтобы получить адрес первого параметра, переданного пользователем.

Вы также можете использовать __argv,которая является переменной, эквивалентной *__p___argv().

...