Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package doAnalysis;
- import java.util.*;
- import soot.*;
- import soot.jimple.toolkits.callgraph.*;
- import soot.options.Options;
- public class MyCallGraph {
- static String[] allClasses = { "doAnalysis.FieldAccessible","java.lang.reflect.Fields" };
- static List<String> libDir = Arrays.asList("/home/jalilos/Documents/lib.jar");
- public static ArrayList<SootMethod> getAllMethods() {
- ArrayList<SootMethod> entrypoints = new ArrayList<SootMethod>();
- for (String klass : allClasses) {
- // klass such as org.abc.MyClass
- Scene.v().forceResolve(klass, SootClass.SIGNATURES);
- SootClass soot_class = Scene.v().getSootClass(klass);
- // adding all non-abstract method as entrypoint
- for (SootMethod m : soot_class.getMethods()) {
- if (!m.isAbstract()) {
- entrypoints.add(m);
- }
- }
- }
- return entrypoints;
- }
- public static SootMethod getMethod(SootClass soot_class, String subsig) {
- SootClass base_class = soot_class;
- while (true) {
- if (soot_class.declaresMethod(subsig)) {
- return soot_class.getMethod(subsig);
- }
- if (soot_class.hasSuperclass()) {
- soot_class = soot_class.getSuperclass();
- }
- else {
- System.out.println("cannot find method: " + subsig + " in "
- + base_class.getName());
- System.exit(0);
- }
- }
- }
- public static void main(String[] args) {
- //System.out.println(libDir); //C:\Users\Jalil0s\Desktop\eclipse\JALILOS\SOOT\lib
- Options.v().set_whole_program(true);
- //Options.v().set_process_dir(libDir); //library dir
- Options.v().set_soot_classpath("../rt.jar:"+libDir+":../jce.jar:.");
- // library dir along with rt.jar/jce.jar from JRE/JDK
- Scene.v().setEntryPoints(getAllMethods());
- Scene.v().loadNecessaryClasses();
- PackManager.v().getPack("wjtp").apply();
- PackManager.v().getPack("wjtp")
- .add(new Transform("wjtp.myTrans", new SceneTransformer() {
- @Override
- protected void internalTransform(String phaseName,
- Map options) {
- CHATransformer.v().transform();
- }
- }));
- SootClass soot_class = Scene.v().getSootClass("java.lang.reflect.Field");
- SootMethod tgt = getMethod(soot_class, "void setAccessible(boolean)");
- CallGraph cg = Scene.v().getCallGraph();
- @SuppressWarnings("unchecked")
- Iterator<MethodOrMethodContext> source = new Sources(cg.edgesInto(tgt));
- while (source.hasNext()) {
- SootMethod src = (SootMethod) source.next();
- // System.out.println(tgt + " may call " + src);
- System.out.println(src);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement