梆梆SDKs詳細分析(1) - 防界面劫持SDK

作 者: bighacker
時 間: 2016-02-06,15:15:25
鏈 接: http://bbs.pediy.com/showthread.php?t=207676

前言
     前段時間,國外知名的安全公司fireeye發表了一篇病毒分析文章,講述的主角是一個專門針對手機銀行的android手機病毒。文章鏈接如下:https://www.fireeye.com/blog/threat-research/2015/12/slembunk_an_evolvin.html。這個手機病毒變種甚多,影響廣泛,也不乏一些高端技術的應用。其中有一個很有意思的特性,就是它可以劫持手機銀行的登錄界面,從而盜取受害者的銀行賬號、密碼。
    看完fireeye這篇精彩的分析文章之後,我對這個病毒使用的一些技術很感興趣,無奈沒有找到樣本,不能自己動手分析,因此也只能作罷。
    事情過了大概一兩個月,有一次和朋友出去吃飯聊起這個病毒的一些特性。友人說,你說的這個技術梆梆就有啊,而且他們還出了一個防禦界面劫持的SDK呢。聽完我甚是欣喜,於是就有了接下來對梆梆SDK的分析。下面分析的SDK均可以在梆梆的SDK主頁上下載到。http://www.bangcle.com/solution/sdk-center/。

梆梆防界面劫持SDK
界面劫持概述
    界面劫持通俗來說就是病毒或木馬在後臺實時監控某個窗口的產生,例如QQ、支付寶、手機銀行等軟件的登錄界面。一旦發現目標窗口出現,病毒就馬上創建一個跟目標窗口一毛一樣的窗體來覆蓋在它之上。
    當發生界面劫持時,用戶在無察覺的情況下將自己的賬號、密碼信息輸入到仿冒界面中,惡意程序再把這些數據上報到其自身服務器,這個過程便是釣魚攻擊。
    界面劫持具有病毒製作成本低(技術含量低)、用戶難察覺、殺毒軟件不易查殺等特點而被廣泛使用。早在PC時代該技術就已經很成熟了,當時比較出名的是“QQ粘蟲病毒”,此病毒看名字就已經通俗易懂了,主要是被用來盜取受害者的QQ賬號密碼。

SDK預覽
    梆梆的防界面劫持SDK裏面提供了兩個APK,一個是防界面劫持demo,我們可以稱它爲demo1,界面如圖1。從圖中可以看出,梆梆的SDK提供了基類和接口兩種方式來防禦界面劫持。
點擊圖片以查看大圖圖片名稱: Screenshot_2016-02-05-10-32-22.png查看次數: 2文件大小: 92.5 KB文件 ID : 103041
圖1

    另一個就是界面劫持demo,我們可以稱它爲demo2,界面如圖2所示。它的功能比較簡單,就是啓動和關閉界面劫持。
點擊圖片以查看大圖圖片名稱: Screenshot_2016-02-05-10-33-03.png查看次數: 0文件大小: 45.3 KB文件 ID : 103042
圖2

    梆梆想的還是蠻周到的,提供了攻、防兩個程序。Demo2開啓功能後可以劫持demo1產生的窗口。Demo1檢測到界面劫持之後會給用戶一個提示,“疑似非本應用界面,請注意!!!”。如圖3。
點擊圖片以查看大圖圖片名稱: Screenshot_2016-02-05-10-46-33.png查看次數: 2文件大小: 390.4 KB文件 ID : 103043
圖3

逆向分析
    看完了梆梆SDK的功能演示,我覺得他們這技術很是新奇,於是準備逆向分析之。反編譯界面劫持demo的時候發現該APK加了梆梆的殼,無奈手工脫殼,接着分析。(對梆梆加固的APK脫殼感興趣的同學可以留個言,後面可以考慮出一篇怎麼脫梆梆殼的文章)
    在理解梆梆防界面劫持SDK原理之前,我們先來了解下android程序中onPause方法的一些知識。
    onPause方法用於由一個Activity轉到另一個Activity、設備進入休眠狀態(屏幕鎖住了)、或者有dialog彈出時由系統通知程序的一個方法。此時,我們的android程序知道自己的窗體發生切換了。在這個方法裏面,開發者可以保存一些必要的窗體狀態信息。
    當界面劫持發生時,正常APP的登錄界面會被病毒程序的仿冒界面覆蓋,即上述所說的一個Activity轉到另一個Activity,此時正常APP的onPause方法會被調用。因此,梆梆的界面劫持SDK在onPause階段檢查頂層窗口即可判斷是否被劫持了。
