深度剖析GadgetInspector执行逻辑(下)

admin 2023年3月12日14:43:04深度剖析GadgetInspector执行逻辑(下)已关闭评论17 views字数 3114阅读10分22秒阅读模式

前言

接着前面分析gadgetInspector工具

GadgetInspector

gadgetinspector.PassthroughDiscovery类

和上面类似的格式,存在有discover / save这两个主要的方法

MethodCallDiscoveryClassVisitor类

深度剖析GadgetInspector执行逻辑(下)

定义了一个属性name,重写了对应的处理方法

  1. visit方法:

记录下类该的类名
2.

深度剖析GadgetInspector执行逻辑(下)

MethodCallDiscoveryMethodVisitor类

深度剖析GadgetInspector执行逻辑(下)

这个类主要使用来进行方法之间的调用关系进行记录

在其构造方法中,创建了一个MethodReference.Handle类对象和其集合的映射,并将其添加进入了methodCalls属性,这个属性代表着key对应的方法中调用了value中存在的方法

而在其visitMethodInsn方法中

将会在这里将方法对应的类名 / 方法名 / 方法描述添加进入methodCalls这个属性中

PassthroughDataflowClassVisitor类

这个类主要通过继承了ClassVisitor来对在进行数据流的分析过程中,在读取类资源的时候根据不同的行为做出不同的操作

在其visit方法中

深度剖析GadgetInspector执行逻辑(下)

主要记录了类资源名,且验证了是否正确,错误将会抛出异常

深度剖析GadgetInspector执行逻辑(下)

在其visitMethod方法中,在读取类的过程中如果遭遇了方法的调用

discoverMethodCalls

深度剖析GadgetInspector执行逻辑(下)

该方法的逻辑如下

  1. 遍历指定的所有class资源,使用ClassReader类进行对输入流的封装
  2. 调用ClassReader#accept方法,根据MethodCallDiscoveryClassVisitor类中实现的visit / visitMethod / visitEnd等方法执行不同的逻辑
  3. 之后将这个类名和对应的类资源添加进入classResourcesByName
    4.

discover

深度剖析GadgetInspector执行逻辑(下)

  1. 首先调用了DataLoader.loadMethods方法加载我们已经获取的方法
  2. 使用类似的方法加载已经获取了的类
  3. 之后就是继承关系图的加载
  4. 调用discoverMethodCalls寻找方法的调用
  5. 通过调用topologicallySortMethodCalls方法来对其进行拓扑排序的方法进行处理

    深度剖析GadgetInspector执行逻辑(下)

  6. 在这个方法中,首先是将方法的调用methodCalls中的调用关系拷贝了一份到outgoingReferences这个Map对象中
    之后通过调用dfsTsort方法进行排序操作, 前面我们得到的methodCalls这个对象,在拓扑排序算法中,可以将每个方法看作一个一个的点,而前面,仅仅可以算作是一条一条的单独的边,只是一种调用关系,并没有连成线,我们接着看看作者如何连接在一起的

    深度剖析GadgetInspector执行逻辑(下)

这里使用stack来记录caller的结点对象,使用visitedNodes来记录已经被排序的结点对象
之后递归调用dfsTsort进行排序,一直到没有调用关系为止,之后就是进行出栈,记录已访问结点,添加排序结点等操作
最后得到的一个List列表是一串逆序的调用表,也即是A->B在其中存储规则为B在小端,A在大端,这种形式
7. 最后通过调用calculatePassthroughDataflow方法数据流的传
8.

深度剖析GadgetInspector执行逻辑(下)

在这个方法中,通过获取排序后的sortedMethods中的方法元素获取对应的类资源,在读取这些类的同时,创建了一个PassthroughDataflowClassVisitor类对象,就是进行污点分析

gadgetinspector.data.MethodReference类

这个类主要是方法的引用

深度剖析GadgetInspector执行逻辑(下)

这几个属性分别是该方法对应类的句柄 / 方法名 / 方法的描述 / 是否是静态

其中classReference属性是和该方法对应的类的联系纽扣

