自己实现GetProcAddress


DWORD MyGetProcAddress(  
					   HMODULE hModule,    // handle to DLL module  
					   LPCSTR lpProcName   // function name  
					   )  
{  

	int i=0;  
	PIMAGE_DOS_HEADER pImageDosHeader = NULL;  
	PIMAGE_NT_HEADERS pImageNtHeader = NULL;  
	PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = NULL;  

	pImageDosHeader=(PIMAGE_DOS_HEADER)hModule;  
	pImageNtHeader=(PIMAGE_NT_HEADERS)((DWORD)hModule+pImageDosHeader->e_lfanew);  
	pImageExportDirectory=(PIMAGE_EXPORT_DIRECTORY)((DWORD)hModule+pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);  

	DWORD *pAddressOfFunction = (DWORD*)(pImageExportDirectory->AddressOfFunctions + (DWORD)hModule);  
	DWORD *pAddressOfNames = (DWORD*)(pImageExportDirectory->AddressOfNames + (DWORD)hModule);  
	DWORD dwNumberOfNames = (DWORD)(pImageExportDirectory->NumberOfNames);  
	DWORD dwBase = (DWORD)(pImageExportDirectory->Base);  

	WORD *pAddressOfNameOrdinals = (WORD*)(pImageExportDirectory->AddressOfNameOrdinals + (DWORD)hModule);  

	// 函数名称 or 函数序号   
	DWORD dwName = (DWORD)lpProcName;  
	if ((dwName & 0xFFFF0000) == 0)  
	{  
		goto Ordinal;  
	}  
	for (i=0; i<(int)dwNumberOfNames; i++)  
	{  
		char *strFunction = (char *)(pAddressOfNames[i] + (DWORD)hModule);  
		if (lstrcmp(lpProcName, strFunction) == 0)  
		{  
			return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (DWORD)hModule);  
		}  
	}  
	return 0;  

	// 以序号的方式查函数地址  
Ordinal:  
	if (dwName < dwBase || dwName > dwBase + pImageExportDirectory->NumberOfFunctions - 1)  
	{  
		return 0;  
	}  
	return (pAddressOfFunction[dwName - dwBase] + (DWORD)hModule);  
}  

void main()
{
	// 函数名
	DWORD dw1 = MyGetProcAddress(LoadLibrary("user32.dll"), "MessageBoxA"); 
	DWORD dw2 = (DWORD)GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxA");  

	// 序号
	DWORD dw3 = MyGetProcAddress(LoadLibrary("user32.dll"), (LPCSTR)0x110);  
	DWORD dw4 = (DWORD)GetProcAddress(LoadLibrary("user32.dll"), (LPCSTR)0x110); 
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值