[笔记]移动导出表
在移动导出表时,把复制出的函数名地址表放到新节的新地址上,但是还要把新名称地址回填到新节中原来函数地址表数组上,这个过程没有实现,是在移动导出表出错的原因。在用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导出表的移动就成功了
页:
[1]