APP下载

基于Android平台的SO加固技术研究

2015-09-28韩子诺刘嘉勇

现代计算机 2015年36期
关键词:字段模拟器代码

韩子诺,刘嘉勇

(四川大学电子信息学院,成都 610065)

基于Android平台的SO加固技术研究

韩子诺,刘嘉勇

(四川大学电子信息学院,成都610065)

0 引言

目前Android已经成为市场占有量最大的移动智能设备平台。与此同时,Android平台上的恶意软件也越来越泛滥。据360互联网安全中心所发布的《2015年第二季度中国手机安全状况报告》显示,2015年第二季度,Android平台新增恶意程序样本550万个,较2015年第一季度增长141万个,同时,也是去年全年的1.68倍;平均每天恶意程序感染量达到了72.2万人次;每天新增恶意程序样本近6.04万个。360公司发布的2015年第二季度Android平台恶意程序新增量与感染量如图1所示。

图1 2015年第二季度Android平台恶意程序新增量与感染量

1 现有技术的局限性

在 《Android平台软件安全加载技术研究与实现》和《基于Android系统JNI机制的SO库加固方案涉及》两篇论文中,作者基于JNI调用机制,通过加密原SO文件,使用壳程序加载并解密原SO文件,间接调用原SO文件的函数,该方案解决了ARM指令集版本不同带来的兼容问题。然而,由于该方案不可避免地会在硬盘留下解密后的明文SO文件,攻击者使用Hook系统API、自动化脚本可以轻易地破解此方案。为了解决这种缺陷,本文提出的SO加固方案,脱离了对JNI调用机制的依赖,并且在内存中完成文件的加解密,保证了没有临时文件的生成,具有更高的安全性。

2 Android平台下SO文件加载机制

通过对loadLibrary函数的源码跟踪,加载过程总结如下:

(1)检查/system/lib和/data/data/包名/lib路径下是否存在指定的动态库,未找到则抛出异常,找到则返回动态库完整路径;

(2)检查需要加载的共享库是否已经被加载,如果已经被加载则直接返回,否则将控制权传递给动态连接器Linker;

(3)Linker检查文件头部合法性,如魔术字,段的个数;

(4)Linker根据头部的数据分别读入对应的各种数据结构,并将所有PT_LOAD属性的段加载至合适的地址空间;

(5)Linker为该库在共享库链表中分配一个soinfo节点并填充其数据结构;

(6)Linker执行标记为.init,.init_array的节的代码,进行代码初始化工作;

(7)若存在JNI_OnLoad函数,执行该代码;至此,完成了整个动态库的加载过程;可以看到,在整个动态库加载过程中,并没有用到节头表的信息,也就是从装载的角度上看,节头表是可以被忽略的。

3 加固过程实现

为了配合外壳程序正常实现保护功能并且简化加固处理的工作量,本方案需要在源程序的源代码的基础上添加关键代码。

(1)环境检测代码

通过硬件信息,文件检测,设备检测,IMEI号等多种手段,检查运行环境是否为模拟器。一旦检测到模拟器,则立即退出整个应用程序。

(2)反调试代码

检测应用程序是否正在被动态调试,一旦发现IDA、GDB等动态调试工具,立即退出整个应用程序。

(3)解密代码

解析SO文件,编写对指定函数代码的解密函数。

为了不影响源程序的正常功能,需要保证壳代码首先得到执行,因此,编写的壳代码需用__attribute (constructor)修饰,使得壳代码被编译器放在.init_array节中,这样Linker加载SO时就会首先执行壳代码。

加固处理流程的功能是完成对待加密函数的加密处理以及对ELF文件头部信息的变形处理。流程如图2所示,具体步骤为:

(1)读取待加固的SO库文件,解析文件信息,得到待加密函数的偏移地址与大小。

(2)对待加密函数进行异或加密。

(3)解析文件头,修改文件头部部分字段值。

(4)计算文件的MD5值,并将其写入文件末尾。

图2 加固程序处理流程图

外壳程序是添加在.init_array节的代码段,在程序执行阶段,外壳程序首先被执行。外壳程序在执行过程中首先运行环境检测、对抗动态调试、MD5完整性校验,接着对加密代码进行解密,最后外壳程序交出控制权,源程序正常运行。具体工作流程如图3所示。

图3 外壳程序处理流程图

4 关键技术

关键细节示例如下。

检测模拟器:

(1)检测“/dev/socket/qemud”,“/dev/qemu_pipe”这两个通道。

//判断两个通道是否存在,存在则为模拟器 access(“/ dev/socket/qemud”,0)

access(“/dev/qemu_pipe”,0)

(2)检测props。

①ro.product.model该值在模拟器中为sdk,通常在正常手机中为手机的型号。

②ro.build.tags该值在模拟器中为test-keys,通常在正常手机中为release-keys。

③ro.kernel.qemu该值在模拟器中为1,通常在正常手机中没有该属性。

防动态调试:

(1)多进程使用ptrace。

//阻止被调试器附加

ptrace(PTRACE_TRACEME,0,0,0)

(2)对proc/xxx/task和proc/xxx/status进行检测。默认情况下status中TracerPid值为0,若不为0,则程序正处于被调试状态。

ELF头部的各个字段如下:}Elf32_Ehdr;

通过前文对Android平台下动态库的加载过程的分析,发现许多字段并没有使用。修改这些字段值也不会影响动态库的正常使用。然而,在使用readelf、IDA等静态分析工具的时候,若这些字段值错误,会导致静态分析失败。本方案利用这一特性,修改部分字段,达到阻止程序被静态分析的目的。

