使用Soot分析jar包,构建Call Graph

背景

soot没有提供直接对jar进行分析的API [1],需将jar包解压,然后调用 Options.v().set_process_dir() 方法,设置分析目录,该目录是解压所得的class文件(注意保持层次结构)。

期间需要注意两点:

1. 需将class文件加入soot_class_path;

2. 先设置mainClass,后加载necessaryClasses。

核心代码

public static void main(String[] args) {
    //spotbugs -- testing
    String classesDir = "D:\wkspace\seed8\dir\spotbugs";
    String mainClass = "edu.umd.cs.findbugs.LaunchAppropriateUI";

    //set classpath
    String jreDir = System.getProperty("java.home") + "\lib\jce.jar";
    String jceDir = System.getProperty("java.home") + "\lib\rt.jar";
    String path = jreDir + File.pathSeparator + jceDir + File.pathSeparator + classesDir;
    Scene.v().setSootClassPath(path);

    //add an intra-procedural analysis phase to Soot
    TestCallGraphSootJar_3 analysis = new TestCallGraphSootJar_3();
    PackManager.v().getPack("wjtp").add(new Transform("wjtp.TestSootCallGraph", analysis));

    excludeJDKLibrary();

    Options.v().set_process_dir(Arrays.asList(classesDir));
    Options.v().set_whole_program(true);

    SootClass appClass = Scene.v().loadClassAndSupport(mainClass);
    Scene.v().setMainClass(appClass);
    Scene.v().loadNecessaryClasses();

// 或
    /* Scene.v().loadNecessaryClasses();
SootClass sc = Scene.v().getSootClass(mainClass);
Scene.v().setMainClass(sc);*/
    //enableCHACallGraph();  
enableSparkCallGraph();
PackManager.v().runPacks();
}

enableSparkCallGraph等方法请参考该post

另外,可以模拟命令行模式,然后调用soot.main.Main,详见[3]。

————————————————

参考文献

[1] https://github.com/Sable/soot/issues/1289

[2] https://o2lab.github.io/710/p/TestSootCallGraph.java

[3] https://groups.google.com/forum/#!topic/soot-list/jcHrdhzJyl0

原文地址:https://www.cnblogs.com/yuanxiuouc/p/12996319.html