日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

xposed伪造收到短信

發(fā)布時(shí)間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xposed伪造收到短信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android 4.4 之后,開(kāi)發(fā)者不能直接往短信數(shù)據(jù)庫(kù)添加短信了,只有系統(tǒng)默認(rèn)的短信應(yīng)用才能在收件箱中添加短信,除非將自己的應(yīng)用設(shè)置為默認(rèn)短信應(yīng)用,當(dāng)這種方法不太實(shí)用,因?yàn)闆](méi)有那個(gè)用戶(hù)愿意修改自己的默認(rèn)短信應(yīng)用,即便是臨時(shí)的也不靠譜。爬了一堆坑之后勉強(qiáng)找到一個(gè)行之有效的方法。

思路

在不改變默認(rèn)短信的情況下,通過(guò)發(fā)送廣播,告訴短信應(yīng)用收到短信了,然后再通過(guò)xposed劫持短信內(nèi)容intent里的參數(shù),將參數(shù)修改為系統(tǒng)接收到短信時(shí)的參數(shù)格式,這樣便能成功偽造短信了。當(dāng)然,你也可以直接在發(fā)送廣播時(shí)將系統(tǒng)接收到短信時(shí)的參數(shù)格式帶進(jìn)去,但這樣得事先編輯好參數(shù),而且參數(shù)內(nèi)容會(huì)非常長(zhǎng),很麻煩,尤其是在終端直接發(fā)送廣播時(shí),這種方法就不適用了。

發(fā)送廣播

下面開(kāi)始具體的過(guò)程

首先,發(fā)送廣播必須通過(guò)命令行來(lái)發(fā)送,直接通過(guò)代碼會(huì)出現(xiàn)沒(méi)有權(quán)限的錯(cuò)誤,并且通過(guò)命令行發(fā)送前,必須先輸入“su”來(lái)獲取root權(quán)限,否則短信會(huì)接收不到廣播

am broadcast -a android.provider.Telephony.SMS_DELIVER -n com.android.messaging/.receiver.SmsDeliverReceiver //后面接具體參數(shù)

我這里是先發(fā)送廣播給SmsDeliverReceiver 類(lèi),因?yàn)槎绦抛钕冉邮盏綇V播的就是這個(gè)類(lèi),然后才會(huì)發(fā)送給 receiver.SmsReceiver 類(lèi)。參數(shù)有三個(gè):sender、receiver、message,參數(shù)名可以自己定義,分別代表發(fā)送人手機(jī)號(hào),接收人手機(jī)號(hào)和短信內(nèi)容。

xposed劫持

