还剩3页未读,继续阅读
文本内容:
一个新的Activity,让这个应用在启动时默认进入这个新的Activity,然后通过按键操作,进入原本的主界面并且要在Android Manifest,xml中加入新的permission和更改它的软件版本,然后重新编译这个软件,并让它在手机上正常运行本节目的是,为这个软件加一个Activity,并在程序启动时,首先进入Activity,然后通过点击进入原来的界面,并将软件版本改为200使用APKTool反编译该软件,反编译可以使用如下命令命令完成之后,当前文件夹下出现一个calenda r文件夹,该文件夹下有两个文件夹和两个文件:sm alires Android Manifest,xml^0apktool.ymlo其中,smali相当于Android工程中src文件夹,里面含有针对各类反编译出来的sm ali代码首先,我们来更改软件的版本号,版本号都保存在Android Manifest.xml文件中,打开该文件,找到如下代码完成之后,便可以在calendar目录下的dist目录中找到生成的calendar,apk安装文件但是,此时的文件是安装不成功的这是因为生成的calendar,apk还没有被签名Android要求安装的每一个程序都有开发者的签名,这里可以随便使用Keytool和Jarsigner签名安装完成后,在系统的管理应用程序功能中,我们可以发现,该软件的版本信息已经变了接下来的实验是要实现在这个软件中插入一个Activity,并让它成为启动时的第一个Activity在Android中,启动的第一个Activity是通过接受name为oandroid,intent,action.MAIN的Intent来实现的,类似于C语言中main函数,查看反编译出来的Android Manifest.xml文件,可以知道程序首先启动的是Activity Main:现在要替换的就是这个Activity Main因为在这里是要向反编译出来的smali代码中添加代码,而smali代码写起来极其麻烦所以为了方便,我们可以新建一个和Activity Main有相同包名的程序包,然后在这个工程里使用Java来编写所需要的代码,编译完成后在通过反编译得到所需要的smali代码,然后将代码导入Calendar,apk的反编译代码中其中,launcher.xml是要插入的In SertActivity的界面,里面只含有一个按钮,通过响应按钮的点击事件,可以跳转到Activity Main工程的Activity Main并没有实际性的内容,只是为了在工程中方便测试反编译过后,将launcher,xml复制到Calendar的layout文件夹中,在smali目录下的包中,将In SertActivity,smali和In SertActivity$l.smali文件复制到Calendar对应的目录下其中In SertActivity,smali是In SertActivity,java的smali代码,In SertActivity$l.smali是In SertActivity中按钮点击事件响应On ClickListener的实现的smali代码基本的代码有了以后,下面的就是修改Calendar里的代码,使两份代码整合到一起,达到我们预期的功能首先得去除Activity Main的首先启动性质,即去除上面提到的可以让该Activity首先启动的Intent,然后将In SertActivity加入Android Manifest,xml文件中,如下所示:加入代码之后,得更改smali代码,使In SertActivity整合到整个程序中下面是一段InSert Activity的smali代码:,line表示在原Java代码中的行数,那么16行的具体实现的过程是1)定义一个16位的整形vl,vl的值0x7f03;Android SDK为每一个资源分配了一个编号(不是id),如在这里,launcher,xml的编号就是0x7f030000(自动扩展为32位,目的是节约内存),这个值可以在工程目录中的gen下的R.java文件中找到,但这个值显然不能和原来的程序整合在一起,解决这个问题的方法是在R$layout,smali文件中手动加一个编号R$layout.smali是R.java里的一个子类layout的smali代码,这个子类里保存着用到的layout的id,在其中加入一个不重复的id即可再看.line18下的内容,这是重新给vl赋了一个新值0x7f05,然后调用this,find ViewById(vl),那么vl就是一个id,结合上下文可知,这个id是界面上的那个按钮的id,改动这个id的方法和上面改动layout id的方法有所不同,它涉及到三个文件ids.xml,public,xml和R$id.smali其中ids.xml记录了这个程序中所有的id,public,xml记录了属性o是“public”的id如果没在public,xml和ids.xml中申明这个id,反编译的时候也是找不到这个id的public中所有的id都是按顺序紧凑排列,如0x7f050000的下一个id必然是0x7f050001,所以对于本次反编译所涉及到的三个文件,我们做出如下添加这里的0x7f08005e是承接原来文件中的最后一个id而来,不能随便赋值最后在.line18下做如下改动:const vl,0x7f08005e改动完成之后再进行编译、签名并安装运行,可以看到,Calendar的初始画面变成了和In SertActivity一样,点击按钮,进入了日历界面将一个程序反编译之后植入恶意代码,例如将上面所说插入的界面改为后台发送一条短消息以达到恶意扣费的效果,这是目前绝大多数恶意软件的实现方法2011年2月,Google market上出现的50多款恶意程序都是通过将恶意代码植入一些流行软件实现的这类恶意程序因为是基于A ndroid系统层次的最上层开发,所以移植性相当好目前国内大多数AndroidMarket对应用软件上传者并没有做身份确认,就是说任何人可以上传任何软件这为恶意程序提供了良好的传播条件这种植入恶意代码的方式唯一不足就是,被植入恶意代码的Android安装程序的签名发生了改变所导致的问题就是,当手机上已经装了一个相同的程序时,Android系统发现他们的签名不一致而拒绝安装如今此类恶意程序都是采用欺骗类手法,如提示用户软件已全部更新,要完全卸载旧版程序才能安装而一般用户并不会怀疑这类的提示而且在国内环境下,大量“破解”、“汉化”软件已经深入用户的意识,这类的欺骗完全行得通
2.3android权限机制Android的权限机制绕过攻击可以描述为:一个没有相关权限的应用程序可以调用某一个具有相关权限的模块来实现该应用程序本来所不具有的功能此种恶意程序主要利用了一个权限机制的漏洞调用者不需要具有被调用者的相关权限从某种意义上来说,这很大程度上是Android应用开发者的责任图3说明了权限机制的绕过是可行的假设一个Android系统上运行有三个应用A,B,C,它们都被自己所在的沙箱隔开了A没有被分配任何权限;B被分配了权限pl,B中有一个模块晅,该模块向其他程序提供接口,但这个模块没有申请任何权限保护,因此任何其他程序对它都有使用权限;C是一个安全性较高程序,例如系统的短信发送模块,它被权限P1保护从图中可以看到,程序A是不能对程序C进行访问的,因为A没有被分配C所要求的权限;但是,C程序的功能可以通过程序B的Ml模块间接的被A使用,这就导致了本节所说的一个未被授权的程序执行着比它权限高的任务的情况如上所述,使用多个程序来实现恶意行为是很容易实现的首先,恶意开发程序者首先找到或者自己编写一个有漏洞的程序,该程序并没有恶意行为,只是不够“安全”,它的一些外部接口并没有被相关权限保护起来目前这样“不安全”的程序是无法被当作恶意软件检测出来的这样的程序被用户安装之后,恶意开发者便可以使用另外一个程序进行恶意操作就单一功能来看,后者也缺少恶意程序的一些特征,这样组合,恶意代码的隐蔽性更高当然,这样的恶意程序也是有缺陷的,其中最主要的就是感染率低毕竟两个程序缺一不可,相对其他单一恶意程序而言,用户同时安装两个程序比安装一个程序几率低很多而旦就如本节开头所说,相对于Android权限机制的缺陷,这种不安全性更可以说是由开发者而导致的只要开发者遵守安全开发方法,相信这类程序的出现几率应该会低很多
2.4itelephocy的定义Android上层的应用程序都是用Java实现的,Java有一个很方便也很不安全的机制反射机制从反射机制提供的功能来看,它最少存在一个安全隐患能突破安全保护的私有方法这里实例是通过反射机制和AIDL来实现一个自动挂断电话的恶意程序目前,在Google提供的Android SDK中并没有end Call方法(该方法在A ndroid
1.0的时候存在,之后便设为私有方法)end Call方法存在于【Telephony接口中,Android系统使用AIDL提供了实现了这个接口的对象我们要做的就是通过某种方法取得一个ITelephony类通过查看发现,Telephony Manager类中有这个方法,但为私有方法,这时,我们便可以使用Java的反射机制来获取Telephony Manager中的所有方法,包括SDK中不存在的私有方法本节主要完成的功能是在某些情况下挂断电话,所有要在AndroidManifest,xml中定义能操作电话状态的权限包括在Android SDK中,是没有定义【Telephony类的严格来说,ITelephony只是个接口在Android源码中,它定义在com.android,internal,telephony包中,文件名为ITelephony.aidl在这个文件中,可以看到很多函数,诸如end Call,call等,可以说关于电话的任何功能,都可以使用这个接口的相关函数来实现,可能正是因为这个原因,Telephony Manager的get ITelephony方法才会被设成私有的以保证不会被导出到SDK中为了能在第三方应用中使用ITelephony的相关方法,我们可以使用AIDL首先,在工程的src目录下建立与源码中ITelephony.aidl文件所在包名字相同的包,然后再在该包下建立一个ITelephony.aidl文件因为这里只用到挂断电话功能,所有在工程的ITelephony.aidl文件中只写入如下代码保存后,ADT会在工程的gen目录下的包中生成一个ITelephony.java文件,这就相当于在工程中有了ITelephony类,可以自由使用了接下来,就是获得一个ITelephony对象,查看Android系统源码,在Telephony Manager,java中,有这么一个取得ITelephony对象的方法这个方法是私有方法,在A ndroid SDK提供的Telephony Manager类中是找不到的,但是由上面介绍的Java反射机制来看,访问一个私有方法并不是问题使用如下代码便可上面的代码的含义是,先获取Telephony Manager类,然后在这个类中找到get ITelephony的方法,最后把这个方法设成可访问的之后,便可以将其结合某一个实在的对象进行操作这时,便有了一个i Telephony对象,然后就可以使用它的end Call函数了i Telephony,end Call;来电时,系统会触发Phon StateListener中的on CallState Changed函数,所以我们可以使用Phon StateListener类来监控电话来电时的状态,判断来电号码,如果是特定的号码,调用以上程序挂断然后执行触发的各种恶意行为反射机制在为编程提供便利的同时,也带来了巨大的隐患因为Android系统和Java语言的密切联系,这种隐患便被带到了Android系统中在Android系统中,有大量可能造成安全威胁的函数被设成了私有函数,但这些函数往往在Android SDK中提供了,那么这些私有函数在反射机制面前,便没有了私有可言究其根本,就在于Android源码的开放性只要查看Android源码,都能知道在Android SDK中隐藏了哪些函数,更有甚者,开发者能自己制作一个全版本的SDK,这是在其他操作系统上不可能出现的事,所以说,安全性的欠缺是Android与生俱来的一个问题3android应抵御恶意攻击的安全机制本文首先分析了Android系统本身的几种安全机制,然后结合Android本身交互、运行的一些特性,阐述了Android安全机制并不足以抵御目前的几种恶意程序,并给出实例加以证明未来的工作主要包括两个方面1)继续研究和总结新的攻击方式;2)基于上面几种攻击方式,研究自动化攻击的方式2)调用this,set ContentView(vl)。