int main()
{char* LPFileBuffer = NULL;//接收堆区的指针变量const char* m_fileName = "E:\\c++\\windowspad.exe";//一个char*的指针变量if (!ReadExeFile(m_fileName, LPFileBuffer)){return -1;}}
//接收两个char*变量
OOL ReadExeFile(__in const char* m_fileName,__inout char* LPFileBuffer)
{FILE* file = (fopen(m_fileName, "rb"));LPFileBuffer = (char*)malloc(fileSize);if (LPFileBuffer == NULL){return FALSE;}return TRUE;
}
本意是传 一个文件名,和一个指针变量 ,来接收malloc出来的堆地址.结果 函数执行完毕,还是NULL
查看反汇编, 可以看到 rbp+8 存了一个0值,rbp+28 存了文件名的地址
然后按照X64 函数 参数的入栈约定
下面做了一下改变,如果所示,发现和上面不同点在于 传参时,
上图使用的是 mov rdx,[rbp+8] //这就是所谓的值传递
下图使用的是 lea rdx,[rbp+8] //这就是地址传递
int main() {char* LPFileBuffer = NULL;const char* m_fileName = "E:\\c++\\windowspad.exe";if (!ReadExeFile(m_fileName, &LPFileBuffer))//参数2使用的是取 参数LPFileBuffer的地址{return -1;}
}
其实没有所谓的地址传递,都是值的传递, c语言都是变量的值的传递. 这样我也把LPFileBuffer的地址传过去了,只是不够优雅
int main() {char* LPFileBuffer = NULL;const char* m_fileName = "E:\\c++\\windowspad.exe";double address=&LPFileBuffer;//因为x64平台指针是8字节,所有使用了doblueif (!ReadExeFile(m_fileName,address ))//参数2使用的是取 参数LPFileBuffer的地址{return -1;}
}
来看看函数里面做了什么
BOOL ReadExeFile(__in const char* m_fileName,__inout char** LPFileBuffer)
{FILE* file = (fopen(m_fileName, "rb"));fseek(file, 0, SEEK_END);//到文件尾部DWORD fileSize = ftell(file);//获得文件的大小fseek(file, 0, SEEK_SET);//返回文件头部//申请堆内存空间char* buffer = (char*)malloc(fileSize);memset(buffer, 0, fileSize);//把文件读到申请的内存空间中fread(buffer, 1,fileSize, file);//将文件读取到内存中//修改 LPFileBuffer变量的值*LPFileBuffer = buffer;fclose(file);return TRUE;
}
至此已经修改了main函数中的 指针变量LPFileBuffer 的值.他将保存一块内存空间的首地址
上面没有技术含量,.还定义了一个临时的变量buffer 来中转了一下.用指针了,当然要让别人爽一下才能看懂这个代码
这样能成功吗?
*(void**********)LPFileBuffer =malloc(fileSize);if (*LPFileBuffer == NULL){return FALSE;}memset(*LPFileBuffer, 0, fileSize);fread(*LPFileBuffer, 1, fileSize, file);//将文件读取到内存中
或者这样
********* (void**********)LPFileBuffer =malloc(fileSize);
可以看一下这段代码的反汇编.有点绕了
不玩了