本帖最后由 aswcy815174418 于 2021-4-25 00:31 编辑
参考移动导出表,移动重定位和导入表,不是照葫芦画瓢?
移动导出表的难点就是修正,我讲一下我自己的思路:
1、先获取原导出表首地址到AddressOfFunctions的首地址的差值,记为
offset = FOA(AddressOfFunctions) - FOA(导出表首地址)
2、现在到了各个功能函数的地址,新导出表的AddressOfFunctions等于新增节的RVA+offset,
AddressOfFunctions = 新节表RVA + offset
offset += NumberOfFunctions * 4;
3、现在到了各个函数名的地址,只需AddressOfNames等于新增节的RVA+offset,
AddressOfNames = 新增节的RVA+offset
offset += NumberOfNames * 4;
4、现在到了序号的地方,只需要让AddressOfNameOrdinals等于新增节的RVA+offset就行
AddressOfFunctions = 新节表RVA + offset
offset += NumberOfNames * 2(很多人在这里容易搞错);
5、现在到了DLL名字的地方,直接让新导出表的Name等于新节表RVA + offset
Name = 新节表RVA + offset
offset += strlen(dll名字)
6、现在到了函数名地方,只需要修复各个函数名对应的函数地址,得用到for循环,我直接copy代码吧
[C++] 纯文本查看 复制代码 for (int i = 0; i < exportList->NumberOfNames; i++){
DWORD* addrOfName1 = (DWORD*)(RVATranformFOA(nt, sectionArr, exportList->AddressOfNames) + (UINT)dos + i*4);
char* addrOfName2 = (char*)(RVATranformFOA(nt, sectionArr, *addrOfName1) + (UINT)dos);
*addrOfName1 = newSection->VirtualAddress + offset;
offset += strlen(addrOfName2) + 1;
}
源码链接:https://wwe.lanzouj.com/is74Qogkgxe
|