2016-10-04 1 views
0

Je dois analyser diverses APK android, trouver des méthodes qui exécutent les intentions et obtenir le nom de l'action de l'intention comme « ACTION_VIEW », etc.Utilisation de la suie pour Android analyse Intention

j'ai pu récupérer toutes les méthodes pertinentes comme startActivity(), startActivityForResult() et onCreate(). Mais je ne peux pas obtenir les noms d'action ou les constantes dans les sections locales correspondantes (référence Intent). Est-il en quelque sorte possible de charger la classe Intent.java dans la scène (est-ce que l'ajout comme classe de base le fait déjà?), Puis de convertir le Local en objet Intent. Ou pouvez-vous me recommander une approche différente complète en utilisant de la suie?

Ci-dessous une liste de ma classe actuelle de suie personnalisée:

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()); 
          }  
         } 
        } 
       }); 
      } 
     } 
    })); 

produit les éléments suivants pour un exemple 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 

Répondre

0

Vous devez considérer que les analyses Suie la cible « statiquement ». Cela signifie que les valeurs réelles passées en arguments ne sont pas (trivialement) accessibles. Votre code imprime le "type" de l'argument (Classe android.content.Intent). La raison en est que le bytecode Java (Dalvik ou ART) est typé. Donc, cette information est disponible statiquement. Si vous voulez récupérer les valeurs réelles, autant que je sache, vous avez deux possibilités: passer à l'analyse dynamique (par exemple, vous pouvez instrumenter l'appel et imprimer ses arguments pendant un test) ou effectuer une analyse de flux de données. La deuxième approche peut être très complexe et difficilement évolutive. Vous voudrez peut-être jeter un coup d'œil aux techniques basées sur le découpage de programmes ou aux cadres d'interprétation abstraits.