Soot 命令行或程序运行常见问题

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Soot是一个Java字节码分析和转换框架,可以用来做很多事情,如代码优化、程序分析、安全检测等。在IntelliJ IDEA中使用Soot需要按照以下步骤进行配置: 1. 下载Soot 你可以从Soot的官网上下载最新版本的Soot,或者从Maven中央仓库中获取Soot的依赖。将Sootjar包添加到项目依赖中。 2. 配置IntelliJ IDEA 打开IntelliJ IDEA,在项目中添加Sootjar包。在项目结构中选择“Modules”,然后选择“Dependencies”选项卡,点击“+”按钮添加Sootjar包。同时,需要在项目的“Run Configuration”中设置Sootclasspath,使Soot可以访问到项目的类文件。 3. 编写Soot分析程序 使用Soot进行字节码分析需要编写Java程序。在程序中,需要设置Soot的Options,如输入文件、要进行的分析等。例如: ``` public static void main(String[] args) { String analysisClass = "com.example.MainClass"; String[] sootArgs = { "-w", // 开启整个程序的分析 "-cp", "target/classes", // 设置classpath "-process-dir", "target/classes", // 设置输入目录 "-app", // 分析整个应用 analysisClass // 分析的类 }; PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTransform", new BodyTransformer() { @Override protected void internalTransform(Body body, String s, Map<String, String> map) { // 分析代码 } })); soot.Main.main(sootArgs); } ``` 4. 运行Soot程序 在IntelliJ IDEA中运行Soot程序,可以在控制台中看到Soot的分析结果。你也可以将分析结果保存到文件中,以便后续分析或可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值