您的位置:首页 > 理论基础 > 数据结构算法

Android中所有API和对应权限的数据结构构建

2016-08-23 20:18 417 查看

写在前面的话

这是一篇有毒博客,我觉得,读者慎入.

我想说,那个最底下的广告怎么去,辣眼睛…… T -T

PScout玩一下

PScout 是一个开源的项目,这个项目的主要工作就是提取出Android当中的API(document API 和undocument API)

和对应的权限的关系.当然这个工作还做了content provider 和intent 调用时候的权限申请的映射关系.这个项目是基于soot完成的.

再次强调一下,PScout就是找出APIs和权限(permission)之间的对应关系

现在可供分析的版本到Android 系统5.1.1

之前分析的是4.1.1

由于4.1.1之前的API和权限Permission之间的对应关系如下图所示:

Permission:android.permission.CHANGE_WIFI_STATE
472 Callers:
<com.android.server.WifiService: void enforceChangePermission()> (20)
<com.android.server.WifiService: android.os.Messenger getWifiServiceMessenger()> (2)
<com.android.server.WifiService: android.os.Messenger getWifiStateMachineMessenger()> (2)
<com.android.server.WifiService: boolean saveConfiguration()> (2)
<com.android.server.WifiService: boolean setWifiEnabled(boolean)> (3)
<com.android.server.WifiService: int addOrUpdateNetwork(android.net.wifi.WifiConfiguration)> (2)
<com.android.server.WifiService: void addToBlacklist(java.lang.String)> (2)
<com.android.server.WifiService: void clearBlacklist()> (2)
<com.android.server.WifiService: void disconnect()> (2)
<com.android.server.WifiService: void reassociate()> (2)
<com.android.server.WifiService: void reconnect()> (2)

Permission:android.permission.ACCESS_WIFI_STATE
473 Callers:
<com.android.server.WifiService: void enforceAccessPermission()> (13)
<com.android.server.WifiService: android.net.DhcpInfo getDhcpInfo()> (2)
<com.android.server.WifiService: android.net.wifi.WifiConfiguration getWifiApConfiguration()> (2)
<com.android.server.WifiService: android.net.wifi.WifiInfo getConnectionInfo()> (2)
<com.android.server.WifiService: android.os.Messenger getWifiServiceMessenger()> (2)
<com.android.server.WifiService: android.os.Messenger getWifiStateMachineMessenger()> (2)
<com.android.server.WifiService: boolean isMulticastEnabled()> (2)
<com.android.server.WifiService: boolean pingSupplicant()> (2)
<com.android.server.WifiService: int getFrequencyBand()> (2)


由于后面的括号里面的数字会影响我们的分析,和文本的提取我们需要对它们处理一下.把它先弄弄清爽.

#!/usr/bin/env python
# coding=utf-8

#需要处理的文本
path = "~/Psout/jellybean_allmappings"

#保存处理后的文本
dest_path = "~/Psout/allmappings.txt"

f=open(path)

outf=open(dest_path,"w+")

for line in f.readlines():
if line.startswith("<") or line.startswith("("):
messageList = line.split()
del messageList[len(messageList)-1]
messageInfo = " ".join(messageList)
outf.write(messageInfo + "\n")
else:
outf.write(line)

f.close()
outf.close()


处理好之后我们就可以构建一个字典数据结构用来保存我们权限和API和我们的permission之间的相互关系,我们的数据结构如下所示:

{permission1:[API1,API2...],permission2:[API1,API2,...]}


就是这个样子的,至于有啥用,哈哈哈,自己看吧.[我是一个猥琐的美少女,哈哈哈]

哦哦对了,运行这个文件你需要去PScout的网站上把它的那个allapimapping这个对应API和权限的关系的文本下载下来,然后解析出来.

后面出的版本都已经更新成CSV的格式了,所以很好解析.

下面就是构建我们的数据结构了:

#解析过的allmappings文件
dest_path = "/home/chicho/Psout/allmappings.txt"

#***************************************
#  we distill the relationship
#  between the api and permission
#***************************************

#构建字典数据结构,创建权限和API之间的对应关系,因为是权限对应多个api
apiPerMappingDict = {}  # {'permission1':[m1,m2,m3]}

fmap = open(dest_path) # allmappings.txt

lineList = fmap.readlines()

lineList.reverse() # 重点,技术都在这里了,将读取出的每一行逆序排列

methodList = [] # 存储API的list

for line in lineList:
if line.startswith("(") or line.startswith("<"):
methodList.append(line)
continue
if line.startswith("Permission"):
permission = line.split(":")[1].split("\n")[0]
countMethod = len(methodList)
apiPerMappingDict[permission]=methodList
methodList = []


写在后面的话

哈哈哈,是的,我最近失恋了,只是爱上了不值得爱的人,心情有点遭,但是感觉人生有开始开挂了.

有句话想跟所有的妹子说:

一切不以恋爱为目的的撩妹,他么全部都是犯!罪!

见到这种男生,你要有心思,可以慢慢 玩! 死! 他!

但是千万 不!要!犯!贱!

我写的啥.哈哈哈,我也不知道,这是一篇有毒的博客.大家加油吧,我回去变美,变聪明,变智慧,变的更加性感去了.

最后诅咒所有玩弄女性的男生,你们都不怕得病么?好勇敢哟~~~

红红火火恍恍惚惚嘻嘻哈哈吼吼嘿嘿….

滚去写论文咯,happy~

天道好轮回,苍天绕过谁,mua
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: