Soot 命令行或程序运行常见问题
文章目录
前言
刚刚开始使用Soot经常会遇到各种问题,究其原因还是语言的局限性。对英文工具的不理解。另外,Soot能带来的分析功能还是比较多的,根据需求合理设置Option也很重要。
一、soot.SootResolver$SootClassNotFoundException:
couldn't find class: *** *** (is your soot-class-path set properly?)
原因:没有提供Soot分析的必要函数库依赖, 即 soot-class-path。
方法1:-pp 使用默认依赖 与JAVA_HOME配置有关
java -cp soot.jar soot.Main -pp -cp . HelloWorld
方法2:–soot-classpath (记得之前可以,刚试了一下竟然报错)
java -cp soot.jar soot.Main --soot-classpath .;"%JAVA_HOME%"\jre\lib\rt.jar;"%JAVA_HOME%"\jre\lib\jce.jar HelloWorld
二、以下这种乱七八糟的错误,我觉得根本原因都是 -cp 命令的使用问题
soot.CompilationDeathException: No input classes specified!
java.lang.RuntimeException: None of the basic classes could be loaded!
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.Exception: Error: The path '*** ***' does not exist.
Soot设定为优先在自身所在目录下寻找依赖文件和目标文件,尽管它并没有,这需要我们合理使用 -cp
命令来找到分析目标。
例如 :
C:\Users\15867> java -cp E:\TestProgram\soot.jar soot.Main -cp E:\TestProgram HelloWorld -pp
尽管我们在cmd用户路径下,依然可以通过-cp
来为Soot指定分析路径,进而分析其他文件目录下的.class
文件(HelloWorld)
三、 程序运行Soot
方法1: Soot.Main 原理同命令行运行
List<String> classpath = new ArrayList<>();
String jreHome = System.getProperty("java.home");
classpath.add(joinPath(jreHome, "lib", "rt.jar"));
classpath.add(joinPath(jreHome, "lib", "jce.jar"));
// soot.options.Options.v().set_whole_program(true);
soot.Main.main(new String[]{
"-w",
"-f", "J",
"-p", "cg.spark", "enabled:true",
"-p", "wjtp.myapp", "enabled:true",
"-soot-class-path", String.join(File.pathSeparator, classpath),
args[0] /*需要分析的.class文件路径*/
});
方法2: Options运行
Printertemp printertemp = new Printertemp();
Transform t0 = new Transform("wjtp.Printertemp", printertemp);
PackManager.v().getPack("wjtp").add(t0);
Options.v().set_whole_program(true);
Options.v().set_allow_phantom_refs(true);
Options.v().set_prepend_classpath(true);
Options.v().set_process_dir(Arrays.asList("*** ***"));//需要分析的.class文件路径
Options.v().setPhaseOption("jb", "use-original-names:true");
// Options.v().setPhaseOption("wjtp.Printertemp", "enabled:true");
Options.v().set_keep_line_number(true);
Options.v().set_output_format(Options.output_format_jimple);
Scene.v().loadNecessaryClasses();
PackManager.v().runPacks();
语义大致同上
总结
刚刚开始使用,糊里糊涂感觉也很正常。随笔而已,期待指导 指正!邮箱:1586715286@qq.com