移动导出表(c++源码)
本帖最后由 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代码吧
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
lyl610abc 发表于 2021-4-24 23:05
这方面的内容我打算放在加密壳那个系列里,因为加密需要移动表,敬请期待(我会鸽挺久的,太多坑要填了){: ...
这代码,写了三天,也有参考了你的代码{:1_909:},修正就修了一两天{:1_909:},废物是我 lyl610abc 发表于 2021-4-24 23:05
这方面的内容我打算放在加密壳那个系列里,因为加密需要移动表,敬请期待(我会鸽挺久的,太多坑要填了){: ...
{:1_896:}尴尬了,我现在撤了吧,把你给占了 这方面的内容我打算放在加密壳那个系列里,因为加密需要移动表,敬请期待(我会鸽挺久的,太多坑要填了){:301_977:} 我先运行一下试试 功能很实用,尝试一下,感谢楼主! 厉害了👍 厉害了,大佬 厉害了66666 学会了,谢谢大佬