Closed connglli closed 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 考虑到如下几个方面:
配置文件格式形如下:
[ { "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 由两部分即 api 和 context 组成。
api
context
对于任意一个 api,都必须含有 @type 和 pkg 字段,其中 @type描述了该 api 的类型,pkg描述了该 api 所处的包。
@type
pkg
目前根据 @type 主要有 3 种不同的 api :
iface
Constants
B
A
A$B
Set<T>
Set
method
ret
paramList
T
java.lang.Object
Set<String>
int...
int[]
field
type
目前 context 主要有以下几个字段组成,任何一个都是可选的:
min_api_level
added in API level xxx
1
max_api_level
deprecated at API level xxx
27
min_system_level
max_system_level
bad_devices
[]
important
message
目前的工作进行到 开发安排 的第二个阶段结束,系统可以正确读取配置文件并对全局进行设置,同时获取 CallGraph。系统运行流程如下:
系统的入口位于 Application,进入系统,首先由Configs(单例)进行配置选项的分析与全局环境的设置和初始化,目前包括:
Application
Configs
models
Env
Configs.parseModels
apk
Configs.parseApk
配置分析结束后,将进入Core,Core的运行预计将有 3 各阶段(也可能为了可扩展性和可框架而进行更多阶段的设置从而能够提供更多的 Hooks ):
Core
Issue Tracker
项目地址:fic-finder 暂放于 Github,牵扯到 core 实现时将进行搬迁。由于涉及 android 的库,比较大,所以没上传与 android 相关的库,可能直接 clone 下来没法跑,如果要跑的话,在这里或者这里多下载几个(最好全下,android-16 对于目前来说是必须的)放到 assets/android-platforms 下。
项目地址:fic-finder
暂放于 Github,牵扯到 core 实现时将进行搬迁。由于涉及 android 的库,比较大,所以没上传与 android 相关的库,可能直接 clone 下来没法跑,如果要跑的话,在这里或者这里多下载几个(最好全下,android-16 对于目前来说是必须的)放到 assets/android-platforms 下。
周报
工作概述
同上周计划所述,本周开始了开发工作,首先明确定位和开发安排:
框架的搭建
fic-finder 初步欲实现为一个 CLI 工具,按照如下的方式运行:
目前初步打算先实现两个配置项:
其中,配置文件声明方式待会会有详述。
fic-finder 的初步架构如下图所示:
首先进行 配置Configs 的读取并进行 全局Env 的设定,然后开始运行 核心算法Core,运行过程中,Core 从 Env 获取所需的数据,当发现问题时会 emit 到 Issue Tracker 利用挂载在其上的 Issue Handles 作统一的处理,欲实现 Layer、Filter、Pub/Sub 的模式。但目前功能尚少,可能还不是很清晰。(这样的实现还可以添加 Hooks 来形成框架 framework,而不仅仅是一个库 library)。
配置文件的读写
同最早的考虑对应,我们利用 json 这种简便易读开销小的格式来对 ApiContext Model 进行配置,使用 json 考虑到如下几个方面:
配置文件格式形如下:
正如上述所示,配置文件由一个 数组 构成,数组内对每一个 Model 都进行了语义化的描述,每个 Model 由两部分即
api
和context
组成。api
对于任意一个 api,都必须含有
@type
和pkg
字段,其中@type
描述了该 api 的类型,pkg
描述了该 api 所处的包。目前根据
@type
主要有 3 种不同的 api :iface
,这种类型的 api 针对接口与类,必须含有iface
字段,它表示类名,如Constants
;如果是B
是A
的内部类,请用A$B
;对于泛型类,请使用类型擦除把泛型去掉,如Set<T>
将擦除为Set
。method
,这种类型的 api 针对方法,必须含有method
、ret
和paramList
字段。其中,method
表示该方法的方法名,ret
表示返回值类型,paramList
表示该方法的参数类型,他们同pkg
一起构成了函数的签名;对于泛型参数/泛型返回值,请擦除掉,如T
将擦除为java.lang.Object
,Set<String>
将擦除为Set
;对于不定参数,请使用数组表示,如int...
将表示为int[]
。field
,这种类型的 api 针对属性,必须含有field
和type
字段。其中,field
表示该属性的名称,type
表示该属性的类型,他们同pkg
一起构成了属性的签名。context
目前 context 主要有以下几个字段组成,任何一个都是可选的:
min_api_level
:该 api 支持的最小 API level(并非严格是 android doc 里指示的added in API level xxx
),默认为1
max_api_level
:该 api 支持的最大 API level(并非严格是 android doc 里指示的deprecated at API level xxx
),默认为27
min_system_level
:该 api 支持的最小系统版本号,默认为1
max_system_level
:该 api 支持的最大系统版本号,默认为 `27bad_devices
:该 api 可能会出现问题的设备标识,默认为[]
important
: 指示比较重要的指标,当该指标被检测到后将跳过剪枝阶段,直接进行 issue 报告。值为min_api_level
/max_api_level
/min_system_level
/max_system_level
/bad_devices
中的一个。message
: 想要在技术报告中提示开发者的消息。系统运行概述
目前的工作进行到 开发安排 的第二个阶段结束,系统可以正确读取配置文件并对全局进行设置,同时获取 CallGraph。系统运行流程如下:
系统的入口位于
Application
,进入系统,首先由Configs
(单例)进行配置选项的分析与全局环境的设置和初始化,目前包括:models
选项对应的 json 文件进行读取并进行Env
的设置,详情于Configs.parseModels
。apk
选项对应的 apk 文件进行假读取和 App 的创建与设置,详情于Configs.parseApk
。配置分析结束后,将进入
Core
,Core
的运行预计将有 3 各阶段(也可能为了可扩展性和可框架而进行更多阶段的设置从而能够提供更多的 Hooks ):Env
和Issue Tracker
进行交互(后者目前还未实现,将实现成 Pub/Sub 模式,从而方便对 Issue 进行监听并实现插件式分析)。