本文中关于soot的研究使用,仅代表本人理解程度,因本人为0基础,所以如有出错,欢迎指出。

一、soot是什么?

Soot(Java静态分析框架)

其实Soot最开始设计的时候,主要目的就是为了对Java字节码程序进行优化,这里的优化就是指执行效率或者运行速度方面的优化。最初设计时,Soot支持三种“中间表示方法”(IR:Intermediate Representation):BafJimpleGrimp

所以,Soot最初的作用,就是为了提高Java程序的执行效率(由于Java程序和C/C++相比起来,在先天上就执行效率较低)。

这里就出现了很关键的问题,它是如何进行代码优化的呢?或者说soot这个工具,是怎样用的?

二、soot的表现形式和安装

在我看来,soot的表现形式就是jar包。

通过在网上搜索,我发现刚开始很可能会落入一个误区,因为soot是通过不同部分合作来达到目的的,所以正常情况下需要用到三个不同的jar。而事实上,其实有一个包含所有soot依赖的jar,只要它一个,便可以达到我们的目的。

  1. 我们可以通过下载一套源码来获取所需jar,在这里下载。下载完成后得到一个soot-develop文件夹。进入文件夹,打开index.html,进入页面后会发现这是一个很全面的介绍文档,我们可以点击Soot Downloads进入下载页面。

下方Pre-complied jar就是我们需要的三个jar包,当然,我们可以直接下载上面的那个jar:sootall来进行使用。

  1. 最简单的方法,我们可以直接通过**这里**来直接选择下载所需的jar。


同样,第一个是包含全部依赖的,等于下面三个相加的和。

经过上诉两种方法,我们得到一个可以使用的jar包,将其更名为 soot.jar ,然后来验证一下它是否可用。

进入该jar所在文件夹的命令行,来输入以下命令测试:

java -cp .\soot.jar soot.Main

先不需要管这条命令是什么意思。,我们如果得到以下结果,即为可正常使用。

三、soot的使用

soot的使用有很多种,最常见的便是命令行使用,导入程序使用和作为eclipse插件使用。

我经过归纳后,重新定义了两种使用方法,通过命令行命令使用,作为框架使用,

1、通过命令行使用

其实上面的测验便是通过命令行使用的基本方法。我们需要通过命令来操作soot.jar来完成所需操作。

下面几种简单的使用。

将已有的.class文件转化为java源码与java字节码混合的.jimple文件:

首先我们需要一个helloword的java文件:

public class helloworld {public static void main(String[] args) {System.out.println("Hello World!");}
}

并将其编译为.class文件。
将得到的helloworld.class与我们的soot.jar放在同一目录下,进入该目录的命令行执行:

java -cp soot.jar soot.Main -pp -cp . -f J helloword

其中:

-process-dir : 指定包含class文件的文件夹
-cp : soot.jar: 指定soot class路径
-pp : 指定soot搜索的Java路径
-cp . : 指定要分析项目的路径,. 表示当前路径
-f J : 指定输出文件的类型,为Jimple
-d : 指定输出结果到某文件夹
HelloWorld: 指定需要分析的class文件

其中:-process-dir 指定的目录是包含多个需转化文件的文件夹,因为在这里只转化率一个helloword.calss的类,所以没有使用该参数;-d 指定的文件夹是经过运行转化后得到的新文件的存放目录,搭配前一个参数使用,这里同样没有使用

在执行完命令后出现

Soot started on Fri Jan 13 10:47:28 GMT+08:00 2023
Soot finished on Fri Jan 13 10:47:30 GMT+08:00 2023
Soot has run for 0 min. 1 sec.

即为执行成功,可以在同级目录下生成sootOutput文件夹,在文件夹中可以看到我们的目标文件helloworld.jimple

将.class转化为可以转变为图片的dot文件

同样新建一个LeetCode.java文件并将其转化为.class文件:

public class LeetCode {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int[] nums;int m = nums1.length;int n = nums2.length;nums = new int[m + n];if (m == 0) {if (n % 2 == 0) {return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;} else {return nums2[n / 2];}}if (n == 0) {if (m % 2 == 0) {return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;} else {return nums1[m / 2];}}int count = 0;int i = 0, j = 0;while (count != (m + n)) {if (i == m) {while (j != n) {nums[count++] = nums2[j++];}break;}if (j == n) {while (i != m) {nums[count++] = nums1[i++];}break;}if (nums1[i] < nums2[j]) {nums[count++] = nums1[i++];} else {nums[count++] = nums2[j++];}}if (count % 2 == 0) {return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;} else {return nums[count / 2];}}}

将得到的LeetCode.class与我们的soot.jar放在同一目录下,进入该目录的命令行:

java -cp soot.jar soot.tools.CFGViewer -pp -cp . LeetCode

出现

G:\work\soot>java -cp soot.jar soot.tools.CFGViewer -pp -cp . LeetCode
Soot started on Fri Jan 13 11:01:52 GMT+08:00 2023
Soot finished on Fri Jan 13 11:01:53 GMT+08:00 2023
Soot has run for 0 min. 0 sec.

即为成功,可以在sootOutput文件夹下看到 LeetCode double findMedianSortedArrays(int[],int[]).dot 文件,我们需要将其重命名为LeetCode.dot(因为生成的文件名包含空格,不能进行图片生成)

接下来我们可以将该文件转化为图片进行查看。(需要安装graphviz,并配置环境变量来使用dot命令)

进入sootOutput文件夹的命令行

