Soot I: 基本了解

Soot是一个开源的Java静态分析框架,由McGill大学维护,支持对Android代码分析,包括静态污点分析。它提供四种IR表示形式,用于不同级别的抽象。Soot的执行过程通过多个packs进行,包括函数内和函数间的分析。用户可以插入自定义的transformations到特定packs中。Soot支持的静态分析包括空指针分析、数组越界分析和活变量分析。要扩展Soot,可以在其Main类中添加自定义分析步骤。
摘要由CSDN通过智能技术生成

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。
看段书中的例子。用
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值