Soot入门(1): 安装与生成Jimple文件
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.jar
和jce.jar
, soot会去$JAVA_HOME
下找,所以必须先设置好-f J
: 指定输出文件类型,J
就是jimplecom.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文件相关推荐
- live555库安装_live555生成库文件
若需要将live555编译共享库,可以借助config.linux-with-shared-libraries配置文件.首先需要修改配置文件的交叉编译器: 1.在该文件26行处添加 26 CROSS_ ...
- java 写日志太快_Log4j2 快速入门 —— 定期/定大小生成日志文件(三)
Log4j2 对于生成日志文件时,可以通过对中的进行设置,来完整日志文件各种生成方案 定期生成日志文件 log4j2.xml user/logs filePattern="${LOG_HOM ...
- pyinstaller安装以及生成exe文件
安装pyinstaller (windows下)终端输入: python -m pip install --user pyinstaller(或者直接pip install pyinstaller) ...
- 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. 下载安 ...
- 安装texlive并用latex编写一段中文,最后生成pdf文件
安装texlive并用latex编写一段中文,最后生成pdf文件 **#一.下载安装(**链接https://tug.org/texlive/) ##1.第一步 ##2.第二步 ##3.第三步 ##4 ...
- django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)
from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...
- MDT 2013 从入门到精通之Office 2013应答文件生成
今天我们来学习并了解有关Office 2013应答文件的生成,从而实现在MDT 2013自动化部署过程中Office 2013的自动安装.上一章我们接触到的命令是setup /config confi ...
- html与css入门经典doc,HTML+CSS入门 flying-saucer如何利用HTML来生成PDF文件
本篇教程介绍了HTML+CSS入门 flying-saucer如何利用HTML来生成PDF文件,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < 1.导入maven依赖 9. ...
- python setup.py bdist_wheel生成wheel文件,示例:安装webrtcvad
概述 有些python包在pypi上的wheel文件年代久远,且平台不齐全,例如:webrtcvad 因此需要利用setup.py进行安装 本文还提供了Python3.7下,webrtcvad的最新版 ...
最新文章
- 矩阵分析与多元统计12 0-1矩阵 交换矩阵与Kronecker乘积
- rstudio 关联r_使用关联规则提出建议(R编程)
- Python中如何创建元素为ndarray的list
- jQuery使用总结 - jQuery组成和主要功能 1/4
- java宠物实训报告,基于Java的宠物用品商城的设计与实现-开题报告
- spark MapPartitionsRDD及ShuffleRDD
- Avaya Aura™ 独家观察报告
- 川希:精准引流的本质,被动涨粉的秘密。
- 天线越大越好吗_路由器的天线是不是越多越好?告知你真实答案,很多人都买错了...
- SAP库存盘点必要知识
- SubShader中的LOD
- On the Opportunities and Risks of Foundation Models- APPLICATIONS
- Magento Meigee-Glam 主题的用法
- 拼图游戏(8 puzzle)
- 音视频开发:大华摄像头配置RTSP与RTMP地址访问视频画面
- 晚上学习效率太低怎么办?
- 微信粤语语音转文字 讯飞输入法更懂粤语直出文字
- 使用MCGS触摸屏与单片机通讯的心得
- 学弟啊,你代码能不能不要写得这么烂?!--文末送书
- 实用Python库大全
热门文章
- Tomcat安装教程(windows)
- 遗传算法综述(三、 流程结构与编码解码(二进制编码,格雷码编码浮点数编码、符号编码))
- P1006晴天小猪历险记之Hill
- JVM系列之:你知道Jhsdb整合的故障处理工具
- oracle @spool,Oracle Spool详解
- php 微信公众号故障,微信公众号自动回复报错该公众号提供的服务出现故障
- 监控宝与zenoss监控之对比
- 36条微信公众账号运营的心得总结
- php怎么和数据库建立连接数据库服务器端,PHP和 mysql 数据库服务器连接上,才能进一步操作数据库。...
- 51单片机 01点亮小灯泡