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

这学期选修了程序分析课,作业是基于soot进行一些java程序的静态分析,发现目前不管国内国外对于soot的教程都不太多,要么不太清晰要么太老,打算一边学习一遍记下笔记,方便未来入坑的铁子们少踩坑

0: JAVA配置

建议使用JDK1.8/1.7,版本过高的JDK似乎与soot存在不兼容问题
这一步很简单网上教程很多,主要在于设置$JAVA_HOME

Mac

我的是 MacBook Air (M1 2020): MacOS Monterey version 12.3.1
设置方法很简单

# 修改 .zshrc
sudo vim .zshrc# 在 .zshrc文件中加上以下这行, 版本号可能不同,请自行修改
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home"
# 也有可能是这个路径, 自行check
export JAVA_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"# 保存 source一下
source ~/.zshrc

然后测试下是否OK

java -version
# java version "1.8.0_321"
# Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
# Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)javac -version
# javac 1.8.0_321echo $JAVA_HOME
# /Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home

Windows

我没有在win上进行配置,我的舍友在win11上按照这篇指南配置成功

Linux

应该和Mac类似, 路径可能有所不同自行确认

1: 安装soot

命令行使用

首先下载soot的jar包,选择v4.3.0/下的soot-4.3.0-jar-with-dependencies.jar, 其他文件按自己需要下载
为了方便我把下载下来的jar重命名为了soot.jar并放在了/Applications目录下, 并且像上面设置JAVA_HOME一样设置了SOOT_HOME="/Applications/soot.jar"
接着检验下是否安装成功

java -cp $SOOT_HOME soot.Main -h
# General Options:
# -coffi                        Use the good old Coffi front end for parsing
#                               Java bytecode (instead of using ASM).
# -jasmin-backend               Use the Jasmin back end for generating Java
#                               bytecode (instead of using ASM).
# -h, -help                     Display help and exit
# ...

IntelliJ IDEA使用

Maven方式导入

在项目下pom.xml文件中加入以下

<dependency><groupId>org.soot-oss</groupId><artifactId>soot</artifactId><version>4.3.0</version><scope>compile</scope>
</dependency>

直接导入 soot.jar

进入File -> Project Structure -> Modules,右侧Module SDK下面的+ -> 1 JARs or Directories,找到你下的soot.jar即可

2: 生成Jimple

Jimple是soot提供的四种IR(中间表示)之一,这里暂时不多做介绍

命令行方式生成

输入java -cp $SOOT_HOME soot.Main -cp . -pp -f J com.Foo:

  • -cp $SOOT_HOME: 指定soot class path
  • -cp .: 指定所要分析的项目的path
  • -pp: 指定soot去自动搜索java的path, 主要是rt.jarjce.jar, soot会去$JAVA_HOME下找,所以必须先设置好
  • -f J: 指定输出文件类型, J就是jimple
  • com.Foo: 你要分析的class的名字
    然后就得到.jimple文件啦

代码方式生成

会比较复杂一些,主要关注setupSoot(...)函数,其他的部分可以暂时不理解

package com;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import soot.*;
import soot.options.Options;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;public class DemoSoot {// 省略了一些无关紧要的...private final static Logger logger = LoggerFactory.getLogger("LVA Logger");// 主要关注这里public static void setupSoot(String className) {// Soot class path// "./"是我的项目根目录, "src/main/java"下存着当前com.DemoSoote, "src/test/java"下存着我要分析的类FooString classesDirMain = "./src/main/java"; String classesDirTest = "./src/test/java";String jceDir = System.getProperty("java.home") + "/lib/jce.jar";String jrtDir = System.getProperty("java.home") + "/lib/rt.jar";String path = jrtDir + File.pathSeparator + jceDir;path += File.pathSeparator + classesDirMain + File.pathSeparator + classesDirTest;// Init SceneScene.v().setSootClassPath(path);// Add necessary optsOptions.v().set_process_dir(Collections.singletonList(classesDirMain));Options.v().set_process_dir(Collections.singletonList(classesDirTest));// Set Main classSootClass mainClass = Scene.v().loadClassAndSupport(className);Scene.v().setMainClass(mainClass);}public static void main(String[] args) throws IOException {// 确保你要分析的文件能够编译,不然会寄掉String mainClassName = "Foo";try {setupSoot(mainClassName);} catch (CompilationDeathException e) {logger.error(e.toString());return;}// 启动soot, 相当于命令行使用中的"soot.Main"soot.Main.main(args);logger.info("---------soot.Main.main()---------");// 获取 FooSootClass mainClass = Scene.v().getMainClass();logger.info(String.format("Loading Class: %s ...", mainClass.getName()));// 获取 Foo中的main函数String methodSignature = "void main(java.lang.String[])";SootMethod mainMethod = mainClass.getMethod(methodSignature);logger.info(String.format("Loading Method: %s ...", mainMethod));// 通过获取的main函数生成jimpleBodyBody jimpleBody = mainMethod.retrieveActiveBody();logger.info("Retrieving method body ...");//将jimple写入文件中, 自行设定你的"rootPath"String rootPath = "/Users/caohch1/Projects/ProgramAnalysis/HW1/jimples/";String filePath = rootPath + mainClass.getName() + "-" + mainMethod.getName() + ".jimple";FileWriter fileWriter = new FileWriter(filePath);try (BufferedWriter out = new BufferedWriter(fileWriter)) {out.write(jimpleBody.toString());} finally {logger.info(String.format("Writing %s ...", filePath));}}
}

