soot中存在的主要对象、soot的执行流

news2024/12/30 2:26:28

soot代码分析框架的基础知识(二)_soot 代码分析_小作坊中搬砖的博客-CSDN博客

Soot中的结构
本篇内容简单概括一下:soot中存在的主要对象、soot的执行流。

Soot中提供了几种对象,分别是:Scene、SootClass、SootMethod、SootField、Body。表示的意义如下所示:
Scene:Scene表示完整的分析环境,可以通过Scene.v()调用设置Options的API,也可以获取一些过程间分析的信息,如call graphs和points-to information(指向性分析)。如果分析的是Java工程,可以获取待分析的工程中存在哪些类。

SootClass:表示soot加载的待分析的类或者soot创建的类。如果分析的是Java源码,可以理解为SootClass对象代表Java源码中的某个类。

SootMethod:表示SootClass中的单个方法。
SootField:表示SootClass中的某个字段。
Body:表示方法主体,由Locals链(body.getLoclas())、Units链(body.getUnits())、Traps链(body.getTraps())组成。Locals链存储方法中的变量定义、Units链存储方法中的句子、Traps链存储方法中发生异常的语句。如下代码片段:

public int bar(){
	Foo r0;
	int i0,$i1;
	r0:=@this:Foo;//IdentityStmt
	i0:=@parameter():int;//IdentityStmt
	$i1=i0+21;//AssignStmt
	Return $i1;//ReturnStmt
}

Body.getLocals()得到的链存储的内容就是:Foor0;int i0,$i1;

Body.getUnits()得到的链存储的内容就是:r0:=…;…Return$i1;

Stmt与Unit
Stmt与Unit都表示方法中的一个句子。interface Unit继承于interface Stmt;同样AssignStmt、IdentityStmt、IfStmt、RetrunVoidStmt、NopStmt等也继承于interface Stmt。它们的不同在于:Unit注重于句子的构成、而AssignStmt这些则注重于是哪种句式。需要注意的是:AssignStmt表示赋值语句;而IdentityStmt表示将参数赋值给Local这样的语句。
下面是Unit对象提供的一些关键API:

public List<ValueBox> getUseBoxes();//返回Unit中使用的Value的引用
public List<ValueBox> getDefBoxes();//返回Unit中定义的Value的引用
public List<ValueBox> getUseAndDefBox();//返回Unit中定义并使用的Value的引用
public List geUnitBoxes();//获得被这个unit跳转到的UnitxBox的List
public List getBoxesPointingTothis();//获得该unit作为跳转对象时,所有跳转本身的UnitBox
public boolean fallsThrough();//如果接下来执行后面挨着的unit,则为true
public boolean branches();//如果执行时会跳转到其他别的unit,则返回true。如:IfStmt、GotoStmt
public void rediectJumpsToThisTo(Unit newLocation);//该方法把跳转到该unit重定向到newLocation

注:一般Value指的是Local(变量)、Expr(表达式)、Constant(常量)。

Soot的中间语言:
soot可以生成四种不同的中间语言:grimple、shimple、jimple、baf。其中一般采用的过程内/过程间分析都在在jimple中间语言上进行的。中间语言的特点灯具体信息可以查看A Survivor’s Guide to Java Program Analysis with Soot第8-15页内容。

Soot的执行流
Soot执行被分成几个阶段,这些阶段被称为packs。第一步是生成Jimple代码,然后将Jimple代码输入到其他packs中。这个步骤是通过解析class、jimple或java文件再通过Jimple Body(jb)传递它们的结果而完成的。
Soot根据分析问题是过程内分析还是过程间分析,会有不同的执行流。
过程内分析的执行流
过程内分析简单的说就是被分析的程序中不存在函数调用。

这些Pack的命名规则非常简单:第一个字母表示采用哪种中间语言,如:s表示shimple,j表示jimple,b表示baf,g表示grimp;第二个字母表示进行的pack的哪一步,如:b表示body creation,t表示transformation,o表示optimizations,a表示annotion。例如:jap表示jimple annotations pack。(注:命名规则在过程内分析、过程间分析都适用)

