soot入门

  • 1. HelloWorld生成Jimple
    • 1.1 创建Helloworld.java
    • 1.2 编译java文件,生成bytecode
    • 1.3 生成Jimple文件
    • 1.4 查看Jimple文件
  • 2. 使用soot生成VFG控制流图
    • 2.1 构建程序代码
    • 2.2 编译java文件,生成bytecode
    • 2.3 使用soot.tools.CFGViewer生成控制流图

1. HelloWorld生成Jimple

1.1 创建Helloworld.java

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

1.2 编译java文件,生成bytecode

javac HelloWorld.java

此时src目录下,通过javac编译生成HelloWorld.class字节码文件

1.3 生成Jimple文件

拷贝soot.jar到当前目录
执行命令:

java -cp .\soot.jar soot.Main -pp -cp . -f J HelloWorld

其中:
-cp .\soot.jar: 指定soot class路径
-pp: 指定soot搜索的Java路径
-cp . : 指定要分析项目的路径,.表示当前路径
-f J: 指定输出文件的类型,为Jimple
HelloWorld: 指定需要分析的class文件

1.4 查看Jimple文件

当面目录下会自动生成sootOutPut文件夹,文件夹下会有刚生成好的HelloWorld.jimple文件

生成的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;}
}

2. 使用soot生成VFG控制流图

2.1 构建程序代码

为了使VFG流图更饱满,使用的代码参考Leetcode第4题(困难)的解析代码:

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];}}}

2.2 编译java文件,生成bytecode

javac LeetCode.java

2.3 使用soot.tools.CFGViewer生成控制流图

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


运行上述命令则会在SootOutPut目录下,生成dot文件。(p.s.需要修改一下dot文件名,自动生成的dot文件名中带有空格,会导致命令行操作失败)

进入sootOutPut目录,执行命令:

dot -Tpng -o LeetCode.png LeetCode.dot

则会在目录下生成相对应的png文件。

Soot(Java静态分析框架)入门相关推荐

  1. Java Spring框架入门详解教程【多测师_何sir】

    Spring框架入门详解教程 spring概述 spring结构 spring IOC spring DI spring概述 Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多 ...

  2. JAVA三大框架入门(学习)

    一.基本概念 了解框架的定位可以帮助我们更好的找到学习的切入点 1.Spring 依赖注入(DI)又称为控制反转(IOC),通常来说,当某个角色需要另一个角色才能正常运行时,通常是由调用者来创建被调用 ...

  3. java struts2 框架 入门简介

    目录 一.Struts2框架执行流程 二.Struts2的快速入门 1.导入jar包 2.配置web.xml文件 3.配置struts.xml文件 4.创建Action来完成逻辑操作 三.Struts ...

  4. Java Collection框架入门

    容器在Java语言开发中有着非常重要的作用,Java提供了多种类型的容器来满足开发的需要,容器不仅在面试笔试中也是非常重要的一个知识点,在实际开发的过程中也是经常会用到.因此,对容器的掌握是非常有必要 ...

  5. c++框架有哪些_Java Mybatis框架入门教程_v20200726

    MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...

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

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

  7. Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)

    1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...

  8. 【万字长文】Dubbo 入门总结 ,一款高性能的 Java RPC 框架

    这篇文章是我学习整理 Dubbo 的一篇文章,首先大部分内容参考了官网 + 某硅谷的视频,内容讲解进行了重新编排,40多张图片,也都是我修改重制的,虽然一万多字,但是其实也可以看出来,更多的内容集中在 ...

  9. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

最新文章

  1. 为什么要强制弃坑Fastjson而主推Jackson?
  2. python【蓝桥杯vip练习题库】ALGO-232找零钱(贪心 模拟)
  3. 网络埋藏了怎样的物联网智慧?
  4. java源文件怎么发送给别人_自己的java程序怎么给别人用
  5. Tcp方式采集CNC兄弟设备数据
  6. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
  7. .bash_profile和.bashrc的区别(如何设置生效)
  8. 全栈入门_启动数据栈入门包(2020)
  9. CV Papers|计算机视觉论文推荐周报20200502期
  10. centos7 日志文件
  11. Android NDK开发之 opencv manage 免安装生成opencv应用
  12. 菜鸟从零学习数据库(三)——存储过程
  13. windows下支持H265的rtmp ffplay播放器 ffmpeg的编译
  14. red5视频直播初探
  15. multisim异或门
  16. 如何用markdown排版公众号,使用排版神器Markdown Nice
  17. WINDOWS10 win+L 锁屏快捷键失效
  18. 简单介绍一下v-if 的几种用法
  19. 红黑树·删除操作,详细图解
  20. 深入理解蓝牙BLE之“BQB认证”

热门文章

  1. 【Android Gradle 插件】LintOptions 配置 ③ ( LintOptions#error 方法配置 | Lint 问题 ID | 查询 Lint 问题 ID 列表 )
  2. oracle spool报错,Oracle spool格式化数据使用
  3. 以通信方式共享内存,不要以共享内存方式通信(2)
  4. 机器学习里的 kernel 是指什么?
  5. LruCache的使用
  6. 各指数的历史-市盈率平均估值
  7. 一篇文章彻底学会画数据流图
  8. 游戏夜读 | 网络游戏怎么赚钱?
  9. 《鹰猎长空》分析国产儿童电影的历史经验与道路
  10. servlet在线中文API