Android(一):简单SO加密及ELF头文件修复
为了对抗IDA等逆向工具对SO进行逆向,一个简单的方法就是对ELF头文件信息进行修改,使IDA等工具解析出错,从而达到对抗的目的。本文所用到的资源文件都会提供下载,有什么写得不好的地方,请指正,谢谢。
一,ELF文件结构
由上图可知ELF有两种视图,当我们应用在执行的时候采用的是执行视图,看图可知,节区头部表是可选的,可选的意思就是存在与不存在对程序都是没有影响的,因此,我们可以改动节区头的相关信息,让IDA等工具解析出错,从而达到对抗的目的。
二,ELF头文件结构
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
}Elf32_Ehdr;
e_ident : ELF的一些标识信息,前四位为.ELF,其他的信息比如大小端等
e_machine : 文件的目标体系架构,比如ARM
e_version : 0为非法版本,1为当前版本
e_entry : 程序入口的虚拟地址
e_phoff : 程序头部表偏移地址
e_shoff : 节区头部表偏移地址
e_flags :保存与文件相关的,特定于处理器的标志
e_ehsize :ELF头的大小
e_phentsize : 每个程序头部表的大小
e_phnum :程序头部表的数量
e_shentsize:每个节区头部表的大小
e_shnum : 节区头部表的数量
e_shstrndx:节区字符串表位置
看了上面的注释是不是还有点不明白呢?其实,只要耐心地算一次他们的数值,ELF头就很简单了
1.比较固定的字段:e_ident 、 e_machine 、e_version 、e_entry 、e_flags 、e_ehsize
2.目前e_ehsize = 52字节,e_shentsize = 40字节,e_phentsize = 32字节
3.整个so的大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1
4.e_shstrndx一般等于e_shnum - 1
5.e_phoff = ELF头的大小
上面的东西是不是很枯燥呢?下面上图来验证
1.下载http://bbs.pediy.com/thread-188793.htm里的360crackme.rar ,解压,提取libqihoo.so
2.使用IDA打开,报异常信息,使用010 Editor工具打开libqihoo.so,
3.使用ELF分析脚本对so进行分析,点击Templates–>Run template,选择下面下载的ELFTemplate.bt脚本,出现如下图所示
分析脚本很明显地显示解析出错,因此我们开始修复ELF头表
4.点击中间蓝色条下面的struct file,显示elf头部信息
首先,再次提醒,我们需要修复的是节区头的相关信息,因此,只需要关注e_shoff ,e_shentsize,e_shnum ,e_shstrndx这几个字段。
第一个很明显的错误就是e_shentsize,目前e_shentsize固定等于40
然后我们需要计算节区的数量e_shnum = (整个文件的大小 - e_shoff) / 40
则 e_shnum = (136443 - 135564) / 40 = 22
e_shstrndx = e_shnum - 1 = 21
则修复后如图所示
再次运行ELFTemplate.bt,提示修复成功。再使用IDA查看,证实确定修复成功
ELFTemplate下载地址

本文介绍了如何修复ELF头文件错误,通过分析ELF结构,特别是e_shoff、e_shentsize、e_shnum和e_shstrndx字段,以及使用010 Editor和IDA工具进行验证和修复。同时,讨论了Android环境下SO文件的加密方法。
834

被折叠的 条评论
为什么被折叠?



