【疑问】使用GetProcAddress 获取到的函数地址是函数真正的入口地址吗?
疑问:在动态加载DLL,使用其中导出的函数时,我们常会用GetProcAddress获取DLL中函数的地址。我有个疑问,这里获取到的函数地址是函数真正的入口地址吗?如果不是这个地址是什么呢?
我做了一个测试,貌似可以证明这个地址不是真正的函数入口地址,那这个地址与真正的函数的入口地址有什么关系呢?
//在下面的实验中,我先获取到MessageBoxA的地址,然后修改这个地址指向内存处的前6个字节为:
//"jmp dword ptr[MessageBox的入口地址]"
//这样下MessageBox调用就陷入死循环中。
//在另一个程序中再次调用MessageBox函数,发现调用是正常的。说明上面的修改仅对当前进程有效。
#include <windows.h>
int main()
{
HANDLE hDll=NULL;
void * pAddr=NULL;
unsigned int uiAddr=0;
DWORD lpflOldProtect;
hDll=LoadLibrary("user32.dll");
pAddr=GetProcAddress(hDll,"MessageBoxA");
uiAddr=(unsigned int)pAddr;
if(VirtualProtect(pAddr,100,PAGE_EXECUTE_READWRITE,&lpflOldProtect))
{
//将MessageBox入口的6个字节修改为指令:
//jmp dword ptr[MessageBoxA的入口地址]
(unsigned char)*((unsigned char*)pAddr)=0xff;
((unsigned char*)pAddr)++;
(unsigned char)*((unsigned char*)pAddr)=0x25;
((unsigned char*)pAddr)++;
(unsigned int)*((unsigned int *)pAddr)=(unsigned int)&uiAddr;
MessageBox(0,"test","test",MB_OK);
}
return 0;
}