PE解析导入表--实例

本文深入探讨了PE文件格式中的导入表,解释了导入表的作用,详细解析了其结构,并通过实例展示了如何读取和理解导入表信息。内容包括DLL导入、函数指针解析等关键概念。
摘要由CSDN通过智能技术生成

//得到导入表的信息:导入库名,导入函数ID,导入函数地址
void CPe32 ::GetImportTableInfo()
{
                 if (m_bSuccess)
                {
                                 //空结尾的导入表结构成员
                                 IMAGE_IMPORT_DESCRIPTOR zero = {0};
                                 //得到导入目录结构
                                 IMAGE_DATA_DIRECTORY ImportDataDirectory  = m_pPeHeader->OptionalHeader.DataDirectory[1];
                                 if (ImportDataDirectory .VirtualAddress == 0)
                                {   //不含有导入表直接返回
                                                 return ;
                                }
                                 //获得导入表在PE文件中的位置
                                 DWORD dwImportInFilePos = GetFileOffsetFromRva(ImportDataDirectory .VirtualAddress);
                                 if (dwImportInFilePos > m_iFileSize) //判断导入表的位置是否合法
                                {
                                                 return ;
                                }
                                 //得到文件中导入表结构指针,有多少个DLL,则导入表中有多少个成员
                                 IMAGE_IMPORT_DESCRIPTOR *pImportDescriptor =
                                                ( IMAGE_IMPORT_DESCRIPTOR *)((BYTE *)m_pFileBuffer + dwImportInFilePos);
                                 int iDllNum = 0;
                                 //pImportDescriptor是导入表中IMAGE_IMPORT_DESCRIPTOR结构体数组的首地址。
                                 while (1)
                                {
                                                 //取得导入库名称字符串所在文件中的位置
                                                 DWORD dwDllNameInFilePos = GetFileOffsetFromRva(pImportDescriptor->Name);
                                                 if (dwDllNameInFilePos == -1 ||
                                                                dwDllNameInFilePos > m_iFileSize) //检测得到的文件偏移是否合法
                                                {               //第一个导入库名称位置不合法,停止导入表的解析
                                                                 if (iDllNum == 0)
                                                                {
                                                                                 return ;
                          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值