Soot:从头创建一个类

来源:互联网 发布:陈华伟 知乎 编辑:程序博客网 时间:2024/06/04 23:31

Soot:从头创建一个类

(Creating a class from scratch)

首先,我们需要创建一个类,以放入方法。接下来的步骤对于创建一个类文件是必要的。

加载Java.lang.Object和Library类

    加载java.lang.Object,Java类层次结构的root节点。

    该步骤对于那些扩展Soot框架的构建代码来说,是没必要的。在那种情况下,当用户代码被调用时,类文件就已经被加载了。

Scene.v().loadClassAndSupport("java.lang.Object");

    该行代码使得Soot去加载java.lang.Object类,并创建其对应的SootClass对象,也包括与其成员对应的SootMethod(s)和SootField(s)。当然java.lang.Object有着对其它对象的引用。loadClassAndSupport方法的调用,将加载指定类的传递闭包(transitive closure),以便所有为了加载java.lang.Object所需的类型能被加载。

这一过程被称为resolution。

因为我们的HelloWorld程序将使用标准库中的类,我们也需要解析(resolve)它们:

Scene.v().loadClassAndSupport("java.lang.System");

该行引用了Scene.v()。Scene是指在程序中所有SootClass(es)的容器,并且提供了各种实用的方法。有一个单例的Scene对象,可以通过Scene.v()来调用获取。

注意事项:Soot从类文件或.jimple的输入文件中加载这些类。当使用的是前者的话,Soot将加载所有在每个类文件的常量池中获取到的类名。从Jimple中加载时,Soot将只加载要求的类型。

创建一个新的SootClass对象

    创建一个"HelloWorld"类,并设置它的超类为"java.lang.Object"。

SootClass sClass = new SootClass("HelloWorld",Modifier.PUBLIC);

该行代码为一个名为HelloWorld的Public类创建SootClass对象。

sClass.setSuperClass(Scene.v().getSootClass("java.lang.Object"));

这将为这个新创建的类设置相应于java.lang.Object的SootClass对象,作为其超类。注意这里Scene的getSootClass功能方法的使用。

Scene.v().addClass(sClass);

这将添加新创建的HelloWorld类Scene中。所有的类,一旦它创建后,都应该归属到Scene中。

添加方法到SootClass中

为HelloWorld创建一个含有空方法体的main()方法。

现在,我们拥有一个SootClass,我们需要为其添加方法。

SootMethod method = new SootMethod("main",

Arrays.asList(new Type[]{ArrayType.v(RefType.v("java.lang.String"),1)}),

VoidType.v(), Modifier.Public | Modifier.STATIC);

我们创建了一个public static方法,main,声明了它携带了一个java.lang.String的对象,并且它返回void。

SootMethod的构造器要求一个list,所以我们使用Java实用方法Arrays.asList来从单元素数组(我们从newType[]中生成)中创建一个list。在该列表中,我们装入一个数组类型,对应于java.lang.String对象的一维数组类型。

Types: 每个SootClass表示一个Java对象。我们可以实例化该类,通过指定一个类的给定类型。两个概念:--type和class--密切相关,但带有区分。为了获取java.lang.Stirng类的type,通过名字,我们调用RefType.v("java.lang.String")。给定一个SootClass对象sc,我们也可以调用sc.getType()来获取对应的类型。

sClass.addMethod(method);

这一代码将方法添加到包含它的类中。

为方法添加代码

    方法如果不包含代码则没有意义。我们为main方法添加一些代码。为了达到该目的,我们需要为该代码选择一种中间表示。

创建JimpleBody

    未完待续。

自我吐槽:

    做博客需要莫大的耐心,给自己打打气加油。

    在公司内部无法做任何总结或博客真是非常糟糕的体验,只能每晚回家抽空总结,身子真是吃不消。

    坚持!

     

 

 

原创粉丝点击