相关课程: 燕云直播
soot官网: GitHub - soot-oss/soot: Soot - A Java optimization framework
soot API: https://soot-oss.github.io/soot/docs/
soot安装: 可以直接看官网教程。 不想看英文可以参考 Soot使用笔记 - xine - 博客园
Soot 跑起来——命令行
1、测试代码Helloworld.java
public class Helloworld {
public static void main(String[] args){
System.out.println("Helloworld");
}
}
2、打开cmd,cd到Helloworld.java的目录下,执行命令javac Helloworld.java。默认电脑已配好Java环境,本人是Java1.8。
3、利用soot将Helloworld.class转成jimple代码。执行下面命令后,sootOutput文件下面会生成Helloworld.jimple文件。
4、查看Helloworld.jimple
Soot 跑起来——导入后直接使用
了解Soot的数据结构
import soot.*;
import soot.util.*;
import java.util.*;
public class test1 {
public static void main(String[] args) {
Scene.v().setSootClassPath("./jar/rt.jar");//rt.jar的路径
Scene.v().extendSootClassPath("./src/");//classpath的路径
SootClass sClass = Scene.v().loadClassAndSupport("Helloworld");//.class
Scene.v().loadNecessaryClasses();//加载必须的类
List<SootMethod> sMethods = sClass.getMethods();
Chain<SootField> sFields = sClass.getFields();
// System.out.println("getClasses()");
// for(SootClass c : Scene.v().getClasses()){
// System.out.println(c);
// }
for(SootMethod m : sMethods){
System.out.println(m);
}
// System.out.println("getDeclaration()");
// System.out.println(sFields.size());
for(SootField f : sFields){
System.out.println(f.getDeclaration());
}
System.out.println("In the end.");
}
}
Soot 跑起来——加入自己的转换函数(jimple中展示更多的信息)
配置Configuration
import soot.*;
import soot.options.Options;
import java.util.*;
public class test2 {
public static void main(String[] args) {
Options.v().set_verbose(true);
//插入自己的全程序转换函数 class之间的分析
PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTransform", new SceneTransformer() {
@Override
protected void internalTransform(String phaseName, Map options) {
System.out.println("printing more messages by myself 1");
System.out.println(phaseName);
System.err.println(Scene.v().getApplicationClasses());
}
}));
Options.v().set_whole_program(true);
// 程序内分析插入 过程内分析,处理代码快
PackManager.v().getPack("jap").add(new Transform("jap.myTransform", new BodyTransformer() {
@Override
// body:代码块,分析的代码块
protected void internalTransform(Body body, String phase, Map options) {
for(Unit unit : body.getUnits()){
System.out.println("printing more messages by myself 2");
System.out.print(unit);
System.out.print(": ");
System.out.println(unit.getTags());
}
}
}));
PhaseOptions.v().setPhaseOption("jap.npc", "on");
soot.Main.main(args);
System.out.println("In the end.");
}
}
上图可以看到,和之前直接命令行输出的jimple代码比较,这个增加了一些自定义的信息。还可以获取更多信息,可以去看soot的options。