文章目录
前言
Soot 的类型三地址码:Jimple
李樾老师的《软件分析》课程02(Intermediate Representation)中介绍了 3AC(3-Address Code,三地址码)
,并且使用 Soot 的 IR 举例介绍真实场景下的三地址码:Jimple(typed 3-address code)。
由于 Java 是有类型的,静态分析很多时候要用到语言的类型信息,所以 Java 的三地址码是带类型的,即 typed。
Soot 相关链接
另外李樾老师还提到,在科研工作或企业工作中研究 Java 静态分析时,Soot 是难以避开的一个框架。而且软件分析的课程作业,也是基于 Soot 进行设计。
Soot 是什么?
Soot 最初的作用
参考文章:Soot为什么经常被用作Instrumentation的Framework?
其实Soot最开始设计的时候,主要目的就是为了对Java字节码程序进行优化,这里的优化就是指执行效率或者运行速度方面的优化。最初设计时,Soot支持三种“中间表示方法”(Intermediate Representation):Baf,Jimple和Grimp。
所以,Soot最初的作用,就是为了提高Java程序的执行效率(由于Java程序和C/C++相比起来,在先天上就执行效率较低)。1999 年编写的最初的文章,最后通过12个大型的benchmarks实验说明,经过Soot处理后,在interpreter中的执行效率提高了8%,在Just-In-Time(JIT)型的编译器中的执行效率提高了21%。
官方旧指南:2008年1.1版本
[Soot学习笔记][3]通过Soot API生成Hello World程序 系列文章记录了一些对 Soot教程
的学习,其中提到了 《A Survivor’s Guide to Java Program Analysis with Soot》,是 Soot 教程指定的发布于 2018 年的旧指南。
旧指南阅读地址,不得不说,47页的英文文档第一次打开让我有些望而生畏,参考文章中提到该指南,这才给了我第二次打开该英文文档的勇气。
化整为零,啃下文档5-7页的第一章导论并不过分吧?慢慢适应英文文档,读完导论在该节写下自己的个人理解即可。
教程入门部分
Introduction:主要介绍处理哪些文件
处理单个文件: Soot 通常处理一堆类。这些类可以采用以下三种格式之一:
- Java 源代码,即 .java 文件,
- Java 字节码,即 .class 文件,以及
- Jimple 源,即.jimple 文件。
其中 Jimple 是 Soot 的主要中间表示,一个三地址代码,基本上是一种简化的 Java 版本,只需要大约 15 种不同的语句。您可以指示 Soot 将 .java 或 .class 文件转换为 .jimple 文件或反之。
Soot 的类路径: Soot 有自己的类路径,并且只会从该路径上的 JAR 文件或目录加载文件。默认情况下,这个路径是空的。
处理整个目录: 可以使用-process-dir选项使用 Soot 处理整个目录或 JAR 文件。
处理某些类型的文件: 略
应用程序类与库类: Soot 实际处理的类称为应用程序类。这与库类相反,Soot 不处理库类,仅用于类型解析。应用程序类通常是那些在命令行上明确声明的类,或者那些驻留在通过-process-dir。