使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM