2016-10-04 42 views
0

我需要分析各種機器人的APK,發現執行意圖的方法,然後得到的意圖的動作名稱,比如「ACTION_VIEW」等- 使用菸灰Android的意圖分析

我能夠獲取所有相關的方法,如startActivity(),startActivityForResult()和onCreate()。但是我無法在相應的本地(Intent引用)中獲取動作名稱或常量。是否有可能將Intent.java類加載到Scene中(添加爲基本類已經這樣做了?),然後將Local轉換爲Intent對象? 或者你能推薦一種使用煤煙的完全不同的方法嗎?

下面我當前自定義菸灰類的列表:

Options.v().set_src_prec(Options.src_prec_apk); 
Options.v().set_whole_program(true); 
Options.v().set_output_format(Options.output_format_none); 

Scene.v().addBasicClass("java.lang.Object");   
Scene.v().addBasicClass("android.content.Intent"); 

    PackManager.v().getPack("jtp").add(new Transform("jtp.myInstrumenter", new BodyTransformer() { 

     @Override 
     protected void internalTransform(Body b, String phaseName, Map options) { 
      final PatchingChain<Unit> units = b.getUnits(); 

      //important to use snapshotIterator here 
      for(Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();) { 
       final Unit u = iter.next(); 
       u.apply(new AbstractStmtSwitch() { 

        // getting invoke statements 
        public void caseInvokeStmt(InvokeStmt stmt) { 
         InvokeExpr invokeExpr = stmt.getInvokeExpr(); 
         // getting intent respective methods 
         if(invokeExpr.getMethod().getName().equals("onCreate") || 
           invokeExpr.getMethod().getName().equals("startActivity") || 
           invokeExpr.getMethod().getName().equals("startActivityForResult")) { 

          System.out.println(invokeExpr.getMethod().getSignature()); 

          // get value 0, always an Intent in those methods 
          Value val = invokeExpr.getArg(0); // references Intent 
          if(val.getType() instanceof RefType) { 
           RefType rt = (RefType) val.getType(); 

           // Cast to android.content.Intent here.. 
           // Intent in = (Intent) val; 

           System.out.println(rt.getClassName()); 
          }  
         } 
        } 
       }); 
      } 
     } 
    })); 

輸出以下的一些例子APK:

<android.app.Activity: void startActivityForResult(android.content.Intent,int)> 
android.content.Intent 
<android.app.Activity: void startActivityForResult(android.content.Intent,int)> 
android.content.Intent 
<android.app.Activity: void startActivityForResult(android.content.Intent,int)> 
android.content.Intent 
<android.app.Activity: void onCreate(android.os.Bundle)> 
android.os.Bundle 
<android.content.Context: void startActivity(android.content.Intent)> 
android.content.Intent 

回答

0

你必須考慮到煙塵分析目標「靜態」。這意味着作爲參數傳遞的實際值不是(普通)可訪問的。你的代碼打印參數的類型(類android.content.Intent)。原因是Java(Dalvik或ART)字節碼是鍵入的。所以這個信息是靜態可用的。 如果您想檢索實際值,據我所知,您有兩種方法:切換到動態分析(例如,您可以測試調用並在測試期間打印其參數)或執行數據流分析。第二種方法我非常複雜,可擴展性差。 您可能想看看基於程序切片的技術或抽象解釋框架。