finalClass aClass = XposedHelpers.findClass("com.android.messaging.receiver.SmsReceiver", lpparam.classLoader);XposedBridge.hookAllMethods(aClass,"deliverSmsIntent",newXC_MethodHook() {@Overrideprotected voidbeforeHookedMethod(MethodHookParam param)throwsThrowable {super.beforeHookedMethod(param);Log.e("hock_sms","hookAllMethods--------開(kāi)始劫持接收到的短信");Intent it = (Intent) param.args[1];byte[] pdu =new byte[0];try{String sender =null;try{sender = it.getStringExtra("sender");}catch(Exception e) {e.printStackTrace();}String receiver =null;try{receiver = it.getStringExtra("receiver");}catch(Exception e) {e.printStackTrace();}String message =null;try{message = it.getStringExtra("message");}catch(Exception e) {return;}pdu = SmsUtils.createPduSms(sender, receiver, message);//將參數(shù)轉(zhuǎn)換為pdu byte數(shù)組}catch(Exception e) {e.printStackTrace();}Intent intent =newIntent();intent.setAction(ACTION);Bundle bundle =newBundle();byte[][] b =new byte[1][1];b[0] = pdu;bundle.putString("format","3gpp");bundle.putSerializable("pdus", b);bundle.putString("slot","0");bundle.putString("phone","0");bundle.putString("subscription","2");intent.putExtras(bundle);param.args[1] = intent;}});

短信的參數(shù)中 "format","slot","phone","subscription" 一般沒(méi)什么變化,具體作用沒(méi)細(xì)究,可以寫(xiě)死。而最重要的一個(gè)參數(shù)便是 "pdus",它是一個(gè)二維byte數(shù)組,其中每個(gè)數(shù)組代表一條短信,pdus里包含一個(gè)或多個(gè)pdu byte數(shù)組。偽造短信最核心的就是如何將發(fā)送人、接收人和短信內(nèi)容轉(zhuǎn)化成固定格式的byte數(shù)組了,直接采用getByte() 方法是行不通的,必須采用特定格式的方法才行。轉(zhuǎn)化方式如下:

public static byte[] createPduSms(String sender,String receiver, String body) {//Source: http://stackoverflow.com/a/12338541//Source: http://blog.dev001.net/post/14085892020/android-generate-incoming-sms-from-within-your-appsender =phoneTpye(sender);receiver =phoneTpye(receiver);byte[] pdu =null;byte[] scBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(receiver);byte[] senderBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(sender);intlsmcs = scBytes.length;byte[] dateBytes =new byte[7];Calendar calendar =newGregorianCalendar();dateBytes[0] =reverseByte((byte) (calendar.get(Calendar.YEAR)));dateBytes[1] =reverseByte((byte) (calendar.get(Calendar.MONTH) +1));dateBytes[2] =reverseByte((byte) (calendar.get(Calendar.DAY_OF_MONTH)));dateBytes[3] =reverseByte((byte) (calendar.get(Calendar.HOUR_OF_DAY)));dateBytes[4] =reverseByte((byte) (calendar.get(Calendar.MINUTE)));dateBytes[5] =reverseByte((byte) (calendar.get(Calendar.SECOND)));dateBytes[6] =reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / (60*1000*15)));try{ByteArrayOutputStream bo =newByteArrayOutputStream();bo.write(lsmcs);bo.write(scBytes);bo.write(0x04);bo.write((byte) sender.length());bo.write(senderBytes);bo.write(0x00);try{String sReflectedClassName ="com.android.internal.telephony.GsmAlphabet";Class cReflectedNFCExtras = Class.forName(sReflectedClassName);Method stringToGsm7BitPacked = cReflectedNFCExtras.getMethod("stringToGsm7BitPacked",newClass[] { String.class});stringToGsm7BitPacked.setAccessible(true);byte[] bodybytes = (byte[]) stringToGsm7BitPacked.invoke(null, body);bo.write(0x00);// encoding: 0 for default 7bitbo.write(dateBytes);bo.write(bodybytes);}catch(Exception e) {try{// try UCS-2byte[] bodybytes =encodeUCS2(body,null);bo.write(0x08);// encoding: 0x08 (GSM_UCS2) for UCS-2bo.write(dateBytes);bo.write(bodybytes);}catch(UnsupportedEncodingException uex) {Log.e(TAG, String.format("String '%s' encode unknow", body));}}pdu = bo.toByteArray();}catch(IOException e) {}returnpdu;}private static bytereverseByte(byteb) {return(byte) ((b &0xF0) >>4| (b &0x0F) <<4);} private staticString phoneTpye(String phone){if(TextUtils.isEmpty(phone)){return"00000000000";}returnphone.length()==11?"+86"+phone:phone;} private static byte[] encodeUCS2(String message,byte[] header)throwsUnsupportedEncodingException {byte[] userData, textPart;textPart = message.getBytes("utf-16be");if(header !=null) {// Need 1 byte for UDHLuserData =new byte[header.length+ textPart.length+1];userData[0] = (byte)header.length;System.arraycopy(header,0, userData,1, header.length);System.arraycopy(textPart,0, userData, header.length+1, textPart.length);}else{userData = textPart;}byte[] ret =new byte[userData.length+1];ret[0] = (byte) (userData.length&0xff);System.arraycopy(userData,0, ret,1, userData.length);returnret;}

具體怎么實(shí)現(xiàn)的我就不多說(shuō)了,直接套用就行,只要調(diào)用createPduSms() 就可以成功轉(zhuǎn)化,其他幾個(gè)方法只是輔助方法而已。

結(jié)束

到此,便可以成功偽造短信了,插件安裝重啟手機(jī)后,就可以通過(guò)在終端發(fā)送廣播或者在應(yīng)用中通過(guò)命令行發(fā)送廣播就可以實(shí)現(xiàn)偽造接收到短信了。



總結(jié)

以上是生活随笔為你收集整理的xposed伪造收到短信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。