从现在起,养成写BLOG的好习惯。。。
CSDN博客地址: http://blog.csdn.net/thomasking2014/article/details/38941541
作者:ThomasKing
时间:2014.8.30
简单粗暴的so加解密实现
一、概述
利用动态链接库实现安卓应用的核心部分,能一定程度的对抗逆向。由于ida等神器的存在,还需要对核心部分进行加密。动态链接库的加密,在我看来,有两种实现方式:1. 有源码; 2、无源码。无源码的加密,类似window平台的加壳和对.dex文件的加壳,需要对文件进行分析,在合适的地方插入解密代码,并修正一些参数。而如果有源码,则可以构造解密代码,并让解密过程在.so被加载时完成。(当然,应用程序加载了.so文件后,内存中.so数据已经被解密,可直接dump分析。同时,也有一些对抗dump的方法,这里就不展开了)。
下文只针对有源码这种方式进行讨论,分析一些可行的实现方法。主要是包含对ELF header的分析(不是讨论各个字段含义); 基于特定section和特定函数的加解密实现(不讨论复杂的加密算法)。
二、针对动态链接库的ELF头分析
网上有很多资料介绍ELF文件格式,而且写得很好很详细。我这里就不重复,不太了解的朋友,建议先看看。以下内容,我主要从链接视图和装载视图来分析ELF头的各个字段,希望能为读者提供一些ELF文件头的修正思路。
这里,我再罗嗦列出ELF头的各个字段:
typedef struct {
unsignedchar e_ident[EI_NIDENT]; /* File identification. */
Elf32_Half e_type; /*File type. */
Elf32_Half e_machine; /*Machine architecture. */
Elf32_Word e_version; /*ELF format version. */
Elf32_Addr e_entry; /*Entry point. */
Elf32_Off e_phoff; /*Program header file offset. */
Elf32_Off e_shoff; /*Section header file offset. */
Elf32_Word e_flags; /*Architecture-specific flags. */
Elf32_Half e_ehsize; /*Size of ELF header in bytes. */
Elf32_Half e_phentsize; /*Size of program header entry. */
Elf32_Half e_phnum; /*Number of program header entries. */
Elf32_Half e_shentsize; /*Size of section header entry. */
Elf32_Half e_shnum; /*Number of section header entries. */
Elf32_Half e_shstrndx; /*Section name strings section. */
} Elf32_Ehdr