#include "stdafx.h" #include <windows.h> #include <iostream> int main() { typedef int(WINAPI *pMsgBoxFunType) (HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); unsigned char funAddr[100] = {}; memcpy(funAddr,&MessageBox,sizeof(&MessageBox)); pMsgBoxFunType pMsgBox = (pMsgBoxFunType)((void *)(funAddr)); (*pMsgBox)(nullptr, L"", L"", MB_OK); getchar(); return 0; }
程序运行崩溃,求原因?
解决方案
15
1) sizeof 不能用于取得“函数”的大小
2) 函数不是对象,不能拷贝(或 memcpy)
直接用
pMsgBoxFunType pMsgBox = &MessageBox
不好嘛 …
20
memcpy(funAddr,&MessageBox,sizeof(&MessageBox)); pMsgBoxFunType pMsgBox = (pMsgBoxFunType)((void *)(funAddr));
1、funAddr 存的不是MessageBox函数的地址
2、pMsgBox存的是funAddr数组的地址,不是MessageBox的地址
5
memcpy 的,通常是是函数开头4个或8 个字节的代码数据(也就是指令)
而不是 MessageBox这个函数的地址
必须经过一次赋值,或初始化给指针,才能够使用memcpy 复制函数地址
原因是 无论MessageBox,还是&MessageBox
都不是一个现实存在的指针变量,而是解析为一个地址常量(函数的地址),
里面存放的是函数编译后的二进制指令
的开头几个个字节,通常是
push ebp,
mov ebp,esp 之类的指令的二进制编码
因此复制出来的是一个指针长度的,几个字节的指令代码本身。不是全部哦
而不是 MessageBox这个函数的地址
必须经过一次赋值,或初始化给指针,才能够使用memcpy 复制函数地址
原因是 无论MessageBox,还是&MessageBox
都不是一个现实存在的指针变量,而是解析为一个地址常量(函数的地址),
里面存放的是函数编译后的二进制指令
的开头几个个字节,通常是
push ebp,
mov ebp,esp 之类的指令的二进制编码
因此复制出来的是一个指针长度的,几个字节的指令代码本身。不是全部哦