Soot 初见【1】

Soot 是一个分析和转换 Java 以及 Android 应用程序的框架,目前已支持 Java 9
GithubMavenRepoPaderborn大学源

提供了四种中间表示

BafJimpleShimpleGrimp
易于操作的字节码简化形式适用于优化的三地址码形的中间表示Jimple 的SSA变体适用于反编译和代码检查的 Simple 整合版

如何开始使用 Soot ?

Soot 的 wiki教程 以及 JavaDoc文档和命令行选项的参考
本文使用的是 Soot 4.2.1(当前最新)

java -cp soot-4.2.1-jar-with-dependencies.jar soot.Main

Soot version trunk
Copyright (C) 1997-2010 Raja Vallee-Rai and others.
All rights reserved.
...
java -cp soot-4.2.1-jar-with-dependencies.jar soot.Main --help

General Options:
 -coffi                        Use the good old Coffi front end for parsing 
                               Java bytecode (instead of using ASM). 
 -jasmin-backend               Use the Jasmin back end for generating Java 
                               bytecode (instead of using ASM). 
 -h, -help                     Display help and exit 
 -pl, -phase-list              Print list of available phases 
 -ph ARG -phase-help ARG       Print help for specified ARG 
 -version                      Display version information and exit 
 -v, -verbose                  Verbose mode 
...

通常 Soot 会处理很多类,格式如下:

  • Java 源文件,即 .java 文件
  • Java 字节码,即 .class 文件
  • Jimple 源文件,即 .jimple 文件

Simple 是 Soot 的主要中间表示,它是一个三地址码,可以说是 Java 的一种简化版本,只有大约15种不同类型的语句。可以用 Soot 将 .java 或 .class 文件转换为 .jimple 文件,反之亦然。甚至可以先用 .java 生成 .jimple,手动优化修改后,再将其转换为 .class。

因为是 JDK8,需要先编译 Java文件,然后才能将其作为命令行参数进行传递

java -version

openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

java -cp soot-4.2.1-jar-with-dependencies.jar soot.Main A

Soot started on Mon Nov 16 19:20:56 CST 2020
soot.SootResolver$SootClassNotFoundException: couldn't find class: A (is your soot-class-path set properly?)
...

Soot 有自己的类路径,只会从该路径上的 JAR 文件或目录加载文件!然而此路径默认为空,因此在上面示例种,尽管存在 .class,但 Soot 看不到。

java -cp soot-4.2.1-jar-with-dependencies.jar soot.Main -cp . A

Soot started on Mon Nov 16 19:41:45 CST 2020
java.lang.RuntimeException: None of the basic classes could be loaded! Check your Soot class path!
	at soot.Scene.loadBasicClasses(Scene.java:1755)
	at soot.Scene.loadNecessaryClasses(Scene.java:1845)
	at soot.Main.run(Main.java:241)
	at soot.Main.main(Main.java:141)

Soot 需要 java.lang.Object,为了对程序进一步处理,Soot 需要知道类型信息,特别是它需要重新构造局部变量的类型。为此,它需要知道所处理的类的完整类型层次。三种解决办法:

  • 将 rt.jar 加入类路径
  • 如果使 CLASSPATH 变量包含 rt.jar 或 JAVA_HOME,添加 -pp选项(本文采用)
  • 使用 -allow-phantom-refs 选项(不推荐)

-pp 即 -prepend-classpath,表示 Prepend the given soot classpath to the default classpath.

java -cp soot-4.2.1-jar-with-dependencies.jar soot.Main -cp . -pp A

Soot started on Mon Nov 16 20:05:12 CST 2020
Soot finished on Mon Nov 16 20:05:13 CST 2020
Soot has run for 0 min. 0 sec.

最终将在路径下生成 sootOutput\A.class。
此外还可以使用 –process-dir 选项处理整个目录或 JAR 文件,-d 重定向 Soot 的输出位置。

java -cp soot-4.2.1-jar-with-dependencies.jar soot.Main -cp . -pp -process-dir . -d /tmp/sootout

有时我们需要选择输入类型,比如同一目录下有 A.java 和 A.class。-src-prec 能告知 Soot 首选输入。下面是参数:

  • c 或 class(默认):
  • only-class:
  • J 或 jimple:
  • java

生成控制流图

使用 Soot 的 soot.tools.CFGViewer 工具分析生成 DOT 语言描述的控制流图,然后用 graphviz 可视化。

java -cp soot-4.2.1-jar-with-dependencies.jar soot.tools.CFGViewer -cp . -pp A

Soot started on Mon Nov 16 20:35:22 CST 2020
Soot finished on Mon Nov 16 20:35:22 CST 2020
Soot has run for 0 min. 0 sec.

sudo apt-get install graphviz

dot -Tpng -o 图片名.png DOT文件名.dot
...
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Soot是一个Java字节码分析和转换框架,可以用来做很多事情,如代码优化、程序分析、安全检测等。在IntelliJ IDEA中使用Soot需要按照以下步骤进行配置: 1. 下载Soot 你可以从Soot的官网上下载最新版本的Soot,或者从Maven中央仓库中获取Soot的依赖。将Soot的jar包添加到项目依赖中。 2. 配置IntelliJ IDEA 打开IntelliJ IDEA,在项目中添加Soot的jar包。在项目结构中选择“Modules”,然后选择“Dependencies”选项卡,点击“+”按钮添加Soot的jar包。同时,需要在项目的“Run Configuration”中设置Sootclasspath,使Soot可以访问到项目的类文件。 3. 编写Soot分析程序 使用Soot进行字节码分析需要编写Java程序。在程序中,需要设置Soot的Options,如输入文件、要进行的分析等。例如: ``` public static void main(String[] args) { String analysisClass = "com.example.MainClass"; String[] sootArgs = { "-w", // 开启整个程序的分析 "-cp", "target/classes", // 设置classpath "-process-dir", "target/classes", // 设置输入目录 "-app", // 分析整个应用 analysisClass // 分析的类 }; PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTransform", new BodyTransformer() { @Override protected void internalTransform(Body body, String s, Map<String, String> map) { // 分析代码 } })); soot.Main.main(sootArgs); } ``` 4. 运行Soot程序 在IntelliJ IDEA中运行Soot程序,可以在控制台中看到Soot的分析结果。你也可以将分析结果保存到文件中,以便后续分析或可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值