我只是在盯着学习装配和逆向工程。我知道这是一个非常基本的问题,但我仍然不能100%确定我是否得到了正确的答案。 __p___argv
返回传递给程序的参数,并将返回值存储在 eax
中。
我的问题与代码有关:
call __p___argv
mov edi, [eax]
- 据我了解
eax
将包含argv[0]
的内存地址,这是正确的吗? -
argv[0]
实际上不是用户传递的第一个参数,而是其他参数,用户传递的参数从argv[1]
开始? - 由于
[eax]
将在eax
中指定的位置访问内存,因此argv[0]
的值被移动到edi
?
在 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()
的变量。