[Soot-list] Inserting Log.i() in jimple..

Modhi Alsobiehy m99m20 at hotmail.com
Mon Sep 1 03:15:41 EDT 2014


Hi all,


I am trying to insert jimple statement to log some calls in android apks.
the statement is a regular andoid Log.i() statement,,
I followed the following tutorials:
http://www.sable.mcgill.ca/soot/tutorial/profiler/
http://www.bodden.de/2013/01/08/soot-android-instrumentation/
However, I'm getting the following exceptions, the first one occurs when I remove loadClassAndSupport("android.util.Log") call,,
the second exception occurs when the loadClassAndSupport("android.util.Log") statement is present.



I checked the classpath and every required jar is present in the buildpath of the project [recent soot-trunk and android jars],,


1- is the code I am using to insert the Log.i() statement correct??
2- if it correct, why I'm getting these exceptions?


Your quick response is highly appreciated!


Thank you,,
Modhi



Exceptions:
------------


1) Exception in thread "main" java.lang.RuntimeException: tried to get nonexistent field <android.util.Log: int i>
 at soot.Scene.getField(Scene.java:611)
 at androidInstrument.AndroidInstrument$1$1.caseInvokeStmt(AndroidInstrument.java:78)
 at soot.jimple.internal.JInvokeStmt.apply(JInvokeStmt.java:100)
 at androidInstrument.AndroidInstrument$1.internalTransform(AndroidInstrument.java:60)
 at soot.BodyTransformer.transform(BodyTransformer.java:51)
 at soot.Transform.apply(Transform.java:105)
 at soot.BodyPack.internalApply(BodyPack.java:49)
 at soot.Pack.apply(Pack.java:126)
 at soot.PackManager.runBodyPacks(PackManager.java:903)
 at soot.PackManager.runBodyPacks(PackManager.java:583)
 at soot.PackManager.runBodyPacks(PackManager.java:486)
 at soot.PackManager.runPacksNormally(PackManager.java:463)
 at soot.PackManager.runPacks(PackManager.java:389)
 at soot.Main.run(Main.java:203)
 at soot.Main.main(Main.java:146)
 at androidInstrument.AndroidInstrument.main(AndroidInstrument.java:126)


2) Exception in thread "main" soot.SootResolver$SootClassNotFoundException: couldn't find class: android.util.Log (is your soot-class-path set properly?)
 at soot.SootResolver.bringToHierarchy(SootResolver.java:219)
 at soot.SootResolver.bringToSignatures(SootResolver.java:255)
 at soot.SootResolver.processResolveWorklist(SootResolver.java:168)
 at soot.SootResolver.resolveClass(SootResolver.java:129)
 at soot.Scene.loadClass(Scene.java:673)
 at soot.Scene.loadClassAndSupport(Scene.java:658)
 at androidInstrument.AndroidInstrument.main(AndroidInstrument.java:40)




Code snippets:
----------------
   G.reset();
   final String androidJar = "D:/AndroidADT/adt-bundle-windows-x86_64-20131030/sdk/platforms/";
  
   List<String> argsList = new ArrayList<String>(Arrays.asList(args)); 
   
   Scene.v().loadClassAndSupport("android.util.Log");
  
   Scene.v().addBasicClass("android.util.Log",SootClass.SIGNATURES);
          Scene.v().addBasicClass("java.lang.System",SootClass.SIGNATURES);
         
         PackManager.v().getPack("jtp").add(new Transform("jtp.myInstrumenter", new MyBodyTransformer()
         {
   @Override
   protected void internalTransform(final Body b, String phaseName, Map options) 
   {
    final PatchingChain<Unit> units = b.getUnits();
    
    
    //using snapshotIterator
     
    for(Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();) 
    {
      final Unit u = iter.next();
            
      u.apply(new AbstractStmtSwitch() 
      {
       
       public void caseInvokeStmt(InvokeStmt stmt) 
       {
        
        if(stmt.toString().equals(targetStmt))
        { 
         Local tmpRef = addTmpRef(b);
         
         Local tmpString1 = addTmpString1(b);
         Local tmpString2 = addTmpString2(b);
                  
           // inserting "tmpRef = android.util.Log.i;" 
               units.insertAfter(Jimple.v().newAssignStmt( 
                             tmpRef, Jimple.v().newStaticFieldRef( 
                             Scene.v().getField("<android.util.Log: int i>").makeRef())), u);


               // inserting "tmpString1 = stmt.getUseBoxes().toString();" 
               String stmtStr = stmt.getUseBoxes().toString();
               units.insertAfter(Jimple.v().newAssignStmt(tmpString1,
                             StringConstant.v(stmtStr)), u);
        // inserting "tmpString2 = stmt.getUseBoxes().get(1).getValue().toString();" 
               stmtStr = stmt.getUseBoxes().get(1).getValue().toString();
               units.insertAfter(Jimple.v().newAssignStmt(tmpString2,
                            StringConstant.v(stmtStr)), u);
               
               // insert "tmpRef.i(tmpString1,tmpString2);" 
               SootMethod toCall = Scene.v().getSootClass("android.util.Log").getMethod("int i(java.lang.String,java.lang.String");                    
               units.insertAfter(Jimple.v().newInvokeStmt(
                             Jimple.v().newVirtualInvokeExpr(tmpRef, toCall.makeRef(), tmpString1, tmpString2 )), u);
               
               //check that we did not mess up the Jimple
               b.validate();

---------------
Other methods:         
---------------
  static Local addTmpRef(Body body)
   {
   Local tmpRef = Jimple.v().newLocal("tmpRef", RefType.v("android.util.Log"));
   body.getLocals().add(tmpRef);
   return tmpRef;
   }
      
   static Local addTmpString1(Body body)
   {
    Local tmpString = Jimple.v().newLocal("tmpString1", RefType.v("java.lang.String"));
    body.getLocals().add(tmpString);
    return tmpString;
   }


  static Local addTmpString2(Body body)
   {
    Local tmpString = Jimple.v().newLocal("tmpString2", RefType.v("java.lang.String"));
    body.getLocals().add(tmpString);
    return tmpString;
   }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20140901/b33c5d17/attachment-0002.html 


More information about the Soot-list mailing list