Factory类

同样在这个方法中存在有实现了DataFactory<MethodReference>接口的类Factory这个内部类

深度剖析GadgetInspector执行逻辑(下)

其中serialize方法的执行逻辑为

类名 / 方法名 / 方法描述 / 是否是静态

同样之后进行序列化之后存放进入文件中

还实现了parse方法进行反序列化

深度剖析GadgetInspector执行逻辑(下)

重新生成了一个MethodReference对象进行返回

gadgetinspector.data.DataLoader类

这个类主要是用来加载 / 保存序列化数据,加载类和方法

saveData

其中的saveData方法

深度剖析GadgetInspector执行逻辑(下)

  1. 首先创建一个文件输出流
  2. 之后对数据进行对应的Factory类进行序列化
  3. 再然后将序列化生成的String数组进行\t进行分割
  4. 写入文件

loadData

深度剖析GadgetInspector执行逻辑(下)

  1. 从保存数据的文件中获取数据
  2. 按照saveData的逆向方法调用parse方法来进行数据的复原

loadMethods

深度剖析GadgetInspector执行逻辑(下)

主要流程如下

  1. 通过调用loadData方法根据MethodReference.Factory类中实现的反序列化逻辑从保存的methods.dat文件中获取MethodReference对象
  2. 将得到的MethodReference对象添加进methodMap中进行存放,并返回

gadgetinspector.data.InheritanceDeriver类

这个类中存在有三个方法derive / getAllParents / getAllMethodImplementations

分别是用来绘制继承关系图 /

derive

深度剖析GadgetInspector执行逻辑(下)

  1. 主要是创建了一个Key为ClassRefence对象,Value为ClassReference.Handle句柄的集合,也即是对应类的继承或实现的类和接口
  2. 通过遍历前面获取的所有的ClassReference类对象
  3. 调用了getAllParents方法来从classMap中获取对应的ClassReference对象的所有父类和所有实现的接口
  4. 将获取到的继承关系记录在implicitInheritance这个Map对象中
  5. 最后将得到的隐式继承关系传入InheritanceMap构造方法中进行继承关系图的建立

getAllParents

深度剖析GadgetInspector执行逻辑(下)

这个方法主要是用来进行所有父类获取接口的获取

  1. 首先创建了一个局部变量parents,是一个Set集合,作为临时用来存放classReference对象的父类和实现的接口
  2. 如果计算的ClassReference类对象存在有父类,将其添加进入parents集合中
  3. 如果计算的ClassReference类对象存在有接口,将所有接口添加进入parents集合中
  4. 遍历获取的父类和接口,判断是否存在于我们的classpath下,如果不存在,将会跳过该次循环
  5. 如果存在,将会将其依次添加进入allParents这个集合中,并且通过递归的方式获取其父类或接口的继承关系,将所有的继承全都记录在allParents这个集合中

gadgetinspector.data.InheritanceMap类

这个类主要是用来进行继承关系图的建立和保存用的

首先来看看其构造方法和属性

深度剖析GadgetInspector执行逻辑(下)

这里定义了两个属性inheritanceMap / subClassMap分别是用来记录向上的父关系和向下的子关系

而在其构造方法中,主要是对传入的父关系进行处理之后生成了子关系的继承图,也是通过遍历所有的父类,找到在classpath下其所有的子类

InheritanceMapFactory类

这个内部类同样是实现了DataFactory接口

重写了serialize方法,在保存继承关系图的时候进行对应的序列化方式

深度剖析GadgetInspector执行逻辑(下)

  1. 初始化了一个对应大小的数组对象
  2. 依次将类名和其所有的父类名添加进入这个数组对象

同样存在对应的parse方法

深度剖析GadgetInspector执行逻辑(下)

save

深度剖析GadgetInspector执行逻辑(下)

这个方法主要是将获取的继承关系图通过调用DataLoader.saveData方法保存在inheritanceMap.dat文件中去

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月12日14:43:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   深度剖析GadgetInspector执行逻辑(下)http://cn-sec.com/archives/1599563.html