Soot从入门到精通(一):写一个HelloSoot
接触soot很久了,网上资料比较少,很多时候都是学术界在搞这个,工业界用它的人并不多,之前也有朋友想让我开这个系列,我觉得也有必要为后人留下一点有用的东西。开个系列吧,估计是个长期的栏目,试试水。
一、背景
Soot提供的功能有很多,使用时候配置的东西也很多,一时半会是讲不完的,我用它主要是从安全人员的角度出发,从逆向的角度,去审计一些jar和apk,从而节省人力成本。
类似的工具,见过的不多,能数出来的、公开的产品可能是FindSecBugs、FlowDroid、360写的火线、据传阿里聚安全提供的apk扫描,主要思路都一样,反汇编,构造调用图,制定规则。因为各个轮子提供的API都各种各样,所以我用Soot只是一个巧合,可能是因为Flanker前辈最开始用的是soot,后来工作时接的FlowDroid也是soot,现在接的扫描器前人也是用soot写的。也就这么一直用下去了,也推荐后人使用它,至少我觉得这玩意还是很好用的。
目前我在维护自家的产品,要做代码审计,8102年了,肯定要自动化的。学习了很多比较成熟的厂商的案例,例如BAT、数字提供的在线扫apk的业务,通过表现猜测应该是较为完备的正则(我不知道啊,我乱猜的),也有美丽联合SRC公开的扫源码工具,自己构造AST,自己写规则,支持很多语言;其他的不大记得,反正看的挺多的。
扫源码和扫jar包,二者是类似的,但又不完全一样。如果抛开解析文件,只考虑功能的话,扫源码时,依赖的第三方jar的扫不到的,有时候gradle插件搞得东西也扫不到。而扫jar包的话,又会丢失注释的信息,丢失文件的信息。可以说二者各有利弊吧,我偏向是扫jar包,毕竟我是个逆向工程师,不喜欢看源码。
话不多说,看下简单的用法吧,背景的话看其他人的文章去吧。
二、解析一系列class
首先,要我们要写一个待扫描的工程,我一般使用IntellijIdea,点击build,就会在看到了。
既然是8102年了,当然要用最好的构建工具gradle,我们创建一个gradle项目,引入soot的release包。
1 | maven { |
三、解析一个普通jar包
四、学习方法