程序集:返回__p___argv值



我只是在盯着学习装配和逆向工程。我知道这是一个非常基本的问题,但我仍然不能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() 的变量。

相关内容

  • 没有找到相关文章