Advertisement
Guest User

CallGraph with no main

a guest
Apr 18th, 2013
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.66 KB | None | 0 0
  1. package doAnalysis;
  2.  
  3. import java.util.*;
  4.  
  5. import soot.*;
  6. import soot.jimple.toolkits.callgraph.*;
  7. import soot.options.Options;
  8.  
  9. public class MyCallGraph {
  10.         static String[] allClasses = { "doAnalysis.FieldAccessible","java.lang.reflect.Fields" };
  11.         static List<String> libDir = Arrays.asList("/home/jalilos/Documents/lib.jar");
  12.        
  13.  
  14.         public static ArrayList<SootMethod> getAllMethods() {
  15.                 ArrayList<SootMethod> entrypoints = new ArrayList<SootMethod>();
  16.                 for (String klass : allClasses) {
  17.                         // klass such as org.abc.MyClass
  18.  
  19.                         Scene.v().forceResolve(klass, SootClass.SIGNATURES);
  20.                         SootClass soot_class = Scene.v().getSootClass(klass);
  21.  
  22.                         // adding all non-abstract method as entrypoint
  23.                         for (SootMethod m : soot_class.getMethods()) {
  24.                                 if (!m.isAbstract()) {
  25.                                         entrypoints.add(m);
  26.                                 }
  27.                         }
  28.                 }
  29.                 return entrypoints;
  30.         }
  31.         public static SootMethod getMethod(SootClass soot_class, String subsig) {
  32.                 SootClass base_class = soot_class;
  33.                 while (true) {
  34.                         if (soot_class.declaresMethod(subsig)) {
  35.                                 return soot_class.getMethod(subsig);
  36.                         }
  37.                         if (soot_class.hasSuperclass()) {
  38.                                 soot_class = soot_class.getSuperclass();
  39.                         }
  40.                         else {
  41.                                 System.out.println("cannot find method: " + subsig + " in "
  42.                                                 + base_class.getName());
  43.                                 System.exit(0);
  44.                         }
  45.                 }
  46.         }
  47.  
  48.         public static void main(String[] args) {
  49.                 //System.out.println(libDir); //C:\Users\Jalil0s\Desktop\eclipse\JALILOS\SOOT\lib
  50.                 Options.v().set_whole_program(true);
  51.                 //Options.v().set_process_dir(libDir); //library dir
  52.                 Options.v().set_soot_classpath("../rt.jar:"+libDir+":../jce.jar:.");
  53.                 // library dir along with rt.jar/jce.jar from JRE/JDK
  54.  
  55.                 Scene.v().setEntryPoints(getAllMethods());
  56.                 Scene.v().loadNecessaryClasses();
  57.                 PackManager.v().getPack("wjtp").apply();
  58.  
  59.                 PackManager.v().getPack("wjtp")
  60.                                 .add(new Transform("wjtp.myTrans", new SceneTransformer() {
  61.  
  62.                                         @Override
  63.                                         protected void internalTransform(String phaseName,
  64.                                                         Map options) {
  65.                                                 CHATransformer.v().transform();
  66.                                         }
  67.                                 }));
  68.  
  69.                 SootClass soot_class = Scene.v().getSootClass("java.lang.reflect.Field");
  70.                 SootMethod tgt = getMethod(soot_class, "void setAccessible(boolean)");
  71.                 CallGraph cg = Scene.v().getCallGraph();
  72.  
  73.                 @SuppressWarnings("unchecked")
  74.                 Iterator<MethodOrMethodContext> source = new Sources(cg.edgesInto(tgt));
  75.                 while (source.hasNext()) {
  76.                         SootMethod src = (SootMethod) source.next();
  77.                         // System.out.println(tgt + " may call " + src);
  78.                         System.out.println(src);
  79.                 }
  80.  
  81.         }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement