本文主要是介绍使用SOOT进行代码分析(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
代码分析--SOOT
Soot是一个由java编写的、代码优化和分析工具,它可以分析源代码,并对中间文件进行分析。
SOOT作为一个eclipse插件,能够在eclipse中进行安装和运行,下面简单介绍一下SOOT插件的安装过程:
打开eclipse,在Help中选择Install New Software,点击add,Name随便写一个,网址输入:http://sable.github.io/soot/eclipse/

选择soot即可,点击next,安装,安装完成后,重启eclipse。
注意:luna、mars版本的eclipse安装过程没毛病,不过安装完成后显示不出soot插件;
我下载了kepler版本的,在project中有一个soot菜单项
另外,点击项目代码文件(java文件),右键鼠标,也能看到soot选项
soot安装完成了,接下来可以使用soot来做代码分析了:
在项目中选择要分析的代码文件,点击右键,选择soot选项,可以进行Jimple 、 Grimp 的生成:
对于Jimple/Grimp介绍,引用:http://blog.csdn.net/majestyhao/article/details/43793293
Soot包括四种IR(中间码-表示形式),分别代表了四种对Java Sourcode或者bytecode的不同程度的抽象。
Baf - 基于栈的bytecode
传统的JVM bytebode是基于栈操作的指令集(Dalvik 基于寄存器操作),与之对应的Baf同样如此。那Baf抽象了什么呢?两个,忽略了constant pool(常量池)和bytecode指令中的type依赖。在bytecode中对不同保留类型,如int和float,的同一操作(如add),有不同的指令。这是因为在计算机中整形和浮点型的表达方式是不一样的,在底层实现时无法让两个操作符分属于这两种不同类型,也就是需要不同的指令对应不同的数据类型的操作。我们做分析时不用在意它到底调用的什么类型的指令,不对int还是float做细致区分,只要知道它是个数且知道是对这数的什么样的操作就行了。Baf因此用于在bytecode层面上的分析。
Jimple - typed, 3-addresses, statement based。
Jimple是Soot的核心,是四种IR中最重要的。Soot能直接创建Jimple码,也可由Java sourcecode或者bytecode转化翻译而来。bytecode会被翻译成untyped Jimple,再通过type inference 方法对局部变量加上类型。翻译的重要一步是对表达式作线性化使得每个statement只能最多refernce 3个局部变量或者常量(没懂。。)。相对于bytecode的200多种指令,Jimple只有15条,分别对应着核心指令的 NopStmt, IdentityStmt, AssignStmt;函数内控制流指令的IfStmt, GotoStt, TableSwitchStmt和LookUpSwitchStmt,函数间控制流的InvoeStmt, ReturnStmt, ReturnVoidStmt, 监视器指令EnterMonitorStmt和ExitMonitorStmt,最后处理异常ThrowStmt和退出的RetStmt。
Shimple -- Static Single Assignment 版的Jimple
和Jimple基本一样,只有两点不同: SSA 和phi-node。SSA保证了每个局部变量都有一个静态定义。
目前还没有看到用SSA的可能,先暂时略过。
Grimp -- 更适合人读的
和Jimple类似,多了允许树形表达和new指令。相比于Jimple,更贴近Java code,所以更适合人来读。
可以选择run soot进行相关的设置:
设置output options将输出格式设置为xml,既可以在sootoutput目录下找到相应的文件
对于生成文件的解析,先做一下研究。。。。。。
这篇关于使用SOOT进行代码分析(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!