如上图所示:一般每种语言都有:transformation(转换)、optimizations(优化)、annotion(注释)三步。注意上图应该省略了jb(jimple bodycreation)这个阶段。

其中,在jtp和stp阶段是允许我们插入自定义的transformation(指的并不是添加jtp,而是jtp阶段中的某一步)。

PackManager.v().getPack("jtp").add(new Transform("jtp.myTransform", new BodyTransformer(){
 
	@Override
	protected void internalTransform(Body b, String phaseName,
			Map options) {
			// TODO Auto-generated method stub
			...
			
	}
}

上述代码就是在jtp pack中插入小步骤myTransform,但soot的执行流执行完自定义的myTransform后,将继续沿着执行流执行,自定义的小步骤就像soot的一个插件,并不影响其他的执行流顺序。

过程间分析的执行流
过程间分析简单的说就是存在函数调用。
在过程间分析中,soot的执行流会有所不同。在过程间分析时,需要指定soot运行在whole-program mode下。此时,soot会增加三个阶段:cg(call-graph generation)、wjtp(whole jimple transformation pack)、wjap(whole jimple annotation pack)。

 jb:指的是jimple body creation。Soot会对所有的method body执行jimple body creation,不可改变,与jimple生成有关。
其中,可以向此执行流中添加自定义的wjtp(此处指的并不是添加wjtp,而是在wjtp这个阶段中的添加某一步)。

PackManager.v().getPack("wjtp").add(
	new Transform("wjtp.myTransform", new SceneTransformer() {				
	@Override
	protected void internalTransform(String arg0,
		Map<String, String> arg1) {
		// TODO Auto-generated method stub
						
		...
	}
					
}));

上述代码就是在wjtp pack中插入一个小步骤myTransform。 但soot的执行流执行完自定义的myTransform后,将继续沿着执行流执行,自定义的小步骤就像soot的一个插件,并不影响其他的执行流顺序。


注意:上述的过程内soot执行流和过程间soot执行流都只是列出了pack,而在每个pack中仍然存在数个小步骤。

如果需要查看可用的pack信息,可以使用下述命令:
java –cp soot-trunk.jar soot.Main -pl

如果想查看某个pack的帮助信息,可以使用下述命令:
java –cp soot-trunk.jar soot.Main -ph PACK

下面则是使用第一条命令时,得到的可用的pack信息

jb                            Creates a JimpleBody for each method 
    jb.ls                        Local splitter: one local per DU-UD web 
    jb.a                         Aggregator: removes some unnecessary copies 
    jb.ule                       Unused local eliminator 
    jb.tr                        Assigns types to locals 
    jb.ulp                       Local packer: minimizes number of locals 
    jb.lns                       Local name standardizer 
    jb.cp                        Copy propagator 
    jb.dae                       Dead assignment eliminator 
    jb.cp-ule                    Post-copy propagation unused local eliminator 
    jb.lp                        Local packer: minimizes number of locals 
    jb.ne                        Nop eliminator 
    jb.uce                       Unreachable code eliminator 
    jb.tt                        Trap Tightener 
 jj                            Creates a JimpleBody for each method directly 
                               from source 
    jj.ls                        Local splitter: one local per DU-UD web 
    jj.a                         Aggregator: removes some unnecessary copies 
    jj.ule                       Unused local eliminator 
    jj.tr                        Assigns types to locals 
    jj.ulp                       Local packer: minimizes number of locals 
    jj.lns                       Local name standardizer 
    jj.cp                        Copy propagator 
    jj.dae                       Dead assignment eliminator 
    jj.cp-ule                    Post-copy propagation unused local eliminator 
    jj.lp                        Local packer: minimizes number of locals 
    jj.ne                        Nop eliminator 
    jj.uce                       Unreachable code eliminator 
 wjpp                          Whole Jimple Pre-processing Pack 
 wspp                          Whole Shimple Pre-processing Pack 
 cg                            Call graph constructor 
    cg.cha                       Builds call graph using Class Hierarchy 
                                 Analysis 
    cg.spark                     Spark points-to analysis framework 
    cg.paddle                    Paddle points-to analysis framework 
 wstp                          Whole-shimple transformation pack 
 wsop                          Whole-shimple optimization pack 
 wjtp                          Whole-jimple transformation pack 
    wjtp.mhp                     Determines what statements may be run 
                                 concurrently 
    wjtp.tn                      Finds critical sections, allocates locks 
    wjtp.rdc                     Rename duplicated classes when the file 
                                 system is not case sensitive 
 wjop                          Whole-jimple optimization pack 
    wjop.smb                     Static method binder: Devirtualizes 
                                 monomorphic calls 
    wjop.si                      Static inliner: inlines monomorphic calls 
 wjap                          Whole-jimple annotation pack: adds 
                               interprocedural tags 
    wjap.ra                      Rectangular array finder 
    wjap.umt                     Tags all unreachable methods 
    wjap.uft                     Tags all unreachable fields 
    wjap.tqt                     Tags all qualifiers that could be tighter 
    wjap.cgg                     Creates graphical call graph. 
    wjap.purity                  Emit purity attributes 
 shimple                       Sets parameters for Shimple SSA form 
 stp                           Shimple transformation pack 
 sop                           Shimple optimization pack 
    sop.cpf                      Shimple constant propagator and folder 
 jtp                           Jimple transformation pack: intraprocedural 
                               analyses added to Soot 
 jop                           Jimple optimization pack (intraprocedural) 
    jop.cse                      Common subexpression eliminator 
    jop.bcm                      Busy code motion: unaggressive partial 
                                 redundancy elimination 
    jop.lcm                      Lazy code motion: aggressive partial 
                                 redundancy elimination 
    jop.cp                       Copy propagator 
    jop.cpf                      Constant propagator and folder 
    jop.cbf                      Conditional branch folder 
    jop.dae                      Dead assignment eliminator 
    jop.nce                      Null Check Eliminator 
    jop.uce1                     Unreachable code eliminator, pass 1 
    jop.ubf1                     Unconditional branch folder, pass 1 
    jop.uce2                     Unreachable code eliminator, pass 2 
    jop.ubf2                     Unconditional branch folder, pass 2 
    jop.ule                      Unused local eliminator 
 jap                           Jimple annotation pack: adds intraprocedural 
                               tags 
    jap.npc                      Null pointer checker 
    jap.npcolorer                Null pointer colourer: tags references for 
                                 eclipse 
    jap.abc                      Array bound checker 
    jap.profiling                Instruments null pointer and array checks 
    jap.sea                      Side effect tagger 
    jap.fieldrw                  Field read/write tagger 
    jap.cgtagger                 Call graph tagger 
    jap.parity                   Parity tagger 
    jap.pat                      Colour-codes method parameters that may be 
                                 aliased 
    jap.lvtagger                 Creates color tags for live variables 
    jap.rdtagger                 Creates link tags for reaching defs 
    jap.che                      Indicates whether cast checks can be 
                                 eliminated 
    jap.umt                      Inserts assertions into unreachable methods 
    jap.lit                      Tags loop invariants 
    jap.aet                      Tags statements with sets of available 
                                 expressions 
    jap.dmt                      Tags dominators of statement 
 gb                            Creates a GrimpBody for each method 
    gb.a1                        Aggregator: removes some copies, pre-folding 
    gb.cf                        Constructor folder 
    gb.a2                        Aggregator: removes some copies, post-folding 
    gb.ule                       Unused local eliminator 
 gop                           Grimp optimization pack 
 bb                            Creates Baf bodies 
    bb.lso                       Load store optimizer 
    bb.pho                       Peephole optimizer 
    bb.ule                       Unused local eliminator 
    bb.lp                        Local packer: minimizes number of locals 
 bop                           Baf optimization pack 
 tag                           Tag aggregator: turns tags into attributes 
    tag.ln                       Line number aggregator 
    tag.an                       Array bounds and null pointer check 
                                 aggregator 
    tag.dep                      Dependence aggregator 
    tag.fieldrw                  Field read/write aggregator 
 db                            Dummy phase to store options for Dava 
    db.transformations           The Dava back-end with all its 
                                 transformations 
    db.renamer                   Apply heuristics based naming of local 
                                 variables 
    db.deobfuscate               Apply de-obfuscation analyses 
    db.force-recompile           Try to get recompilable code. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Windows WSL 上安装 k3s (Kubernetes / k8s)

WSL&#xff0c;全称Windows Subsystem for Linux&#xff0c;是微软在Windows 10操作系统上开发的一种运行Linux应用程序的子系统。它允许用户在Windows系统中直接运行Linux命令行工具和应用程序&#xff0c;无需双重引导或虚拟机。 相比虚机&#xff0c;WSL提供了更加高效、…

能量密度的必要性:城市比乡村具有更高的能量密度

文章目录 引言I 人口密度1.1 人口密度太低对于经济的发展的不利因素1.2 足够的人口密度带来的好处1.3 乌鲁克城II 农耕文明和商业文明2.1 农耕文明2.2 商业文明III 有效掌握动力的文明处于优势3.1 苏美尔人- 轮子&风能的利用3.2 英国人- 以蒸汽机为代表的工业革命引言 文明…

LeetCode——根据二叉树创建字符串与二叉树的最近公共祖先

606. 根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&#xff0c;转化后需要省略所有不影响字符串与原始二…

C#医院体检管理系统源码,PEIS源码,C/S结构 oracle数据库

PEIS体检管理系统源码&#xff0c;医院体检系统源码PEIS源码&#xff0c;商业级源码 本套PEIS医院体检管理系统源码采用C/S结构&#xff0c;前台开发工具为Vs2012&#xff0c;后台数据库采用oracle大型数据库。 核心功能有&#xff1a;体检档案的录入、体检报告的输出、体检档…

震惊!ChatGPT可以用来炒股?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 ChatGPT让我们见识了大模型技术的强大潜能&#xff0c;激发了市场的热情。 然而&#xff0c;对于大多数人而言&#xff0c;最关心的问题很可能是——如何用ChatGPT赚钱。谈到赚钱&#xff0c;最直接的就是金融&#xff0c;其…

word插入页码

word如何设置域http://zhidao.baidu.com/question/382747671/answer/3053706353 1、首先&#xff0c;我们打开我们电脑上面的word&#xff0c;然后我们点击插入。 2、然后我们点击工具栏中的文档部件&#xff0c;弹出的界面&#xff0c;我们点击域。 3、弹出的界面&#xff0c…

iOS设备和蓝牙模块连接基础知识

iOS设备和蓝牙模块连接基础知识 一&#xff1a;iOS连接外设的几种方式 如图下面几种方式&#xff1a; CoreBluetooth和ExternalAccessory&#xff0c;两个框架&#xff0c;基本上是蓝牙设备与iOS设备连接的方式 有图可知&#xff0c;EAP要MFi认证&#xff0c;要求设备的设计理…

pywebview搭建、运行、打包白屏

1、禁用微软商店引流 点击开始菜单输入管理应用执行别名搜索系统设置&#xff0c;将该列表划到最底部&#xff0c;找到python.exe和python3.exe&#xff0c;将其设置为关闭状态 这是微软搞的狗皮膏药&#xff0c;强制型环境变量 2、配置Python环境 1.考虑版本管理&#xff…

Docker原理与镜像管理

目录 一、虚拟化概述 虚拟架构 1、寄居架构 2、原生架构 两者的区别 虚拟化产品 虚拟化类型 二、Docker概述 Logo含义 Docker的设计宗旨 Docker与虚拟机的区别 Docker核心概念 镜像 容器 仓库 Docker Engine&#xff08;引擎&#xff09; Docker运行的原理 d…

组合设计模式解读

目录 问题引进 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 基本介绍 组合模式原理类图 对原理结构图的说明-即(组合模式的角色及职责) 应用实例 组合模式的注意事项和细节 问题引进 看一个学校院系展示需求 编写程序展示一个学校院系结构&#xff1a;需…

浏览器加 buff 指南-【超实用的浏览器工具】

今天这篇博客&#xff0c;说一说浏览器以及加 buff &#xff0c;先说浏览器&#xff1a;地址&#xff1a;https://www.xduoyu.com/&#xff0c;里面的工具让你的浏览器变装为技术人员的专属利器。这里还要表扬一下&#xff0c;官网的宣传页做的越来越专业了&#xff0c;还打造了…

好的台灯和差的台灯的区别?盘点高品质的护眼台灯品牌

简单来说&#xff0c;好的台灯使用20分钟不会眼疲劳&#xff0c;可差的台灯使用10分钟就眼干涩、不舒服了。 这些年的LED灯具都做得非常成熟&#xff0c;台灯也是LED灯具&#xff0c;在频闪、蓝光、显色指数、均匀度等各种指标都将眼睛保护的很好&#xff0c;采用特殊的光学技…

Thinkphp+vued大学生租房管理系统mysql校园房屋租赁网站系统

学生租房管理系统是计算机技术和网络迅速发展的一个大学生租房信息应用解决方案。大学生租房平台将Internet网络技术与现代管理观念相融合&#xff0c;针对信息技术的特点对大学生租房平台进行规划和重构&#xff0c;对大学生租房信息流进行优化及合理配置&#xff0c;生成动态…

VNC 远程重装 Centos 系统

一、环境 1、环境准备 两台设备&#xff0c;一台为重装 Centos 机器( IP&#xff1a;192.168.206.30&#xff0c;hostname&#xff1a;centos1) &#xff0c;确保 centos1本身开启了图形化界面GNOME&#xff0c;不是最小化安装的Linux 。一台为重装时&#xff0c;从获取安装程…

Django REST Framework(DRF)框架之视图集ViewSet与路由Router

DRF框架之视图集ViewSet 视图集ViewSet与路由Router视图集ViewSet路由Router视图集和路由的基本使用 视图集ViewSet的使用ViewSetGenericViewSetModelViewSetReadOnlyModelViewSet视图集添加其他方法视图集对象action属性 路由Router的使用SimpleRouterDefaultRouter基本使用自…

DELL R730 主板坏了,Raid5硬盘移到同型号服务器备忘

1、开机时按ctrlr进入raid设置页面 2、进入raid设置页面后可以看到没有找到虚拟磁盘&#xff0c;我们按F2打开操作菜单 3、选择菜单Foreign Config -> Import &#xff0c;选择Yes开始导入硬盘中的raid配置 4、导入成功的话就可以看到虚拟盘了 5、按Esc退出 6、按ctrlaltd…

为什么网络安全缺口很大,招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…

迅为RK3568核心板车载中控AVM一体机应用

RK3568M车载中控&AVM一体机方案搭载4核A55 CPU&#xff0c;G52-2EE GPU架构&#xff0c;1Tops算力NPU&#xff0c;支持1路4K 60fps或8路1080P 30fps的多格式解码和高达1080P 100fps的H.265编码&#xff0c;具备双千兆GMAC、三路CAN以及USB3.0/SATA3.0/PCIE3.0等丰富接口&am…

Windows安装mysql详细步骤

目录 1 【确认本地是否安装mysql】 2【下载mysql安装包】 3【添加配置文件并安装mysql】 4【修改mysql密码】 5【配置环境变量】 windows 只安装mysql服务的操作 1 【确认本地是否安装mysql】 &#xff08;1&#xff09;按【winr】快捷键打开运行&#xff1b; &#xff…

java基于蚁群算法路由选择可视化动态模拟

蚁群算法是一种新生的算法&#xff0c;具有很强的通用性。从提出到现在&#xff0c;仅短短10余年的时间&#xff0c;但是在离散型组合优化问题中。表现很突出&#xff0c;所以一起人们的关注。目前蚁群算法的研究者主要集中在比利时、意大利、德国等国家&#xff0c;美国和日本…