2016-10-04 41 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)字节码是键入的。所以这个信息是静态可用的。 如果您想检索实际值,据我所知,您有两种方法:切换到动态分析(例如,您可以测试调用并在测试期间打印其参数)或执行数据流分析。第二种方法我非常复杂,可扩展性差。 您可能想看看基于程序切片的技术或抽象解释框架。