背景
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