Soot(一)——安装与基本使用

系统:Ubuntu 20.04
使用的Java版本:JDK11与JDK8均可使用,如果解析JAVA源码时出现问题,需要将版本降到JDK7

本系列的目的:

  1. 总结自己学习的东西,以便日后温习查询之用
  2. 该工具目前暂时没有中文版本,而soot是Android静态分析的基础,本文填补了这个空白
  3. 方便学弟学妹学习时少走弯路,中英文对照更好理解

安装

参考资料:https://github.com/soot-oss/soot/wiki/Introduction:-Soot-as-a-command-line-tool

Soot的下载地址:
https://soot-build.cs.uni-paderborn.de/public/origin/master/soot/soot-master/

每一个版本下面都有三个文件夹:buildjdocoptions
build内存放的是Soot的资源文件
options内存放的是操作文档

一般来说,我们只会使用sootclasses-trunk-jar-with-dependencies.jar

下载完成后,使用java -cp sootclasses-trunk-jar-with-dependencies.jar soot.Main后,会出现如下提示信息:

Soot version trunk
Copyright (C) 1997-2010 Raja Vallee-Rai and others.
All rights reserved.Contributions are copyright (C) 1997-2010 by their respective contributors.
See the file 'credits' for a list of contributors.
See individual source files for details.Soot comes with ABSOLUTELY NO WARRANTY.  Soot is free software,
and you are welcome to redistribute it under certain conditions.
See the accompanying file 'COPYING-LESSER.txt' for details.
Visit the Soot website:http://www.sable.mcgill.ca/soot/
For a list of command line options, enter:java soot.Main --help

证明下载成功

使用java -cp sootclasses-trunk-jar-with-dependencies.jar soot.Main --help能获得冗长的帮助信息
这些帮助信息在options文件夹内有一个HTML版本,看起来更方便

基本使用

为了避免每次都输入一大串的参数,我写了一个很简单的shell脚本辅助使用

#!/bin/bashSOOT_PATH=/home/yingmanwumen/Documents/soot/sootclasses-trunk-jar-with-dependencies.jarjava -cp $SOOT_PATH soot.Main -cp . -pp $1 $2 $3 $4 $5 $6 $7 $8 $9

使用的时候,把这个脚本放在~/.local/bin下,然后用chmod命令赋予权限即可

现在对这个脚本中的两个参数-cp-pp作解释

  • -cp
    soot.Main --help的帮助信息中,有这个参数的解释
-cp path
-soot-class-path path
-soot-classpath path  Use path as the classpath for finding classes.

soot下有自己的一个soot class path,不同于shell当前路径
使用的时候,需要指定soot class path
需要注意的是,soot class path中不能有~符号,即家目录符号,因为该符号是在shell里面展开的而非是在soot里面展开的,应该使用完整的路径,例如/home/yingmanwumen这种的

  • -pp
-pp
-prepend-classpath  Prepend the given soot classpath to the default classpath.

soot要进行汇编、反汇编等等工作,需要解析必要的符号类型
这个工作不由soot完成,因此,soot的soot class path中需要jdk中对应的jar包,linux下使用:分隔多个地址
另一个简便的方式就是使用-pp参数,自动包含所需的jar包地址
本着简便易用的原则,不在此处介绍其他方式

输入

可以将多个文件并排输入,也可以使用-process-dir一次输入一个文件夹

例如文件目录下有

HelloWorld.java
HelloWorld.class

可以使用java -cp soot.jar soot.Main -cp . -pp HelloWorld进行解析
也可以使用java -cp soot.jar soot.Main -cp . -pp -process-dir .进行解析

Soot支持多种格式的输入

-src-prec format  c class
only-class
J jimple
java
apk
apk-class-jimple apk-c-j

默认解析.class文件

例如,在上面的例子中,若需要解析.java文件,则只需指定-src-prec java即可
此处,soot有一个bug,当java文件内有IO操作时,无法进行解析
解决办法是,将JDK版本降到JDK7

输出

使用-d参数指定输出文件夹
因为Soot的默认输出文件夹是./sootOutput,在重复使用-process-dir指令的时候,会将./sootOutput的内容一并解析,因此,可以使用-d来指定输出的文件夹

使用-f参数来指定解析结果的输出格式

-f format
-output-format format  J jimple
j jimp
S shimple
s shimp
B baf
b
G grimple
g grimp
X xml
dex
force-dex
n none
jasmin
c class
d dava
t template
a asm

其中,jimplejimpshimpleshimpbafgrimplegrimp都是soot支持的IR(中间文件)

hello world程序为例

public class Helloworld {public static void main(String[] args) {System.out.println("Hello, world");}
}

jimple格式输出,如下

