[Soot-list] All android classes appearing as phantom

Ben Westfield ben.westfield at googlemail.com
Fri Jun 26 13:22:13 EDT 2015


Hi all

I'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'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?

Thanks

Ben

Error:
java.lang.RuntimeException: No method d in class android.util.Log
    at soot.SootClass.getMethod(SootClass.java:339)


command prompt:
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


source code:


import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

        import soot.Body;
import soot.BodyTransformer;
import soot.G;
import soot.Local;
import soot.PackManager;
import soot.PatchingChain;
import soot.RefType;
import soot.Scene;
import soot.SootClass;
import soot.SootMethod;
import soot.Transform;
import soot.Unit;
import soot.Value;
import soot.jimple.InvokeExpr;
import soot.jimple.InvokeStmt;
import soot.jimple.Jimple;
import soot.jimple.ReturnStmt;
import soot.jimple.Stmt;
import soot.jimple.StringConstant;
import soot.options.Options;
import soot.util.Chain;

        public class andRetLog {

            public static void main(String[] args) {
                G.reset();

                //initialise the options set

//Options.v().set_android_jars("/home/android-sdk-linux/platforms/");

Options.v().set_force_android_jar("/home/android-sdk-linux/platforms/android-17/android.jar");

Options.v().set_soot_classpath(".:/usr/lib/jvm/java-7-oracle/jre/lib/rt.jar");

Options.v().set_process_dir(Collections.singletonList("/home/ben/AndroidStudioProjects/Bbutton/app/app-debug.apk"));
                Options.v().set_allow_phantom_refs(true);

Options.v().set_output_dir("/home/AndroidStudioProjects/Bbutton/app/sootOutput/");
                //prefer Android APK files// -src-prec apk
                Options.v().set_src_prec(Options.src_prec_apk);
                //Options.v().set_src_prec(Options.src_prec_jimple);
                //output as APK, too//-f J
                Options.v().set_output_format(Options.output_format_jimple);
                //Options.v().set_output_format(Options.output_format_dex);

                // resolve the PrintStream and System soot-classes

//Scene.v().addBasicClass("java.io.PrintStream",SootClass.SIGNATURES);

//Scene.v().addBasicClass("java.lang.System",SootClass.SIGNATURES)
                //imports logs and strings so that these are included

Scene.v().addBasicClass("android.util.Log",SootClass.SIGNATURES);

//Scene.v().addBasicClass("android.util.String",SootClass.SIGNATURES);
                PackManager.v().getPack("jtp").add(new
Transform("jtp.myInstrumenter", new BodyTransformer() {
                    @Override
                    protected void internalTransform(final Body b, String
phaseName, @SuppressWarnings("rawtypes") Map options) {
                        final PatchingChain<Unit> units = b.getUnits();
                        SootMethod log =
Scene.v().getSootClass("android.util.Log").getMethod("i");

                        //important to use snapshotIterator here

                        for(Iterator<Unit> iter = units.snapshotIterator();
iter.hasNext();) {

                            Stmt s = (Stmt) iter.next();

                            if(s instanceof InvokeStmt || s instanceof
ReturnStmt){
                                //make new static invokement
                                InvokeExpr invokeExpr =
Jimple.v().newStaticInvokeExpr(log.makeRef(),
(StringConstant.v("qwerty12345")),StringConstant.v("-If you are reading
this, it has worked"));
                                // turn it into an invoke statement
                                  Stmt incStmt =
Jimple.v().newInvokeStmt(invokeExpr);
                                //insert into chain
                                units.insertBefore(incStmt, s);
                                        //.newAssignStmt(tmpRef,
Jimple.v().newStaticFieldRef(

//Scene.v().getField("<java.lang.System: java.io.PrintStream
out>").makeRef())), s);

                                //
                            }

                        }
                    };

                //end of internalTransform declaration
                }));

                soot.Main.main(args);
            }
        }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20150626/c33fe6c5/attachment.html 


More information about the Soot-list mailing list