首页
社区
课程
招聘
[旧帖] [求助]agp中一段代码我感觉有问题呢 0.00雪花
发表于: 2014-7-2 16:44 1750

[旧帖] [求助]agp中一段代码我感觉有问题呢 0.00雪花

2014-7-2 16:44
1750
是老a培训课程的一段代码, 后来我发现在agp中也有,如下:

BOOLEAN EunmEATTable(PVOID ulModuleBase)
{
        PIMAGE_DOS_HEADER pDosHeader;
        PIMAGE_NT_HEADERS NtDllHeader;
        IMAGE_OPTIONAL_HEADER opthdr;
        ULONG_PTR* arrayOfFunctionAddresses;
        ULONG_PTR* arrayOfFunctionNames;
        WORD* arrayOfFunctionOrdinals;
        ULONG_PTR functionOrdinal;
        ULONG_PTR Base, x, functionAddress;
        IMAGE_EXPORT_DIRECTORY *pExportTable;
        char *functionName;

        __try
        {
                pDosHeader=(PIMAGE_DOS_HEADER)ulModuleBase;
                if (pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
                {
                        DbgPrint("IMAGE_DOS_SIGNATURE failed\r\n");
                        return FALSE;
                }
                NtDllHeader=(PIMAGE_NT_HEADERS)(ULONG_PTR)((ULONG_PTR)pDosHeader+pDosHeader->e_lfanew);
                if (NtDllHeader->Signature!=IMAGE_NT_SIGNATURE)
                {
                        DbgPrint("IMAGE_NT_SIGNATURE failed\r\n");
                        return FALSE;
                }
                opthdr = NtDllHeader->OptionalHeader;
                pExportTable =(IMAGE_EXPORT_DIRECTORY*)((ULONG_PTR)ulModuleBase + opthdr.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress); //得到导出表
                arrayOfFunctionAddresses = (ULONG_PTR*)((ULONG_PTR)ulModuleBase + pExportTable->AddressOfFunctions);  //地址表
                arrayOfFunctionNames = (ULONG_PTR*)((BYTE*)ulModuleBase + pExportTable->AddressOfNames);         //函数名表
                arrayOfFunctionOrdinals = (WORD*)((BYTE*)ulModuleBase + pExportTable->AddressOfNameOrdinals);

                Base = pExportTable->Base;
                for(x = 0; x < pExportTable->NumberOfFunctions; x++)
                {
                        functionName = (char*)((BYTE*)ulModuleBase + arrayOfFunctionNames[x]);
                        functionOrdinal = arrayOfFunctionOrdinals[x] + Base - 1;
                        functionAddress = (ULONG_PTR)((BYTE*)ulModuleBase + arrayOfFunctionAddresses[functionOrdinal]);

                        DbgPrint("%s:0x%08X\r\n",functionName,functionAddress);
                }

        }__except(EXCEPTION_EXECUTE_HANDLER){
        }
        return FALSE;
}

//疑问
1. pExportTable->NumberOfFunctions 我感觉应该是 pExportTable->NumberOfNames
    否则下面的 functionName = (char*)((BYTE*)ulModuleBase + arrayOfFunctionNames[x]); 会越界的,毕竟有的dll 是用序号导出的
2. functionOrdinal = arrayOfFunctionOrdinals[x] + Base - 1;  这是得到导出序号,我感觉应该是 functionOrdinal =  arrayOfFunctionOrdinals[x] - Base

我后来又baidu了一个文章,讲得挺细
http://blog.csdn.net/evi10r/article/details/7216467

v校和老A是老前辈了,我不太相信他们的代码会有多大的问题,但和网上的讲解差好多,我好纠结啊

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
专门来解释下吧,我都看了一下午了, 纠结得胸闷,气短。
2014-7-2 16:45
0
雪    币: 110
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sjm
3
其实最好的验证办法是进入调试一下,有时候是故意写错的,毕竟是开源
2014-12-27 23:56
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
资源好多,怎么能静下心来好好很成问题了。有时候一个问题找不到一个好的老师引导下,会困住很久
2014-12-28 21:41
0
游客
登录 | 注册 方可回帖
返回
//