public class Helloworld extends java.lang.Object
{public void <init>(){Helloworld r0;r0 := @this: Helloworld;specialinvoke r0.<java.lang.Object: void <init>()>();return;}public static void main(java.lang.String[]){java.io.PrintStream $r0;java.lang.String[] r1;r1 := @parameter0: java.lang.String[];$r0 = <java.lang.System: java.io.PrintStream out>;virtualinvoke $r0.<java.io.PrintStream: void println(java.lang.String)>("Hello, world");return;}
}

至于Jimple的具体语法,将在以后的系列中进行讲解

Soot(一)——安装与基本使用相关推荐

  1. Soot的安装及其初步使用

    一.Soot的安装方法 在线自动安装:安装完eclipse之后,打开eclipse,并且安装soot插件.进eclipse,点help,点install new software 点击add在loca ...

  2. soot 简介 | 安装运行

    友链: soot-GitHub官方文档 Introduction: 在命令行使用soot soot的java api文档 soot-guide https://blog.csdn.net/zlp199 ...

  3. Soot(一):Soot的三种使用方式:命令行、idea、eclipse

    文章目录 1. Soot下载安装 2. Soot命令行使用 3. Soot在idea下的使用 3. soot在eclipse下的使用 1. Soot下载安装 下载地址:https://soot-bui ...

  4. android+生成控制,用 soot 生成安卓App的控制流 Day 1

    以下实验环境是在 Ubuntu 下,使用 eclipse kepler, java 1.7 多版本java管理 注意!soot不支持java 1.8版本,请在eclipse 中设置JRE是1.7的版本 ...

  5. soot简介及安装运行

    soot官方文档: https://github.com/Sable/soot/wiki 一. soot简介 1. 概念 Originally, Soot started off as a Java ...

  6. Soot入门(1): 安装与生成Jimple文件

    Soot入门(1): 安装与生成Jimple文件 这学期选修了程序分析课,作业是基于soot进行一些java程序的静态分析,发现目前不管国内国外对于soot的教程都不太多,要么不太清晰要么太老,打算一 ...

  7. 计算机 电脑 系统安装教程,安装电脑的操作系统的方法

    安装电脑的操作系统的方法 现如今,电脑的使用越来越普遍,几乎每家每户都有电脑,而电脑的操作离不开操作系统,下面小编整理了安装电脑的操作系统的方法,供大家参阅. 1.在电脑光驱里放入要安装的系统光盘.( ...

  8. 关于soot静态分析的学习(一)

    本文中关于soot的研究使用,仅代表本人理解程度,因本人为0基础,所以如有出错,欢迎指出. 一.soot是什么? Soot(Java静态分析框架) 其实Soot最开始设计的时候,主要目的就是为了对Ja ...

  9. Day 5 Soot使用笔记

    命令行使用 参考实现:Introduction: Soot as a command line tool 下载地址:https://soot-build.cs.uni-paderborn.de/pub ...

最新文章

  1. FragmentPagerAdapter 与 FragmentStatePagerAdapter 的区别
  2. 制造内核崩溃并使用crash分析内核崩溃产生的vmcore文件
  3. 万亿级日志与行为数据存储查询技术剖析
  4. [读者调查]新增一个读者调查!
  5. Eclipse 的 Tomcat 插件
  6. 工程师如何解决穿衣搭配烦恼?
  7. 选择排序 插入排序 交换排序
  8. html文档的基本类型,HTML(网页的文档类型介绍)
  9. 如何检测本计算机耗电量,如何查看电脑耗电量?鲁大师查看电脑使用功率的方法...
  10. python hashlib_python hashlib模块
  11. 这是一个最不缺“大师”的时代
  12. 关于AttachCurrentThread和DetachCurrentThread的故事
  13. GitHub 的 Pull Request
  14. loadrunner使用system()函数调用Tesseract-OCR识别验证码遇到的问题
  15. 通讯工程考研考计算机专业跨度大么,通信工程专业,与自动化专业差别大吗?考研可以跨考吗?...
  16. C/C++ 各种进制的表示方法/ 进制前缀
  17. 老罗Android视频教程第二季(全套视频+源码)
  18. 一周信创舆情观察(2.21~2.27)
  19. 高中生计算机考试软件手机版,信考中学信息技术考试练习系统内蒙古高中版
  20. 3.9提取电话号的区号、电话号、分机号

热门文章

  1. 单链表结构体定义解析
  2. okhttp3宏观介绍及基础回顾
  3. TGT正式上线BiFinance交易所开启交易,首日暴涨超300%
  4. 【React】5、四行代码让我的cpu跑上90度——走进组件生命周期
  5. libcad.so Crack,转换为多种文件格式
  6. 改变你的人生的32句经典句子
  7. Wikioi 1017 乘积最大
  8. 傅里叶变换性质公式推导
  9. 中兴 20 5g音频测试软件,中兴zSpider智能测试平台 铸就5G产品安全利器
  10. Unity版本捕鱼游戏设计与实现