简单SO加密及ELF头文件修复

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

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下载地址

https://pan.baidu.com/s/1pLscKVD

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值