Soot 入门

相关课程: 燕云直播

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值