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

Soot是一个用于优化Java字节码的静态分析框架,支持Baf、Jimple和Grimp等中间表示方法。通过命令行,可以将.class文件转换为Jimple格式进行分析,也可使用CFGViewer生成图形表示。Soot不仅可用于代码优化,还能作为开发中的工具进行程序分析。
摘要由CSDN通过智能技术生成
本文中关于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这类文件的基础内容。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值