Soot的各个阶段
概述
Soot将执行过程分为几个不同的阶段Pack,每个Pack又分为不同的phase,在不同的过程中,你可以利用Soot完成你不同的任务。整个过程如下:
下面解释下各个过程。
jb
Jimple Body Creation,该过程中Soot会为程序中的所有包含方法体的method创建一个Body,因为并不是所有方法都有方法体,比如native方法。jb阶段的表示被固定为Jimple.
whole-program-pack
全局分析阶段,该阶段可以被分为四个具体的阶段,用于程序的全局分析。比如进行过程间数据分析或者构建精确的CG等。
- wjpp,即whole-jimple pre-processing pack。该阶段用于对于全局分析的预处理工作,改变IR以达到建立更加精确完整的调用图,比如插入一些模拟反射调用的方法等。
- cg,即调用图创建过程,soot提供了不同的调用图构建算法。
- wjtp,即whole-jimple transformation pack,该过程你可将将自己想要做的事插入该过程,比如进行过程间的程序分析,注意此时调用图已经创建好了。
- wjop,即 whole-jimple optimization pack,该阶段允许你实现代码优化或者根据你全局分析的结果做一些其他的事情。
- wjap,即whole-jimple annotation pack,进行些注解的工作。
所有以上的Pack都可以改变,你可以在这些阶段添加一个ScenceTransformer执行全局分析,例如下面的代码:
public static void main(String[] args) {
PackManager.v().getPack("wjtp").add(
new Transform("wjtp.myTransform", new SceneTransformer() {
protected void internalTransform(String phaseName,
Map options) {
System.err.println(Scene.v().getApplicationClasses());
}
}));
soot.Main.main(args);
}
再说一遍,当你进行分析时需要将soot设置为全局模式。默认情况下Soot时不会开启全局模式的。
jtp,jop,jap
接下来Soot会对每个Body进行下列阶段的处理:
jtp
即imple transformation pack,jtp默认是什么也不做。你可以在在该过程进行程序内的分析。
jop
该过程会进行一系列程序内的优化,默认是不开启的。
jap
该阶段为Jimple进行注解,让你或者其他人或者JVM知道优化的结果。默认情况下该阶段是开启的,但所有phase是默认关闭的。因此如果你添加了自己的分析他将会被自动开启。
下面的代码开启了空指针tagger,并且注册了一个BodyTransformer打印每个方法中每条语句的tag.
public static void main(String[] args) {
PackManager.v().getPack("jap").add(
new Transform("jap.myTransform", new BodyTransformer() {
protected void internalTransform(Body body, String phase, Map options) {
for (Unit u : body.getUnits()) {
System.out.println(u.getTags());
}
}
}));
Options.v().set_verbose(true);
PhaseOptions.v().setPhaseOption("jap.npc", "on");
soot.Main.main(args);
}
和全局分析不同,这里的在pack中添加的是BodyTransformer.