将 Soot 用作库时如何设置它?

How can I set up Soot when using it as a library?

我想使用 Soot 库从 *.java 文件构建 SSA。但是我发现的所有示例都使用 Soot 作为独立工具,而不是库。任何人都可以给我在程序中热做的例子吗?

首先,我只是尝试从源文件加载我的 class 并打印它(TestClass.class 在目录 A/home/abdullin/workspace/test 中):

import soot.G
import soot.Scene
import soot.options.Options

fun main(args: Array<String>) {
    G.reset();
    Options.v().set_whole_program(true)
    Scene.v().loadBasicClasses()

    Scene.v().sootClassPath = "${Scene.v().defaultClassPath()}:/home/abdullin/workspace/test"

    val sc = Scene.v().getSootClass("TestClass")
    Scene.v().loadNecessaryClasses()
    sc.setApplicationClass()

    println(sc.name)
    sc.methods.forEach {
        println(it)
    }
}

但是当我 运行 这个时,我得到 运行 时间异常 Aborting: can't find classfile TestClass。如果我像他们在某些教程中所做的那样将 Scene.v().getSootClass("TestClass") 更改为 Scene.v().loadClassAndSupport("TestClass"),soot 会找到我的 class,但它并不完整。它打印出 class 方法的签名,但找不到它们的主体,activeBody 字段为空。

TestClass
<TestClass: void <init>()>
<TestClass: void main(java.lang.String[])>
<TestClass: void f1()>

首先,确保 Soot jar 在 class路径中。

然后,使用 classes soot.G and soot.options.Options (G.reset() and Options.v().parse() are methods of interest, also see command line options).

设置 Soot

使用 soot.Scene.v().setSootClassPath() and similar 你可以告诉 Soot 在哪里可以找到你想要分析的代码的 class 文件。

然后您可以使用Scene.v().getSootClass()获取SootClass对象。确保 Soot 在将要分析的 class 设置为主要 class:

后加载所有 classes
mySootClass.setApplicationClass();
Scene.v().loadNecessaryClasses();

在此之后,您可以使用 Soot 获取各种类型的图表并 运行 您进行分析,如 Survivor's guide

中所述

您可以阅读此 post (https://o2lab.github.io/710/p/a1.html)。但是如果你试图分析一个 jar 文件,你应该解压它并得到一组 class 个文件。然后你应该将你的 classes 目录添加到 soot_class_path.

演示:

public static void main(String[] args) {
    //spotbugs -- testing
    String classesDir = "D:\wkspace\seed8\dir\spotbugs";
    String mainClass = "edu.umd.cs.findbugs.LaunchAppropriateUI";

    //set classpath
    String jreDir = System.getProperty("java.home") + "\lib\jce.jar";
    String jceDir = System.getProperty("java.home") + "\lib\rt.jar";
    String path = jreDir + File.pathSeparator + jceDir + File.pathSeparator + classesDir;
    Scene.v().setSootClassPath(path);

    //add an intra-procedural analysis phase to Soot
    TestCallGraphSootJar_3 analysis = new TestCallGraphSootJar_3();
    PackManager.v().getPack("wjtp").add(new Transform("wjtp.TestSootCallGraph", analysis));

    excludeJDKLibrary();

    Options.v().set_process_dir(Arrays.asList(classesDir));
    Options.v().set_whole_program(true);
    //Options.v().set_app(true);

    SootClass appClass = Scene.v().loadClassAndSupport(mainClass);
    Scene.v().setMainClass(appClass);
    Scene.v().loadNecessaryClasses();

    //enableCHACallGraph();
    enableSparkCallGraph();

    PackManager.v().runPacks();
}

如果你更换

SootClass appclass = Scene.v().loadClassAndSupport(mainclass);
Scene.v().setMainClass(appclass);
Scene.v().loadNecessaryClasses();

来自

Scene.v().loadNecessaryClasses();
SootClass appclass = Scene.v().getSootClass(mainclass);
Scene.v().setMainClass(appclass);

,该程序也有效。