Android使用逆向技术分析手机恶意代码

Android使用逆向技术分析手机恶意代码

Android逆向技术的学习用到了三个工具:apktool、dex2jar和jd-gui。通过三个工具的配合使用,分析了找到的4款含有恶意代码的软件。以分析被植入恶意代码“给你米”的仿真打火机应用的逆向过程来说明三款软件的使用。

apktool的使用

将仿真打火机的应用fire.apk拷贝到apktool目录中,如图:

打开命令行,转到apktool所在目录,并运行命令:apktool d fire.apk fire。其中d代表反编译,第一个参数fire.apk是反编译的源文件,fire是生成的目标文件夹:

打开fire文件夹就能看到反编译之后的apk文件的目录结构如下:


其中重要性AndroidManifest.xml是Android应用程序中最重要的文件之一。它是Android程序的全局配置文件,是每个 android程序中必须的文件。它位于应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息。 
因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所必须拥有的信息,包括整个android应用运行所需要的权限等。

其中smali文件夹中包含的是应用源代码的反编译结果,其目录结构和开发时源码的目录结构一样,开发包中每个.java文件对应反编译之后的一个.smali文件但是打开smali目录之后我们发现代码经过了混淆处理,类名已经和开发环境中的类名不一样,有一些被改成不好理解的符号,但是主要的一些Activity还是能分析出它的作用的:

打开AdActivity.smali阅读smali代码可以发现smali代码是一种类似于汇编语言的中间代码,仔细阅读就能看懂程序的方法,定义的静态变量等:


Activity的onCreat方法:


通过smali中间代码的学习我明白了恶意代码是如何插入一个正常的应用的,恶意代码制造者只需要找到程序入口,然后在smali找到Intent对象(Intent对象是用来控制Android程序中Activity之间的跳转的)并且修改Intent对象中的参数,使之转向自己的恶意代码,然后在自己的恶意代码中开启一些后台服务,获取用户隐私信息等,然后构造Intent对象,再把程序返回到正常程序的Activity,这样在用户毫无察觉的情况下,恶意代码已经被执行。

dex2jar的使用

虽然smali中间代码能够被理解,但是还是远远不过的,我们期望一种能让反编译之后更加接近于源代码的形式展示反编译代码,这就需要借助dex2jar工具。

使用解压缩软件解压缩fire.apk文件,得到目录结构如下:

其中classes.dex文件是源码经过编译后得到的文件,dex2jar工具,通过对这个文件的反编译,得到后缀为.jar的文件。

将classes.dex拷贝到dex2jar的目录下,运行dex2jar classes.dex得到反编译结果文件:classes.dex.dex2jar.jar。

jd-gui的使用

解压文件jd-gui-0.3.3.windows.zip后得到jd_gui.exe文件,将上一步得到的后缀为.jar的文件用jd_gui.exe打开,可以看到类似于开发环境中的目录结果:

可以清楚的看到仿真打火机被嵌入了一个叫geinimi的包,这个包中包含了geinimi病毒的代码,打开geinimi包下面AdActivity文件,就可以看到类似于eclipse中的界面:

虽然经过代码混淆,一些方法名已经不能判断是什么含义,但是全局变量和Activity的类名还是能为我们学习代码提供重要的信息。

三 、分析一个Android病毒实例

对植入恶意代码的手机欢乐斗地主软件进行分析,该应用感染了Pjapps进行分析,首先采取上述的方法对应用进行逆向处理,得到逆向后的AndroidManifest.xml文件和.jar文件,这两个文件是分析恶意代码的主要依据。

1.分析AndroidManifest.xml文件

查看恶意代码申请的用户权限如下:

android.permission.INTERNET 访问网络的权限

android.permission.RECEIVE_SMS 短信接收权限

android.permission.SEND_SMS 短信发送权限

com.android.browser.permission.READ_HISTORY_BOOKMARKS 读浏览器的书签

com.android.browser.permission.WRITE_HISTORY_BOOKMARKS 写浏览器书签

android.permission.INSTALL_PACKAGES 安装package的权限

android.permission.WRITE_EXTERNAL_STORAGE 向存储卡写文件的权限

android.permission.READ_PHONE_STATE 读取手机状态的权限

    分析程序入口Activity以及后开开启的Service以及Receiver进一步分析恶意代码是如何劫持应用的。

首先查看程序的第一个Activity:

查看rainBow.Diz包下的Diz类的onCreat方法发现程序并没有跳转到其他包中的恶意代码段,判断这个恶意代码是通过服务或者Receiver启动的。于是检查Service和Receiver。


恶意代码定义了一个MainService,并且当android.intent.action.SIG_STR即电话信号强度的改变时会触发接收器ActionReceiver,又定义了一个SmsReceiver,当android.provider.Telephony.SMS_RECEIVED也就是收到短信时会触发这个接收器。

2.恶意代码行为分析

通过android.intent.action.SIG_STR响应事件,来启动广播接收com.android.main.ActionReceiver,在ActionReceiver中会启动MainService:

在启动的MainService中,恶意代码会有以下行为:

1.向浏览器书签中插入数据
主要通过判断当前服务中的变量ismark的值是否为1(默认为1),如果为1时,通过URI为content://browser/bookmarks,取得浏览器所有“书签”信息,然后通过ContentResolver中的insert方法向浏览器的书签中插入三条信息,此处插入的网址信息还通过相应函数进行编码,以防止被查杀,通过解析后得到的插入三条信息分别是。相关代码如下:

2.注册一个接收器SMSReceiver,启动事件为android.provider.Telephony.SMS_RECEIVED,用来执行写入手机的相关信息及访问指定网址。通过“phone”服务获得当前移动用户的IMEIIMSI、本机号码:

3.通过判断当前变量issend的值是否为1,如果为1,则向之前获取的所属网络的号码发送一条信息,内容为“801”,在发送的同时执行“com.test.sms.send”和“com.test.sms.delivery” 事件启动SMSReceiver广播接收器,发送完成之后将issend值设置为0,表示成功后不再执行,并将设置之后执行的内容的休眠事件。具体代码示例如下:

4.SMSReceiver获得的Action为接受短消息android.provider.Telephony.SMS_RECEIVED事件时,通过getServiceCenterAddress()来获取短信服务中心号码(当前移动用户设置的),通过getDisplayOriginatingAddress()获得发送信息的号码,通过getDisplayMessageBody()获得接受的信息内容,判断其发送信息的号码是否为“100”开头,判断其服务中心的号码是否存在,不存在就读取手机卡上之前存储在“ /sdcard/androidh.log”中的短信中心的号码,并将其写入“ /sdcard/androidh.log”中,直到短信中心号码匹配及存在之后,将其获得的一些变量做为参数去访问 “http://android188.com: 9033/window.log”,此处的地址同样被编译成乱序字符组成的字符串,目的实现免被查到,需通过相关方法进行转化。具体代码示例如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值