好友
阅读权限10
听众
最后登录1970-1-1
|
在移动导出表时,把复制出的函数名地址表放到新节的新地址上,但是还要把新名称地址回填到新节中原来函数地址表数组上,这个过程没有实现,
是在移动导出表出错的原因。在用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[0].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 | 吾爱币 +2 |
热心值 +1 |
收起
理由
|
苏紫方璇
| + 2 |
+ 1 |
欢迎分析讨论交流,吾爱破解论坛有你更精彩! |
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|