论文部分内容阅读
自从Google于2008年9月发布Android操作系统以来,搭载Android操作系统的手机出货量呈爆炸式增长,很快占据了智能手机的主要市场份额,与此同时,各种各样功能丰富的Android应用程序也纷纷出现,方便着人们生活的方方面面。Android应用程序是通过Java语言编写的,所以继承了 Java反射的特性。一方面,反射机制能够在程序运行过程中动态地观察和改变应用程序的行为,提高了 Android应用开发的灵活性;另一方面,反射机制给研究人员分析Android应用程序带来了挑战,静态分析的时候很难确定反射调用的目标,包括目标方法、目标字段和目标对象,那么反射在静态分析时就阻断了程序的控制流和数据流,因此很难对程序的运行时行为进行完整建模,导致下游的分析如指向分析和污点分析等难以进行。针对该问题本文提出了一种动态运行和静态插桩相结合的方法来解析An-droid 应用中反射相关的函数, 解析之后反射调用的 目标对静态分析程序来说就是可见的,静态分析就能够分析更多的程序行为,从而提高分析的准确率。我们的解析方法分为动态运行和静态插桩两部分:动态运行是将Android应用运行于特定的Android操作系统中,当反射调用触发时,就通过系统记录下反射调用的目标,这步的关键是实现这样的特定的Android操作系统,我们通过对Android操作系统源码中反射相关的代码做了修改来完成这部分工作;静态插桩是将通过动态运行得到的反射调用的目标转换成显式的Java调用,并且将显式的Java调用写入Android应用程序中,反射就不会再对静态分析工具的准确率造成影响了。我们用本文提出的方法对不同来源的Android应用程序中的反射调用做了解析,针对分析结果分别做了横向比较和纵向比较。实验结果表明,我们的方法相比其他解析Android应用中反射的方法能解析出更多的反射调用目标,并且下游的静态分析程序在分析本文方法处理后的Android应用时,会有更准确的分析结果,从而证明了本文提出方法的有效性和实用性。