2016wapjpc 发表于 2019-7-28 11:10

[笔记]移动导出表

在移动导出表时,把复制出的函数名地址表放到新节的新地址上,但是还要把新名称地址回填到新节中原来函数地址表数组上,这个过程没有实现,
是在移动导出表出错的原因。在用vc调试的过程中,发现了错误,自己这一步一直没有做,前面是没有想通。

//3--0 保存函数地址表地址,转化为rva地址,后面给dll导出表的函数地址名调用时再写回
                        PDWORD NameAddressOfFunc =(PDWORD) FileOffsetToRva( pFileBuffer,(DWORD)destadd3 - (DWORD)pFileBuffer );

                  //修复函数名称地址表的地址为新地址,转化为rva ,2019 7 26 11 :10
                  DWORD NewNameadd =FileOffsetToRva( pFileBuffer,(DWORD)destadd4 - (DWORD)pFileBuffer );
               
       
                   printf(" 移动后函数名称rva 地址%x \n",NewNameadd );

                PDWORD address =(PDWORD)NewNameadd;          

               printf(" 移动后函数名称rva%x地址%x \n",*address,address );

         // 把文件地址转化成相对rva地址写到原来地址名称表,新加一个函数写回去一个函数地址,2019 7 26 11 :15

                memcpy(destadd3,address, 4);

         printf(" 移动后回填到地址表的函数名称rva 地址%x 地址: %x\n",*destadd3,destadd3 );
         //循环复制下一个函数名
             destadd3=destadd3 + 4;
                   destadd4 =destadd4 + Namelen;
                   rscadd4 = rscadd4 +Namelen;
                  }
            //2017 2 18                                                                  
            pNTHeader->OptionalHeader.DataDirectory.VirtualAddress = FileOffsetToRva(pFileBuffer,(DWORD)(destadd5 - (char*)pFileBuffer));
          pExportDy =(PIMAGE_EXPORT_DIRECTORY)destadd5 ;
          pExportDy->Name= FileOffsetToRva(pFileBuffer,(DWORD )destadd6 -(DWORD)pFileBuffer);
       // 函数地址表
      pExportDy->AddressOfFunctions = FileOffsetToRva(pFileBuffer,(DWORD )destadd -(DWORD)pFileBuffer);
       //序号表
      pExportDy->AddressOfNameOrdinals =FileOffsetToRva(pFileBuffer,(DWORD )destadd2 -(DWORD)pFileBuffer);   
                //2019 7 26 11:46修正
      //函数名称地址表
            pExportDy->AddressOfNames = *NameAddressOfFunc ;



这样pe导出表的移动就成功了

花语 发表于 2019-7-28 14:29

页: [1]
查看完整版本: [笔记]移动导出表