dot -Tpng -o LeetCode.png LeetCode.dot

即可生成png格式图片。

这便是soot便于我们分析优化程序运行的基础用法。

soot可以对多种类型的文件进行转化,同样可以生成多种类型的文件进行分析,因为我对于jimple文件还不了解,所以对于其如何分析优化还没有直观印象,还需要进一步了解jimple文件。

二、通过框架使用

接下来是我们通过使用soot框架来生成一个HelloWord.class的例子,这个教程的意义是通过手动调用Soot API生成Hello World程序这种方式来了解基于Soot框架的最基本编程方法,熟悉Soot中Scene,SootClass等类的基本使用方法。

首先我们需要新建一个项目,并将上诉得到的soot.jar包作为依赖导入项目,然后可以进行代码的编写了。

这部分代码运行编译后会得到一个能够使用的class。

因为代码较长需要逐步分析,而我还未彻底吃透该类代码,所以代码及其分析将在下一篇文章写出,我接下来会深入分析soot作为框架是如何通过调用自身API来生成所需目标类,这样做对于程序运行效率有何优化进行学习,哦,还有关于jimple这类文件的基础内容。

关于soot静态分析的学习(一)相关推荐

  1. Soot 静态分析框架(一)整体框架

    1. Soot 静态分析框架 Soot核心对象分别是:Scene.SootClass.SootMethod.SootField.Body. 1.1  Scene Scene:Scene表示完整的分析环 ...

  2. 【Android安全】Soot 静态分析教程

    参考教程 https://github.com/noidsirius/SootTutorial Windows Soot 环境配置 下载代码 git 拷贝仓库 git init git clone h ...

  3. Soot 静态分析框架(二)Soot的核心

    2. Soot核心Body Body 是对应的是Java一个函数体,Body是Soot的核心,Graph.Flow的构建都是基于Body进行分析,当然你可以基于不同的IR语言构建不同的Body,soo ...

  4. Soot 静态分析框架(七)模块分析

    Java 9里开始支持模块化,以一个独立的开源项目jigsaw而来, 具体可以参考链接, https://openjdk.java.net/projects/jigsaw/  同时也可以参考JSR37 ...

  5. Soot 静态分析框架(三)Soot 过程分析

    3.1 Soot构建语法树 Soot通过objectweb来进行字节码构建成语法树 首先scene会去查找一些基础的JVM的类 基础的对象Object, Boolean, Void, Integer, ...

  6. 【软件分析/静态分析】学习笔记02——中间表示Intermediate Representation

  7. 静态分析 第一课 静态分析介绍

    静态分析 第一课 静态分析介绍 本人是北邮19级学生,最近需要使用soot进行java静态分析,但是没有任何静态分析的基础,在北邮人论坛里学长给我推荐了B站南京大学的一个软件分析的网课,感触颇深 这是 ...

  8. Android逆向学习---静态分析反调试apk

    分析环境:JEB2.2.7+IDA7.0  测试手机:nexus IDA7.0下载链接 链接:https://pan.baidu.com/s/1xEtjnTVZFuLiMpHKwMOY2Q 密码:g3 ...

  9. 【静态分析】【系列1-南大软件分析】1.0 导论学习笔记

    文章目录 印象回顾 二刷复习 主要内容 课程说明 本节划重点 个人理解重点和扩展 理解并记忆内容 扩展信息:南大硕士招生信息 印象回顾 昨天看了南大<软件分析>的第一节导论,回忆一下还记得 ...

最新文章

  1. 你最讨厌的同事来自哪家公司?这家公司被上千个程序员怒怼!
  2. thttpd+php 不加载php.ini 问题
  3. matlab调用python函数未定义函数类_从零学习Python—调用函数def用法(下)
  4. 使用Java方法实现 Double和String相互转化
  5. 计算机科学与技术 单片机,单片机-兰州交通大学计算机科学与技术实验教学中心...
  6. ListView排序并隔色显示
  7. struts2 防止重复提交 与 进入等待画面
  8. Python chr / ord 函数区别和使用 - Python零基础入门教程
  9. 飞鸽传书2007程序语言的面向对象最后会成自然语言吗?
  10. 洛谷 深基 第1部分 语言入门 第7章 函数与结构体
  11. 数据结构与算法-黑盒与白盒测试法
  12. css3动画 --- Transition
  13. 格式notepad自动对齐_6.2 对齐设置
  14. SQL Server | Mysql 对表的unique 的实现方式
  15. 鸟类的视力很惊人,如何从高空中发现食物
  16. 基于matlab的16QAM调制解调仿真
  17. Spring 4.x vs Spring 5.x
  18. 制作简易的幸运转盘抽奖
  19. IE浏览器卡死的问题
  20. 计算机二级基础知识【重】

热门文章

  1. 《灰色と青 (灰色与青) 》歌词(平假名注释)
  2. 国际标准之国家编码 - ISO 3166
  3. 《单片机原理及应用》习题
  4. 这些95后表示:是时候打破对程序员的刻板印象了!
  5. 当迷茫在大学泛滥成灾 -- 李开复
  6. 计算机专业留学个人陈述模板,个人陈述 留学|计算机专业留学个人陈述
  7. 书籍《TRIZ理论》
  8. python3爬虫及数据分析_Python3爬虫及可视化数据分析系列图文教程——大纲目录...
  9. 基于Teager-Kaiser能量算子和深度置信网络的往复式压缩机阀门故障诊断方法
  10. 劳动合同法解读二十:试用期工资