1、soot的简介
简单来说,soot是java优化框架,提供4种中间代码来分析和转换字节码。
官方文档地址: https://github.com/Sable/soot/wiki
2、JAVA配置的检查
为了后续的演示,在对soot进行配置之前,最好先对java的配置进行一个测试(我这边用的是JDK11)
首先 win + R + cmd 打开命令行,输入命令如下
java -version
javac -version
若配置正确,则结果如下:
3、soot的下载与测试
3.1 soot的下载
首先贴一下下载链接:https://soot-build.cs.uni-paderborn.de/public/origin/master/soot/soot-master/
自己挑选个版本,我这边下的是3.1.0,然后下载里面的build/sootclasses-trunk-jar-with-dependencies.jar,这个文件包含soot运行所需的所有依赖包。
3.2 soot的测试
下载后可以输入如下代码进行测试
(这里为了方便,我将sootclasses-trunk-jar-with-dependencies.jar重命名为了soot.jar,并将其放在了d盘下,可以自行更改)
java -cp D:\soot.jar soot.Main -version
出现如下结果说明正确:
4、使用soot.cfgViewer进行测试
4.1 写个Hello测试类
首先写个Hello类,如下所示
public class Hello{
public static void main(String args[]){
System.out.println("helloworld");
}
}
4.2 编译生成class文件
在cmd命令行下输入:
javac Hello.java
4.3 生成cfg文件
使用命令调用soot的CFG工具包生成dot格式的控制流程图
这里注意一个点,如果在javac编译生成class文件后更改JDK的版本,就会出现错误
java -cp D:/soot.jar soot.tools.CFGViewer -cp . -pp Hello
5、常见问题
5.1 找不到rt.jar
出现原因:在JDK9后,rt.jar被移除,所以可能会报这个错
解决方法:将JDK8版本下的rt.jar 移动到JDK11版本下的lib文件夹下,虽然有点粗暴,但是能让程序正常运行
5.2 Class not equal报错
对于在package内部的java类(如下图所示)
如果直接在package内部调用java -cp D:/soot.jar soot.tools.CFGViewer -cp . -pp ArrayValuesSource命令生成cfg图则会出现class not equal的错误
由于该类包含在package内部,将由于无法确定类名而导致无法生成,在这种情况下需要对其进行补全
java -cp D:\soot.jar soot.tools.CFGViewer -cp . -allow-phantom-refs -pp apache.tools.ant.AntTypeDefinition