connglli / ELEGANT

ELEGANT - a tool to Effectively LocatE fraGmentAtion-iNduced compaTibility issues.
MIT License
3 stars 0 forks source link

weekly report: 2017.08.23-2017.08.29 #4

Closed connglli closed 6 years ago

connglli commented 6 years ago

周报

2017.08.23 ~ 2017.08.29

工作概述

同上周计划所述,本周开始了开发工作,首先明确定位和开发安排:

框架的搭建

fic-finder 初步欲实现为一个 CLI 工具,按照如下的方式运行:

java -cp ficfinder.jar --models=models.json --apk=xxx.apk 

目前初步打算先实现两个配置项:

--models 使用到的 acpairs 配置文件
--apk    欲分析的 apk 文件位置

其中,配置文件声明方式待会会有详述。

fic-finder 的初步架构如下图所示:

         input
           |
           v
+----------------------+
|        Configs       |     issue handles
+----------------------+     -------------
           | set               |   |   |
           v                   v   v   v
+----------------------+   +---------------+
|    Env: acpairs..    |   | Issue Tracker |
+----------------------+   +---------------+
           | provide               ^
           v                       |
+----------------------+    emit   |
|         Core         | ----------+
+----------------------+

首先进行 配置Configs 的读取并进行 全局Env 的设定,然后开始运行 核心算法Core,运行过程中,Core 从 Env 获取所需的数据,当发现问题时会 emit 到 Issue Tracker 利用挂载在其上的 Issue Handles 作统一的处理,欲实现 Layer、Filter、Pub/Sub 的模式。但目前功能尚少,可能还不是很清晰。(这样的实现还可以添加 Hooks 来形成框架 framework,而不仅仅是一个库 library)。

配置文件的读写

同最早的考虑对应,我们利用 json 这种简便易读开销小的格式来对 ApiContext Model 进行配置,使用 json 考虑到如下几个方面:

  1. 基于开闭原则
  2. 利用配置文件容易实现多应用交互(爬虫爬文档我觉得还是必要的,因此需要一个使两者进行交互而又不耦合的工具,小东西用不到消息队列,就用配置文件)
  3. 考虑到后期要进行 web 端,json 小巧开销小。

配置文件格式形如下:

[
  {
    "api": {
      "@type": "method",
      "pkg": "android.media",
      "iface": "AudioMedia",
      "method": "setRouting",
      "ret": {
        "pkg": "",
        "iface": "void"
      },
      "paramList": [
        {
          "pkg": "",
          "iface": "int"
        },
        {
          "pkg": "",
          "iface": "int"
        },
        {
          "pkg": "",
          "iface": "int"
        }
      ]
    },
    "context": {
      "min_api_level": 1,
      "max_api_level": 3
    }
  },
  {
    "api": {
      "@type": "field",
      "pkg": "android.content",
      "iface": "Intent",
      "type": {
        "pkg": "java.lang",
        "iface": "String"
      },
      "field": "EXTRA_REMOTE_INTENT_TOKEN"
    },
    "context": {
      "min_api_level": 5
    }
  },
  {
    "api": {
      "@type": "iface",
      "pkg": "android.provider.SyncStateContract",
      "iface": "Constants"
    },
    "context": {
      "min_api_level": 5
    }
  }
]

正如上述所示,配置文件由一个 数组 构成,数组内对每一个 Model 都进行了语义化的描述,每个 Model 由两部分即 apicontext 组成。

api

对于任意一个 api,都必须含有 @typepkg 字段,其中 @type描述了该 api 的类型,pkg描述了该 api 所处的包。

目前根据 @type 主要有 3 种不同的 api :

context

目前 context 主要有以下几个字段组成,任何一个都是可选的:

系统运行概述

目前的工作进行到 开发安排 的第二个阶段结束,系统可以正确读取配置文件并对全局进行设置,同时获取 CallGraph。系统运行流程如下:

系统的入口位于 Application,进入系统,首先由Configs(单例)进行配置选项的分析与全局环境的设置和初始化,目前包括:

  1. models 选项对应的 json 文件进行读取并进行 Env 的设置,详情于 Configs.parseModels
  2. apk 选项对应的 apk 文件进行假读取和 App 的创建与设置,详情于 Configs.parseApk

配置分析结束后,将进入CoreCore的运行预计将有 3 各阶段(也可能为了可扩展性和可框架而进行更多阶段的设置从而能够提供更多的 Hooks ):

  1. setUp:对 apk 文件进行真正的读取,并获取 CallGraph。
  2. core:执行核心算法,在执行过程中将与 EnvIssue Tracker 进行交互(后者目前还未实现,将实现成 Pub/Sub 模式,从而方便对 Issue 进行监听并实现插件式分析)。
  3. tearDown:结束后的收尾工作。

项目地址:fic-finder

暂放于 Github,牵扯到 core 实现时将进行搬迁。由于涉及 android 的库,比较大,所以没上传与 android 相关的库,可能直接 clone 下来没法跑,如果要跑的话,在这里或者这里多下载几个(最好全下,android-16 对于目前来说是必须的)放到 assets/android-platforms 下。