Static analysis指在不对program进行运行的情况下,对其行为进行分析。搞compiler的人用之于优化,搞安全的用于做taint analysis。对于Java有两大开源的static analysis 框架,Soot和WALA,前者由McGill大学维护,后者是IBM。最新的Soot开始支持对Andoird 代码分析,包括static taint analysis。
从这篇开始,我们将由浅入深的对Soot进行了解,使用,甚至扩展。在这里默认读者对static analysis理论(lattice, 不动点, may & must等),Java source code和bytecode语法有基本了解。将主要依据Soot 官网提供的资料作为依据,特别是那本『生存手册』(点击打开链接)。
好了,现在我们开始。
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。
看段书中的例子。用