一、前言
最近一段时间,工作比较空闲,准备研究下so文件上的函数加密和函数名混淆,首先从根据函数名找到对应代码开始。记得很早之前,自己写过一个ELF解析工具,到现在都忘得差不多了,趁现在这个机会,顺便复习下。本文给出两种方法来查找函数代码位置,第一种是直接遍历动态符号表,取出字符串与目标函数名比较,找到之后,根据里面的字段来得到函数代码位置。第二种是根据ELF文件中的hash节来遍历动态符号表,android源码中用的是第二种方法。我们先讲第一种方法。
二、直接遍历动态符号表
首先找到ELF头,ELF头里包含两我们所需的字段,节区头数组的起始偏移和该数组的大小,e_shoff表示节区头数组的偏移 e_shnum表示数组的大小
接着根据节区头数组的起始偏移和该数组的大小遍历节区头,在这里我们找到节区头的sh_type字段为dynsym的节头,找到对应节头之后,在节头中找到节的偏移(sh_offset),和节的大小(sh_size)。