【问题标题】:Assembly: return value of __p___argv汇编:__p___argv 的返回值
【发布时间】:2019-02-12 17:15:32
【问题描述】:

我只是盯着学习组装和逆向工程。我知道这是一个非常基本的问题,但我仍然不能 100% 确定我是否得到了正确的答案。 __p___argv返回传递给程序的参数并将返回值存储在eax中。
我的问题与代码有关:

call    __p___argv
mov     edi, [eax]
  • 据我了解eax 将包含argv[0] 的内存地址,这是正确的吗?
  • argv[0]其实不是用户传递的第一个参数而是别的什么,用户传递的参数是从argv[1]开始的?
  • 由于[eax] 将访问eax 中指定位置的内存,所以argv[0] 的值被移动到edi

【问题讨论】:

  • 您的所有问题都取决于调用__p___argv 在您的平台上所做的事情。据我所知,这不是标准功能,因此您必须参考任何可用的文档。否则,您必须通过检查您怀疑它返回的内存地址来推断实际返回的类型是什么。

标签: assembly visual-c++ x86 argv calling-convention


【解决方案1】:

在 VC++ 中,__p___argv 声明如下:

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

在 MinGW 中,__p___argv 声明如下:

extern char***   __p___argv(void);

在这两种情况下,函数都会返回一个指向位置的指针,该位置包含eax/rax 中的argv 数组的地址(即第一个元素的地址)。

用户传递的第一个参数总是argv[1],这个参数的地址存储在argv数组的第二个元素中。所以你必须先取消引用eax/rax,然后在结果地址上加上4/8字节,才能得到用户传递的第一个参数的地址。

您也可以使用__argv,这是一个等效于*__p___argv() 的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多