首页
社区
课程
招聘
自己实现GetProcAddress,遇到困难。。。
发表于: 2010-9-26 09:49 3821

自己实现GetProcAddress,遇到困难。。。

2010-9-26 09:49
3821
这是自己实现的代码
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 xuhao;
	}
	
	for (i=0; i<(int)dwNumberOfNames; i++)
	{
		char *strFunction = (char *)(pAddressOfNames[i] + (DWORD)hModule);
		if (strcmp(strFunction, (char *)lpProcName) == 0)
		{
			return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (DWORD)hModule);
		}
	}
	return 0;
	//这个是通过以序号的方式来查函数地址的
xuhao:
	if (dwName < dwBase || dwName > dwBase + pImageExportDirectory->NumberOfFunctions - 1)
	{
		return 0;
	}
	return (pAddressOfFunction[dwName - dwBase] + (DWORD)hModule);
}


偶然测试了一下发现
        DWORD a1 = (DWORD)MyGetProcAddress(LoadLibrary("kernel32.dll"), (LPCSTR)"HeapFree");
        DWORD a2 = (DWORD)GetProcAddress(LoadLibrary("kernel32.dll"), (LPCSTR)"HeapFree");

这个a1和a2根本不相等。
而用ordPE查HeapFree的地址     发现跟我的a1竟然是一致的,请问问题出现在哪???
非常困惑。


解答:http://bbs.pediy.com/showthread.php?p=864115

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 350
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你看看你的MyGetProcAddress返回的地址的内容, 应该是NTDLL.RtlFreeHeap
再递归一次就好了.
2010-9-26 11:08
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
返回的是 "NTDLL.RtlFreeHeap" 这个字符串的首地址
关键是为什么要递归?  何时递归何时不递归??
2010-9-26 11:09
0
雪    币: 350
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
先检查一下找到的函数地址在不在这个范围里

pImageExportDirectory < func < pImageExportDirectory + pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size

是的话就在NTDLL里找RtlFreeHeap

话说你为什么要"无符号比较"呢?
2010-9-26 11:26
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=Diabloking;863423]先检查一下找到的函数地址在不在这个范围里

pImageExportDirectory < func < pImageExportDirectory + pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT...[/QUOTE]

其实strcmp就ok   我不知道当时怎么就想成是无符号比较了呢

ps 你上面说的那个什么范围  我不懂什么意思耶。。。
2010-9-26 14:43
0
游客
登录 | 注册 方可回帖
返回
//