doop仓库是一个gradle项目, ./doop
其实就是一个bash去调用gradle命令
#!/usr/bin/env bash ARGS="" while [ "$1" != "" ]; do case "$1" in # Quote arguments with spaces. *\ * ) ARGS="${ARGS} '$1'" ;; *) ARGS="${ARGS} $1" ;; esac shift done # Export number of terminal columns for help display. if command -v 'tput' &> /dev/null then export COLUMNS=`tput cols` fi eval "./gradlew :run -Pargs=\"$ARGS\""
还提供了一个 ./doopOffline
,就是离线模式的doop。通常在每次调用Doop时,底层构建系统都会检查所有依赖库的更新版本。有时可能需要在离线模式下调用doop。为此目的有一个替代脚本。
#!/bin/bash eval './gradlew :run -Pargs="'$@'" --offline'
其实就是gradle加了一个offline参数
Doop 执行流程大致可以分为几步:
- 使用soot生成jimple文件
- 使用
--generate-jimple
参数可以输出jimple文件,在output/$(uuid)/database/jimple
文件夹下 - 将jimple文件转换为datalog引擎的输入事实(.facts)
- 使用souffle引擎执行选定的分析,将关系输出为
.csv
,即分析结果
以长城杯b4bycoffee为例,解压springboot项目,将class文件打包为jar包
unzip b4bycoffee.jar cd BOOT-INF/classes jar -cvf classes.jar *
然后运行
./doop -a context-insensitive --in