还有一种更简单的方式,前提是正确配置了JAVA_HOME路径

    String classesDirMain = "./src/main/java/";String classesDirTest = "./src/test/java/";String classesDirCurr = "./";void setupSoot() {Options.v().set_prepend_classpath(true);Options.v().set_process_dir(Collections.singletonList(classesDirMain));Options.v().set_process_dir(Collections.singletonList(classesDirTest)); // 注意,会覆盖掉上一行Options.v().set_process_dir(Collections.singletonList(classesDirCurr));}

3: Next & Refs

之后会继续分享soot学习中的笔记,主要可能包括对API的使用和理解,但是我也是刚刚接触soot,有问题之处可以一起讨论,我的邮件: chc2267408610@gmail.com

同时分享几个主要的soot的教程,虽然都有些难啃或者过时

  • 官方Wiki
  • Soot生存指南, 太老了有些过时
  • Analyzing Java Programs with Soot和Soot, a Tool for Analyzing and Transforming Java Bytecode,例子中代码并不全,但是可以看看对soot形成大致概念
  • Soot JavaDoc, 个人认为最重要的

Soot入门(1): 安装与生成Jimple文件相关推荐

  1. live555库安装_live555生成库文件

    若需要将live555编译共享库,可以借助config.linux-with-shared-libraries配置文件.首先需要修改配置文件的交叉编译器: 1.在该文件26行处添加 26 CROSS_ ...

  2. java 写日志太快_Log4j2 快速入门 —— 定期/定大小生成日志文件(三)

    Log4j2 对于生成日志文件时,可以通过对中的进行设置,来完整日志文件各种生成方案 定期生成日志文件 log4j2.xml user/logs filePattern="${LOG_HOM ...

  3. pyinstaller安装以及生成exe文件

    安装pyinstaller (windows下)终端输入: python -m pip install --user pyinstaller(或者直接pip install pyinstaller) ...

  4. Docker入门之安装Docker

    目录 目录 1 1. 前言 2 2. 基本概念 3 2.1. 仓库 3 2.2. 镜像ID和容器ID 3 3. 创建网桥 3 4. 安装Docker 4 4.1. 二进制安装 4 4.1.1. 下载安 ...

  5. 安装texlive并用latex编写一段中文,最后生成pdf文件

    安装texlive并用latex编写一段中文,最后生成pdf文件 **#一.下载安装(**链接https://tug.org/texlive/) ##1.第一步 ##2.第二步 ##3.第三步 ##4 ...

  6. django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)

    from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...

  7. MDT 2013 从入门到精通之Office 2013应答文件生成

    今天我们来学习并了解有关Office 2013应答文件的生成,从而实现在MDT 2013自动化部署过程中Office 2013的自动安装.上一章我们接触到的命令是setup /config confi ...

  8. html与css入门经典doc,HTML+CSS入门 flying-saucer如何利用HTML来生成PDF文件

    本篇教程介绍了HTML+CSS入门 flying-saucer如何利用HTML来生成PDF文件,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < 1.导入maven依赖 9. ...

  9. python setup.py bdist_wheel生成wheel文件,示例:安装webrtcvad

    概述 有些python包在pypi上的wheel文件年代久远,且平台不齐全,例如:webrtcvad 因此需要利用setup.py进行安装 本文还提供了Python3.7下,webrtcvad的最新版 ...

最新文章

  1. 矩阵分析与多元统计12 0-1矩阵 交换矩阵与Kronecker乘积
  2. rstudio 关联r_使用关联规则提出建议(R编程)
  3. Python中如何创建元素为ndarray的list
  4. jQuery使用总结 - jQuery组成和主要功能 1/4
  5. java宠物实训报告,基于Java的宠物用品商城的设计与实现-开题报告
  6. spark MapPartitionsRDD及ShuffleRDD
  7. Avaya Aura™ 独家观察报告
  8. 川希:精准引流的本质,被动涨粉的秘密。
  9. 天线越大越好吗_路由器的天线是不是越多越好?告知你真实答案,很多人都买错了...
  10. SAP库存盘点必要知识
  11. SubShader中的LOD
  12. On the Opportunities and Risks of Foundation Models- APPLICATIONS
  13. Magento Meigee-Glam 主题的用法
  14. 拼图游戏(8 puzzle)
  15. 音视频开发:大华摄像头配置RTSP与RTMP地址访问视频画面
  16. 晚上学习效率太低怎么办?
  17. 微信粤语语音转文字 讯飞输入法更懂粤语直出文字
  18. 使用MCGS触摸屏与单片机通讯的心得
  19. 学弟啊,你代码能不能不要写得这么烂?!--文末送书
  20. 实用Python库大全

热门文章

  1. Tomcat安装教程(windows)
  2. 遗传算法综述(三、 流程结构与编码解码(二进制编码,格雷码编码浮点数编码、符号编码))
  3. P1006晴天小猪历险记之Hill
  4. JVM系列之:你知道Jhsdb整合的故障处理工具
  5. oracle @spool,Oracle Spool详解
  6. php 微信公众号故障,微信公众号自动回复报错该公众号提供的服务出现故障
  7. 监控宝与zenoss监控之对比
  8. 36条微信公众账号运营的心得总结
  9. php怎么和数据库建立连接数据库服务器端,PHP和 mysql 数据库服务器连接上,才能进一步操作数据库。...
  10. 51单片机 01点亮小灯泡