对于自定义linker加固so而言,为了防止整体dump并对修复重定位表的脱壳方式(upx的脱壳),可以将一些重要的结构信息在内存中进行抹去和移动。
抹去
ELF文件头再so文件加载后就不需要使用了,所以可以在加载完so文件后直接将其抹去。
.rel.plt/.rela.plt
和.rel.dyn/.rela.dyn
重定位表在对so文件进行连接和重定位后也不需要使用了可以抹去。
移动
对于一些在加载和链接重定位so文件之后还需要使用的结构可以将他们移动到其他位置。例如程序头表program header table
,动态链接节区.dynamic
,符号表 .dynsym
,字符串表 .dynstr
。
移动时需要修复对应的虚拟地址偏移信息,符号表 .dynsym
,字符串表 .dynstr
的虚拟地址偏移信息保存动态链接节区.dynamic
中,而动态链接节区.dynamic
的虚拟地址偏移信息保存在程序头表program header table
。同时还需要修复这些结构在soinfo结构体中对应的虚拟地址,这样再通过linker程序与so进行交互的时候才可以索引到正确的结构。
通过抹去elf文件头和重定位表.rel.plt/.rela.plt .rel.dyn/.rela.dyn
。移动程序头表program header table
,动态链接节区.dynamic
,符号表 .dynsym
,字符串表 .dynstr
可以防止整体dump并修复so的脱壳行为,但是依然可以通过分段dump并组合成一个完整的elf文件进行脱壳,所以可以增加一些反调试的手段增加分析难度。
以上均为个人观点,仅供参考。
标签:dump,linker,dynamic,dyn,so,rel,节区 From: https://www.cnblogs.com/revercc/p/17113730.html