Soot(Java静态分析框架)入门
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静态分析框架)入门相关推荐
- Java Spring框架入门详解教程【多测师_何sir】
Spring框架入门详解教程 spring概述 spring结构 spring IOC spring DI spring概述 Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多 ...
- JAVA三大框架入门(学习)
一.基本概念 了解框架的定位可以帮助我们更好的找到学习的切入点 1.Spring 依赖注入(DI)又称为控制反转(IOC),通常来说,当某个角色需要另一个角色才能正常运行时,通常是由调用者来创建被调用 ...
- java struts2 框架 入门简介
目录 一.Struts2框架执行流程 二.Struts2的快速入门 1.导入jar包 2.配置web.xml文件 3.配置struts.xml文件 4.创建Action来完成逻辑操作 三.Struts ...
- Java Collection框架入门
容器在Java语言开发中有着非常重要的作用,Java提供了多种类型的容器来满足开发的需要,容器不仅在面试笔试中也是非常重要的一个知识点,在实际开发的过程中也是经常会用到.因此,对容器的掌握是非常有必要 ...
- c++框架有哪些_Java Mybatis框架入门教程_v20200726
MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...
- Soot 静态分析框架(一)整体框架
1. Soot 静态分析框架 Soot核心对象分别是:Scene.SootClass.SootMethod.SootField.Body. 1.1 Scene Scene:Scene表示完整的分析环 ...
- Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)
1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...
- 【万字长文】Dubbo 入门总结 ,一款高性能的 Java RPC 框架
这篇文章是我学习整理 Dubbo 的一篇文章,首先大部分内容参考了官网 + 某硅谷的视频,内容讲解进行了重新编排,40多张图片,也都是我修改重制的,虽然一万多字,但是其实也可以看出来,更多的内容集中在 ...
- 【Java学习路线之JavaWeb】Spring MVC框架入门教程
文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...
最新文章
- 为什么要强制弃坑Fastjson而主推Jackson?
- python【蓝桥杯vip练习题库】ALGO-232找零钱(贪心 模拟)
- 网络埋藏了怎样的物联网智慧?
- java源文件怎么发送给别人_自己的java程序怎么给别人用
- Tcp方式采集CNC兄弟设备数据
- JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
- .bash_profile和.bashrc的区别(如何设置生效)
- 全栈入门_启动数据栈入门包(2020)
- CV Papers|计算机视觉论文推荐周报20200502期
- centos7 日志文件
- Android NDK开发之 opencv manage 免安装生成opencv应用
- 菜鸟从零学习数据库(三)——存储过程
- windows下支持H265的rtmp ffplay播放器 ffmpeg的编译
- red5视频直播初探
- multisim异或门
- 如何用markdown排版公众号,使用排版神器Markdown Nice
- WINDOWS10 win+L 锁屏快捷键失效
- 简单介绍一下v-if 的几种用法
- 红黑树·删除操作,详细图解
- 深入理解蓝牙BLE之“BQB认证”
热门文章
- 【Android Gradle 插件】LintOptions 配置 ③ ( LintOptions#error 方法配置 | Lint 问题 ID | 查询 Lint 问题 ID 列表 )
- oracle spool报错,Oracle spool格式化数据使用
- 以通信方式共享内存,不要以共享内存方式通信(2)
- 机器学习里的 kernel 是指什么?
- LruCache的使用
- 各指数的历史-市盈率平均估值
- 一篇文章彻底学会画数据流图
- 游戏夜读 | 网络游戏怎么赚钱?
- 《鹰猎长空》分析国产儿童电影的历史经验与道路
- servlet在线中文API