我正开始学习组装和逆向工程。我知道这是一个非常基本的问题,但我仍然不能 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);
在这两种情况下,函数都会返回一个指向包含 eax/rax 中 argv
数组地址(即第一个元素的地址)的位置的指针>.
用户传递的第一个参数始终是argv[1],该参数的地址存储在argv
数组的第二个元素中。因此,您必须首先取消引用 eax/rax
,然后向结果地址添加 4/8 字节,以获取用户传递的第一个参数的地址。
您也可以使用__argv
,它是一个相当于*__p___argv()
的变量。
关于汇编:__p___argv 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54655387/