原文地址:点击打开链接
获得Soot
你可以从Soot官方下载页面下载最近发布的Soot版本,有许多不同的版本可供你选择,但通常你只需下载像下面这样形式的版本:
$ java -cp soot-2.5.0.jar soot.Main
Soot version 2.5.0
Copyright (C) 1997-2010 Raja Vallee-Rai and others.
All rights reserved.
...
Bleeding-edge version(前沿版本) (nightly build)
$ java -cp soot-2.5.0.jar soot.Main --help
General Options:
-coffi Use the good old Coffi front end for parsing
Java bytecode (instead of using ASM).
-h -help Display help and exit
-pl -phase-list Print list of available phases
-ph PHASE -phase-help PHASE Print help for specified PHASE
-version Display version information and exit
-v -verbose Verbose mode
...
Soot的全部命令行选项从 这里可以找到,我们建议Soot的初学者看看这个文档。
$ ls *.java A.java B.java $ java -cp soot-2.5.0.jar soot.Main A B Soot started on Thu Aug 21 08:26:41 GMT-05:00 2014 Exception in thread "main" java.lang.RuntimeException: couldn't find class: A (is your soot-class-path set properly?)</code>
运行之后,出现问题了,对了,忘了最重要的一点:Soot有它自己的类路径
$ java -cp soot-2.5.0.jar soot.Main -cp . A B
Soot started on Thu Aug 21 08:32:13 GMT-05:00 2014
Exception in thread "main" java.lang.RuntimeException: couldn't find class: java.lang.Object (is your soot-class-path set properly?)
又出现问题了,很明显Soot现在能够找到类A和B了(至少它不在报错没找到类A和B),但报错的是缺失
java.lang.Object。
$ java -cp soot-2.5.0.jar soot.Main -cp .:/home/user/ebodde/bin/sun-jdk1.6.0_05/jre/lib/rt.jar A B
Soot started on Thu Aug 21 08:42:09 GMT-05:00 2014
Transforming B...
Transforming A...
Writing to sootOutput/B.class
Writing to sootOutput/A.class
Soot finished on Thu Aug 21 08:42:12 GMT-05:00 2014
Soot has run for 0 min. 3 sec.
看起来成功了,Soot成功的处理了这两个
.java (译者注:即命令行里的A和B),并把
.class 结果文件放在 sootOutput文件夹里。注意到通常,Soot将会处理你在命令行里指定的所有类,同时还会处理这些命令行指定的类所引用到的类。
$ java -cp soot-2.5.0.jar soot.Main -cp .:~/bin/sun-jdk1.6.0_05/jre/lib/rt.jar A B
Soot started on Thu Aug 21 08:43:43 GMT-05:00 2008
Exception in thread "main" java.lang.RuntimeException: couldn't find class: java.lang.Object (is your soot-class-path set properly?)
发生了什么事?你使用 “~” 因为这个符号指向你的home目录,但问题是通常shell会将 "~" 进行翻译(即指向home目录),但在这里不行。Soot把字符 “~” 作为它的命令行的选项故而它不能对其解释,将它翻译成指向你的home目录。
所以在 Soot的classpath里最好使用绝对或相对路径。
$ java -cp soot-2.5.0.jar soot.Main -cp . -pp A B Soot started on Thu Aug 21 08:47:42 GMT-05:00 2008
Transforming A...
Transforming B...
Writing to sootOutput/A.class
Writing to sootOutput/B.class
Soot finished on Thu Aug 21 08:47:46 GMT-05:00 2008
Soot has run for 0 min. 3 sec.
这比每次要添加classpath要简单多了,这也正是我们为什么要添加这个选项。
-pp 代表前置路径(prepend path)。这意味着Soot会自动添加下面这些东西到它的classpath(有序添加)
$ java -cp soot-2.5.0.jar soot.Main -allow-phantom-refs -cp . A B
Soot started on Thu Aug 21 08:52:35 GMT-05:00 2008
Warning: java.lang.Short is a phantom class!
Warning: java.lang.Class is a phantom class!
Warning: java.lang.Character is a phantom class!
...
Transforming B...
Transforming A...
Writing to sootOutput/B.class
Writing to sootOutput/A.class
Soot finished on Thu Aug 21 08:52:37 GMT-05:00 2008
Soot has run for 0 min. 1 sec.
这能干什么? 通常这个选项告诉Soot “我不想给你你没有的类,但是请给我一个最好的结果(在没有这些类的情况下)”,这种情况下Soot给每个它无法解析的类创建一个幻影类(phantom class),并告诉你。注意到这个方法用途有限,在许多情况下不会得到你想要的结果。只有在你知道自己在做什么的情况下使用这个选项。
$ java -cp soot-2.5.0.jar soot.Main -cp . -pp -process-dir .
Soot started on Thu Aug 21 09:01:12 GMT-05:00 2014
Transforming A...
Transforming B...
Writing to sootOutput/A.class
Writing to sootOutput/B.class
Soot finished on Thu Aug 21 09:01:15 GMT-05:00 2014
Soot has run for 0 min. 3 sec.
$ java -cp soot-2.5.0.jar soot.Main -cp . -pp -process-dir .
Soot started on Thu Aug 21 09:02:29 GMT-05:00 2008
Exception in thread "main" java.lang.RuntimeException: Error: class A read in from a classfile in which sootOutput.A was expected.
发生了什么? 就如我前面提到的,Soot把生成的 .class 文件放入sootOutput文件夹,这个文件夹位于 “.” 当前目录。因此Soot现在处理的是先前生成的文件,同时报错:名为“A”的类已经存在于 ./sootOutput/A ,这个类实际上是 sootOutput.A ,即在 sootOutput包里。因此,
当使用 -process-dir 选项时同时使用 -d 选项来重定向 soot 的输出文件夹:
$ java -cp soot-2.5.0.jar soot.Main -cp . -pp -process-dir . -d /tmp/sootout
Soot started on Thu Aug 21 09:06:29 GMT-05:00 2008
Transforming A...
Transforming B...
Writing to /tmp/sootout/A.class
Writing to /tmp/sootout/B.class
Soot finished on Thu Aug 21 09:06:32 GMT-05:00 2008
Soot has run for 0 min. 2 sec.
重定向的文件夹为 /tmp/sootout,这不是当前目录的子目录。