梆梆防界面劫持SDK的代碼非常簡單,逆向出來的源碼不足百行,已經自測功能正常,大致如下:
代碼:
public class MyBaseActivity extends Activity {
  private static Set set = new HashSet();
  private boolean b = true;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    if (set.size() == 0) {
      try {
        InputStream is = getAssets().open("white.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        while (true) {
          String write = br.readLine();
          if (write == null) {
            break;
          }
          
          set.add(write);
        }
        
        is.close();
        br.close();
      }
      catch (IOException exp) {
        exp.printStackTrace();
      }
    }
    
    set.add(getPackageName());
    super.onCreate(savedInstanceState);
  }
  
  protected void onPause() {
        if(b) {
            String packagename = ((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)).
                getRunningTasks(1).get(0).topActivity.getPackageName();
            
            if(!set.contains(packagename)) {
                String msg = "疑似界面劫持攻擊,請小心使用,並查殺病毒!";
                Toast toast = Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG);
                toast.setGravity(17, 0, 0);
                toast.show();
                b = false;
            }
        }
        
        b = true;

        super.onPause();
    }
}
SDK的不足之處
    逆完了梆梆的防界面劫持SDK之後,我覺得他們的這個檢測方法並不是很好,主要有以下幾點不足之處:
1. 誤報多。
    因爲梆梆是在onPause的時候檢測頂層窗口是不是自己的,如果不是,就開始報警。所以說,只要是窗口發生切換,不論是不是界面劫持它都會報警。爲了證明我的猜測,我用Android Studio生成了一個完全沒有功能的Hello World測試程序,之後點擊“Run”按鈕來啓動程序。如圖4。
點擊圖片以查看大圖圖片名稱: 無標題.png查看次數: 2文件大小: 120.1 KB文件 ID : 103045
圖4
    稍等片刻之後,Android Studio會啓動我們的測試程序。與此同時,窗體會發生切換,由梆梆的防界面劫持demo切到了我們的測試程序界面。此時,梆梆的防界面劫持demo就發出報警了,說有界面劫持發生。這是一個典型的誤報。如圖5所示。而且類似這樣的界面切換操作,在android機器上是很容易發生的,因此多誤報在所難免。
點擊圖片以查看大圖圖片名稱: Screenshot_2016-02-05-13-54-12.png查看次數: 3文件大小: 80.1 KB文件 ID : 103044
圖5
    顯然,梆梆也意識到了誤報多這個問題了。於是,他們在SDK中加入了一些白名單,主要根據包名來過濾,如果是白名單中的程序就不報警了。白名單如圖6所示。
點擊圖片以查看大圖圖片名稱: 無標題1.png查看次數: 0文件大小: 178.8 KB文件 ID : 103046
圖6

2. 容易被繞過。
    既然有了白名單,那麼無疑是增加了被繞過的機率。例如圖6中的com.sonyericsson.*,這些程序只有在索尼的機器上纔會有。那麼病毒木馬只要把自己命名成com.sonyericsson.home,就可以在諸如小米、華爲、三星這樣的手機上繞過梆梆防界面劫持SDK的檢測了。

3. 僅支持android 5.0以下機型。
    由上面我逆向出來的代碼中可以看出,梆梆防界面劫持SDK主要是通過getRunningTasks這個函數來獲取頂層窗口對應的包名的。然而這個函數存在泄露用戶個人信息的風險,因此在android 5.0以後google就不讓第三方程序使用該API了。Google的文檔中也寫的很清楚了,如圖7所示。
點擊圖片以查看大圖圖片名稱: 無標題2.png查看次數: 2文件大小: 65.8 KB文件 ID : 103047
圖7

總結
    通過逆向梆梆的防界面劫持SDK,我對android上的界面劫持技術有了一個更深入的瞭解。另外,梆梆在android安全方面有很多的技術儲備,如果能很好的解決上述三個不足之處,那應該能造福不少的android用戶。

pdf文檔:
梆梆SDKs詳細分析 - 防界面劫持SDK.zip.*轉載請註明來自看雪論壇@PEdiy.com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章