首页
社区
课程
招聘
[原创]自己实现的GetProcAddress
发表于: 2009-6-3 20:45 5499

[原创]自己实现的GetProcAddress

2009-6-3 20:45
5499
今天学习了PE的导出表,写了一个GetProcAddress来做练习,发出来跟大家分享

DWORD GetProcAddress(HMODULE hModule, PCSTR pProcName)
{
        if(hModule == NULL || pProcName == NULL)
        {
                return 0;
        }

        // 验证hModule是否有效
        PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
       
        if(pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
        {
                return 0;
        }

        PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PBYTE)hModule + pDosHeader->e_lfanew);

        if(pNtHeaders->Signature != IMAGE_NT_SIGNATURE)
        {
                return 0;
        }

        // 判断导出表是否存在
        IMAGE_DATA_DIRECTORY DataDirectory = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
        if(DataDirectory.VirtualAddress == 0 || DataDirectory.Size == 0)
        {
                return 0;
        }

        IMAGE_EXPORT_DIRECTORY* pExportDirectory = (IMAGE_EXPORT_DIRECTORY*)((PBYTE)hModule + DataDirectory.VirtualAddress);

        PDWORD pAddressOfNames = (PDWORD)((PBYTE)hModule + pExportDirectory->AddressOfNames);
        PWORD pAddressOfNameOrdinals = (PWORD)((PBYTE)hModule + pExportDirectory->AddressOfNameOrdinals);
        PDWORD pAddressOfFunctions = (PDWORD)((PBYTE)hModule + pExportDirectory->AddressOfFunctions);

        if((DWORD)pProcName <= 0xFFFF)
        {
                // 按索引查找函数地址
                DWORD nIndex = (DWORD)pProcName - pExportDirectory->Base;
                if(nIndex >= pExportDirectory->NumberOfFunctions)
                {
                        return 0;
                }

                return pAddressOfFunctions[nIndex];
        }
        else
        {
                // 按函数名查找函数地址
                for(unsigned i = 0; i < pExportDirectory->NumberOfNames; i++)
                {
                        PCTSTR pszName = (PCSTR)((PBYTE)hModule + pAddressOfNames[i]);
                        WORD nIndex = pAddressOfNameOrdinals[i];

                        if(strcmp(pProcName, pszName) == 0)
                        {
                                return pAddressOfFunctions[nIndex];
                        }
                }
        }

        return 0;
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
把那几个结构体和数组的结构弄清楚了,就很清楚了。

有的壳就是自己实现了GetProcAddress的。
2009-6-3 21:30
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
其实这个是有问题的
不信自己测试一下
        DWORD a1 = (DWORD)_GetProcAddress(LoadLibrary("kernel32.dll"), (LPCSTR)0x209);
        DWORD a2 = (DWORD)GetProcAddress(LoadLibrary("kernel32.dll"), (LPCSTR)0x209);

看看一样么?
2010-9-26 09:44
0
游客
登录 | 注册 方可回帖
返回
//