1. Soot下载安装
下载地址:https://soot-build.cs.uni-paderborn.de/public/origin/master/soot/soot-master/
将该jar包放在一个文件夹中,输入以下命令查看是否安装成功:
java -cp sootclasses-trunk-jar-with-dependencies.jar soot.Main --help
2. Soot命令行使用
写2个java文件进行测试,测试文件代码:
public class A {
public void calSum(){
int sum=0;
for(int i=0;i<10;i++){
sum+=i;
}
}
}
public class B {
public void calMulti(){
int multi=0;
for(int i=0;i<10;i++){
multi*=i;
}
}
}
错误命令1:
原因:soot需要使用自己的路径,因此需要使用
cp .
包括当前目录
加上cp .
选项,但是又出现以下的错误:
原因是因为少了rt.jar包,解决方式有两种,一是加入rt.jar包,二是添加-pp
选项,表示加载JAVA_HOME的jar包
方式一演示:
方式二演示:
运行成功的目录结构:
多了一个sootOutput目录,里面多了两个解析后的class文件
处理一个文件夹而不是单个文件:
建立一个bin目录,将上面的两个class文件放入bin目录中
指定输出目录:
soot解析后的文件的默认输出目录是sootOutput, 我们可以自己指定输出目录:
指定解析文件类型:
soot默认输入是class文件,输出也是class文件,如果需要输出jimple文件,可以使用参数-f J
现在将两个java文件和两个class文件都放入bin目录中
指定输出文件类型:
下面是jimple文件的内容:
public class A extends java.lang.Object
{
public void <init>()
{
A r0;
r0 := @this: A;
specialinvoke r0.<java.lang.Object: void <init>()>();
return;
}
public void calSum()
{
A r0;
int i1;
r0 := @this: A;
i1 = 0;
label1:
if i1 >= 10 goto label2;
i1 = i1 + 1;
goto label1;
label2:
return;
}
}
public class B extends java.lang.Object
{
public void <init>()
{
B r0;
r0 := @this: B;
specialinvoke r0.<java.lang.Object: void <init>()>();
return;
}
public void calMulti()
{
B r0;
int i1;
r0 := @this: B;
i1 = 0;
label1:
if i1 >= 10 goto label2;
i1 = i1 + 1;
goto label1;
label2:
return;
}
}
3. Soot在idea下的使用
创建一个java工程或者maven工程
- 写一个转化类:
public class SootTransformer {
public static void main(String[] args) {
soot.Main.main(args);
}
}
- 导入包
- 右键运行,此时只会输出一些基本信息
- 配置命令:
然后再次运行改文件,会得到下面的输出
当然你也可以自己写一个转化的Main函数,然后按照上面的方式配置命令,而不是使用自带的soot.Main函数,具体的书写后面继续分享
3. soot在eclipse下的使用
网上有关于在eclipse下直接使用soot插件的教程,但是改方法大部分情况下不能成功,在ubuntu16下的kepler版本的eclipse中可以使用
本文还是介绍命令行的配置
- 先创建一个java工程
- 导入jar包
JRE System Library->Build Path->Configure Build Path->Libraries->Add External JARS
- 建立以下目录
然后建立一个classes文件夹用于存放需要转化的class文件: 注意一点,如果java文件带有包名,此时产生的class文件会有一个上一级目录,目录名称和包名相同,因此在指定处理的文件加时,不要指定包名的文件夹,而是要指定包的上一级目录
命令行参数配置: 右键->Run as->Run Configuration
然后运行StartSoot, 会得到以下结果: