首页
社区
课程
招聘
[原创]又一次写GetProcAddress函数
发表于: 2007-7-4 14:05 6543

[原创]又一次写GetProcAddress函数

2007-7-4 14:05
6543

函数名是想起了以前看过的哪个大牛的文章想到的.这两天把PeCancer的IAT处理部分代码重新写过了,从代码里提取出了这个函数,实际壳中函数比这个复杂,不过都是用于壳完成功能所以去掉了.
大家共同学习,也希望能帮找找bug
DWORD GetFunctionAddress( HMODULE phModule,char* pProcName )
{
        if (!phModule)
                return        0;
        PIMAGE_DOS_HEADER        pimDH        =        (PIMAGE_DOS_HEADER)phModule;
        PIMAGE_NT_HEADERS        pimNH        =        (PIMAGE_NT_HEADERS)((char*)phModule+pimDH->e_lfanew);
        PIMAGE_EXPORT_DIRECTORY        pimED        =        (PIMAGE_EXPORT_DIRECTORY)((DWORD)phModule+pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
        DWORD        pExportSize        =        pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
        DWORD        pResult        =        0;

       
        if ((DWORD)pProcName < 0x10000)
        {
                if ((DWORD)pProcName        >=        pimED->NumberOfFunctions+pimED->Base || (DWORD)pProcName < pimED->Base)
                        return        0;
                pResult        =        (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[(DWORD)pProcName-pimED->Base];
        }else
        {
                DWORD*        pAddressOfNames        =        (DWORD*)((DWORD)phModule+pimED->AddressOfNames);
                for (int i=0;i<pimED->NumberOfNames;i++)
                {
                        char*        pExportName        =        (char*)(pAddressOfNames[i]+(DWORD)phModule);
                        if (strcmp(pProcName,pExportName) == 0)
                        {
                                WORD*        pAddressOfNameOrdinals        =        (WORD*)((DWORD)phModule+pimED->AddressOfNameOrdinals);
                                pResult                =        (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[pAddressOfNameOrdinals[i]];
                                break;
                        }
                }
        }
        if  (pResult != 0 && pResult        >=        (DWORD)pimED        &&        pResult <        (DWORD)pimED+pExportSize)
        {
                char*        pDirectStr        =        (char*)pResult;
                bool        pstrok        =        false;
                while (*pDirectStr)
                {
                        if (*pDirectStr == '.')
                        {
                                pstrok        =        true;
                                break;
                        }
                        pDirectStr++;
                }
                if (!pstrok)
                        return        0;
                char        pdllname[MAX_PATH];
                int                pnamelen        =        pDirectStr-(char*)pResult;
                if (pnamelen <= 0)
                        return        0;
                memcpy(pdllname,(char*)pResult,pnamelen);
                pdllname[pnamelen] = 0;
                HMODULE        phexmodule        =        GetModuleHandle(pdllname);
                pResult        =        GetFunctionAddress(phexmodule,pDirectStr+1);
        }

        return pResult;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
api绝密档案里好像也有个例子,不知道谁的好
2007-7-4 14:49
0
雪    币: 212
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
...搜克吐鲁
2007-7-4 22:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东西
2007-7-12 13:08
0
雪    币: 264
活跃值: (30)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
能给点注释就好了
2007-7-13 16:44
0
雪    币: 210
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
re 一个。。~~~
2007-7-13 17:11
0
雪    币: 12569
活跃值: (2083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
  向高手学习啊
2007-8-15 13:50
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
暂时还未看懂
2007-8-15 22:57
0
游客
登录 | 注册 方可回帖
返回
//