(1)修改e_ident字段后9个字节。

(2)修改e_type,e_machine,e_version,e_flag字段。

(3)修改e_shoff,e_shentsize,e_shnum,e_shstrndx字段。

加密的流程与部分源码示例如下。

(1)读取文件头,获取e_phoff、e_phentsize和e_ phnum信息。

(2)通过Elf32_Phdr中的p_type字段,找到DYNAMIC。从下图可以看出,其实DYNAMIC就是.dynamic section。从p_offset和p_filesz字段得到文件中的起始位置和长度。

(3)遍历.dynamic,找到.dynsym、.dynstr、.hash section文件中的偏移和.dynstr的大小。在我的测试环境下,Fedora 14和 Windows 7 Cygwin x64中elf.h定义.hash的d_tag标示是:DT_GNU_HASH;而Android源码中的是:DT_HASH。

(4)根据函数名称,计算hash值。

(5)根据hash值,找到下标hash%nbuckets的bucket;根据bucket中的值,读取.dynsym中的对应索引的Elf32_Sym符号;从符号的st_name所以找到在.dynstr中对应的字符串与函数名进行比较。若不等,则根据chain[hash%nbuckets]找下一个Elf32_Sym符号,直到找到或者chain终止为止,代码如下:

(6)找到函数对应的Elf32_Sym符号后,即可根据st_value和st_size字段找到函数的位置和大小。

(7)将需要加密的区域进行加密,即取反操作。*content=~(*content)。

解密流程为加密逆过程,大体相同,只有一些细微的区别,具体如下:

(1)找到so文件在内存中的起始地址。

(2)通过so文件头找到Phdr;从Phdr找到PT_ DYNAMIC后,需取p_vaddr和p_filesz字段。

(3)后续步骤与加密相同,不再赘述。

5 实验结果

根据上述方法,对采取本加固方案的SO文件进行逆向测试。首先,对对抗静态分析效果进行测试,将加固后的SO文件拖入IDA后,IDA发生解析错误,如图4所示。

图4

并且加密过后的函数,汇编指令显示错误,如图5所示。

第二,对整个运行流程进行监控,发现在本地并没有生成明文的SO文件,增大了攻击者破解的难度。

最后,在壳运行过程中,使用IDA尝试对程序进行附加调试,IDA附加后,原程序退出,达到了反动态调试的目的。

图5

从上面的实验结果可以得出,本加固方案在对抗静态分析以及反动态调试均有良好的效果,并且和之前已有的加固方案比较,本方案摒弃了本地加解密的方式,采用内存中完成加解密功能,防止被攻击者从本地直接得到明文SO文件。本方案大大提高了SO的保护强度,解决了本地存在临时解密文件导致安全性降低的问题。

6 结语

本文设计并实现的SO加固技术方案,可对整个SO文件以及特定函数块进行加固保护,并且在整个流程中,没有临时解密文件的生成,增加了非法逆向的难度。本方法是基于Android平台下ELF文件加载与执行特性来实现其保护的,依赖于Android Linker机制,该方案的适用性将受限于未来Android系统动态库加载与执行机制的改变。

[1]张译恬,王纯.基于安卓系统JNI机制的SO库加固方案设计[J].电信技术,2014(10):90-93.

[2]秘锡辰.Android应用软件安全加固技术研究[D].北京交通大学,2013.

[3]王覃思,秘锡辰,郭燕慧.Android平台软件安全加载技术研究与实现[D].中国科技论文在线,2012.?

[4]何先波,唐宁九,吕方等.ELF文件格式及应用[J].计算机应用研究,2001,18(11):144-145,150.DOI:10.3969/j.issn.1001-3695.2001.11.048.

SO Reinforcement;Android Platform;ELF;Anti-Static Analysis

Research on SO Reinforcement Technology Based on Android Platform

HAN Zi-nuo,LIU Jia-yong
(Department of Electronic Information,Sichuan University,Chengdu 610065)

1007-1423(2015)36-0049-05

10.3969/j.issn.1007-1423.2015.36.012

韩子诺(1991-),男,四川成都人,硕士,研究方向为Android安全

2015-11-16

2015-11-30

近年来,为了对抗Android应用面临的盗版、篡改、植入病毒等威胁,大量开发者对Dex代码进行加固保护,然而由于Android的开放性,基于Android源码底层的通用Dex脱壳工具层出不穷,Dex代码破解难度大大降低,更多的开发者转而使用C/C++代码进行核心功能的开发。基于对ELF文件格式以及Android平台下的Linker机制的研究与分析,提出并实现一种基于特定函数保护的SO加固方案。

SO加固;Android平台;ELF;防静态分析

刘嘉勇(1962-),男,四川成都人,博士,研究方向为密码学

In recent years,in order to combat piracy,tampering,implant viruses of Android application,a lot of developers reinforce Dex codes,but because the Android platform is open,With Dex unpack tools based on Android source code emerging endlessly,cracking Dex codes becomes far easier,more developers turn to use C/C++code development the core functions.Based on Executable and Linking Format and the research on Linker on the Android platform,gives a SO reinforcement scheme based on specific function protection.

猜你喜欢

字段模拟器代码
图书馆中文图书编目外包数据质量控制分析
了不起的安检模拟器
盲盒模拟器
划船模拟器
创世代码
创世代码
创世代码
创世代码
动态飞行模拟器及其发展概述
CNMARC304字段和314字段责任附注方式解析