[Soot-list] can't find method when I use sootclass.getmethod

Steven Arzt Steven.Arzt at cased.de
Mon Jun 2 09:02:03 EDT 2014


Hi Jin,

 

If you explicitly set Soot’s classpath, you overwrite the default one. This means that you also need to explicitly add the android.jar file to the classpath. Soot would normally do that for you, but you overwrite the classpath. So on Windows this would be “-cp <whatEverGoesHere>;<pathToAndroidJar>”, on Linux it’s a colon as the divider instead of the semicolon.

 

Best regards,

  Steven

 

Von: soot-list-bounces at CS.McGill.CA [mailto:soot-list-bounces at CS.McGill.CA] Im Auftrag von Jin Li
Gesendet: Montag, 2. Juni 2014 14:59
An: Steven Arzt
Cc: soot-list at cs.mcgill.ca
Betreff: Re: [Soot-list] can't find method when I use sootclass.getmethod

 

Hi Steven,

Follow your advice, I set the Soot classpath using  "-soot-classpath . "  the fisrt exception is solved, but I enconter another exception,

Exception in thread "main" java.lang.RuntimeException: tried to get nonexistent field <java.lang.System: java.io.PrintStream out>
    at soot.Scene.getField(Scene.java:606)
    at AndroidInstrument$1$1.caseInvokeStmt(AndroidInstrument.java:72)
    at soot.jimple.internal.JInvokeStmt.apply(JInvokeStmt.java:100)
    at AndroidInstrument$1.internalTransform(AndroidInstrument.java:62)
    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:899)
    at soot.PackManager.runBodyPacks(PackManager.java:584)
    at soot.PackManager.runBodyPacks(PackManager.java:487)
    at soot.PackManager.runPacksNormally(PackManager.java:464)
    at soot.PackManager.runPacks(PackManager.java:388)
    at soot.Main.run(Main.java:203)
    at soot.Main.main(Main.java:146)
    at AndroidInstrument.main(AndroidInstrument.java:105)

 the exception cast from this line:

 units.insertBefore(Jimple.v().newAssignStmt( 
                                              tmpRef, Jimple.v().newStaticFieldRef( 
                                              Scene.v().getField("<java.lang.System: java.io.PrintStream out>").makeRef())), u);



 

 

2014-06-02 18:24 GMT+08:00 Steven Arzt <Steven.Arzt at cased.de>:

Hi Jin,

 

Please first check whether your class object getIdsClass is phantom (field isPhantom). If so, Soot was unable to find it on its classpath and has replaced it by a so-called phantom which is essentially an empty mockup. If this is the case, you need to check your Soot classpath. Otherwise, check the method list contained in the class object in the debugger to see whether your methods are there or not.

 

Best regards,

  Steven

 

Von: soot-list-bounces at CS.McGill.CA [mailto:soot-list-bounces at CS.McGill.CA] Im Auftrag von Jin Li
Gesendet: Montag, 2. Juni 2014 12:19
An: soot-list at CS.McGill.CA
Betreff: [Soot-list] can't find method when I use sootclass.getmethod

 




Hi All,

I am a beginner of soot. I want to instrument the android apk.  I read about the blog "http://www.bodden.de/2013/01/08/soot-android-instrumentation/ " . I want to print uid,pid,tid if the target of invocation is onDraw(). 

I wote a helper class:

import android.os.Process;
public class ThreadHelper {
    private static int uid,pid,tid;
    
    public  static void getIDs(){
        uid = Process.myUid();
        pid = Process.myPid();
        tid = Process.myTid();
    }
    
    public  static int getUid(){
        return uid;
    }
    public static  int getPid(){
        return pid;
    }
    public static int getTid(){
        return tid;
    }
    public static void reportIds(){
        System.out.println("uid is " + uid + "pid is " + pid + "tid is " + tid);
    }

}

In the AndroidIntrument.java,  I added some lines before iterate the patchchain.

               "  final SootClass getIdsClass;
                 final SootMethod getIds,getUid,getPid,getTid,reportIds;
                
                getIdsClass = Scene.v().loadClassAndSupport("ThreadHelper");
                getIds = getIdsClass.getMethod("void getIDs()");
                getUid = getIdsClass.getMethod("int getUid()");
                getPid = getIdsClass.getMethod("int getPid()");
                getTid = getIdsClass.getMethod("int getTid()");
                reportIds = getIdsClass.getMethod("void reportIds()");"

And then, when the target of the invocation is onDraw(), I insert some invocations.

                                InvokeExpr getExpr = Jimple.v().newStaticInvokeExpr(getIds.makeRef());                 
                                Stmt getStmt = (Stmt) Jimple.v().newInvokeStmt(getExpr);
                                units.insertBefore((Unit)getStmt, u);

However, When I run  java -cp .;soot.jar AndroidInstrument -force-android-jar android.jar -process-dir  my.apk

cast java.lang.RumtimeException: no method void getIDs() in class ThreadHelper.

I don't know the reason.  I need your help!

thanks a lot!

 

 




-- 
Jin Li 
Ph.D. Candidate
State Key Labratory of Computer Architecture
ICT, Chinese Academy of Sciences

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20140602/7936a8da/attachment-0001.html 


More information about the Soot-list mailing list