<div dir="ltr"><div><div><div><div><div><div>Hi all<br><br></div>I&#39;ve recently started working with soot to instrument Android apps. I am trying to add Log.i statements after every method invokeStmt in the app but am having some issues. It looks like Soot cannot find any of the android classes, as I am getting warning messages saying that these are all phantom. As such, my code then breaks when trying to add the Log methods as soot cannot see inside the phantom class. I&#39;ve tried both specifying the folder conatining all the android platforms (android-*) to android-jars and by forcing a specific jar. However neither of these have worked. Do you know what I am doing wrong?<br><br></div>Thanks<br><br></div>Ben<br><br></div>Error:<br>java.lang.RuntimeException: No method d in class android.util.Log<br>    at soot.SootClass.getMethod(SootClass.java:339)<br><br><br></div>command prompt:<br>java -cp /home/Tools/soot-trunk.jar:.:/home/Tools/Soot/baksmali-2.0.6.jar:/home/Downloads/smali-2.0.6.jar andRetLog  app-debug.apk<br><br><br></div>source code:<br><br><br>import java.util.Collections;<br>import java.util.Iterator;<br>import java.util.List;<br>import java.util.Map;<br><br>        import soot.Body;<br>import soot.BodyTransformer;<br>import soot.G;<br>import soot.Local;<br>import soot.PackManager;<br>import soot.PatchingChain;<br>import soot.RefType;<br>import soot.Scene;<br>import soot.SootClass;<br>import soot.SootMethod;<br>import soot.Transform;<br>import soot.Unit;<br>import soot.Value;<br>import soot.jimple.InvokeExpr;<br>import soot.jimple.InvokeStmt;<br>import soot.jimple.Jimple;<br>import soot.jimple.ReturnStmt;<br>import soot.jimple.Stmt;<br>import soot.jimple.StringConstant;<br>import soot.options.Options;<br>import soot.util.Chain;<br><br>        public class andRetLog {<br>            <br>            public static void main(String[] args) {<br>                G.reset();<br>                <br>                //initialise the options set<br>                //Options.v().set_android_jars(&quot;/home/android-sdk-linux/platforms/&quot;);<br>                Options.v().set_force_android_jar(&quot;/home/android-sdk-linux/platforms/android-17/android.jar&quot;);<br>                Options.v().set_soot_classpath(&quot;.:/usr/lib/jvm/java-7-oracle/jre/lib/rt.jar&quot;);<br>                Options.v().set_process_dir(Collections.singletonList(&quot;/home/ben/AndroidStudioProjects/Bbutton/app/app-debug.apk&quot;));<br>                Options.v().set_allow_phantom_refs(true);<br>                Options.v().set_output_dir(&quot;/home/AndroidStudioProjects/Bbutton/app/sootOutput/&quot;);<br>                //prefer Android APK files// -src-prec apk<br>                Options.v().set_src_prec(Options.src_prec_apk);<br>                //Options.v().set_src_prec(Options.src_prec_jimple);<br>                //output as APK, too//-f J<br>                Options.v().set_output_format(Options.output_format_jimple);<br>                //Options.v().set_output_format(Options.output_format_dex);<br>                <br>                // resolve the PrintStream and System soot-classes<br>                //Scene.v().addBasicClass(&quot;java.io.PrintStream&quot;,SootClass.SIGNATURES);<br>                //Scene.v().addBasicClass(&quot;java.lang.System&quot;,SootClass.SIGNATURES)<br>                //imports logs and strings so that these are included <br>                Scene.v().addBasicClass(&quot;android.util.Log&quot;,SootClass.SIGNATURES);<br>                //Scene.v().addBasicClass(&quot;android.util.String&quot;,SootClass.SIGNATURES);   <br>                PackManager.v().getPack(&quot;jtp&quot;).add(new Transform(&quot;jtp.myInstrumenter&quot;, new BodyTransformer() {<br>                    @Override<br>                    protected void internalTransform(final Body b, String phaseName, @SuppressWarnings(&quot;rawtypes&quot;) Map options) {<br>                        final PatchingChain&lt;Unit&gt; units = b.getUnits();<br>                        SootMethod log = Scene.v().getSootClass(&quot;android.util.Log&quot;).getMethod(&quot;i&quot;);<br>                        <br>                        //important to use snapshotIterator here<br>                        <br>                        for(Iterator&lt;Unit&gt; iter = units.snapshotIterator(); iter.hasNext();) {<br>                            <br>                            Stmt s = (Stmt) iter.next();<br>                            <br>                            if(s instanceof InvokeStmt || s instanceof ReturnStmt){<br>                                //make new static invokement<br>                                InvokeExpr invokeExpr = Jimple.v().newStaticInvokeExpr(log.makeRef(), (StringConstant.v(&quot;qwerty12345&quot;)),StringConstant.v(&quot;-If you are reading this, it has worked&quot;));<br>                                // turn it into an invoke statement<br>                                  Stmt incStmt = Jimple.v().newInvokeStmt(invokeExpr);<br>                                //insert into chain<br>                                units.insertBefore(incStmt, s);        <br>                                        //.newAssignStmt(tmpRef, Jimple.v().newStaticFieldRef( <br>                                          //Scene.v().getField(&quot;&lt;java.lang.System: java.io.PrintStream out&gt;&quot;).makeRef())), s);<br><br>                                //<br>                            }<br>                                    <br>                        }<br>                    };<br><br>                //end of internalTransform declaration<br>                }));<br>                <br>                soot.Main.main(args);<br>            }<br>        }<br>    <br></div>