-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDecodeManifestXml.py
131 lines (126 loc) · 5.1 KB
/
DecodeManifestXml.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#coding:utf-8
from androguard.core.bytecodes import apk
from androguard.util import read
from xml.dom.minidom import parseString
import zipfile
NS_ANDROID_URI = 'http://schemas.android.com/apk/res/android'
"""
parse AndroidManifest.xml
"""
def get_androidmanifest(apk_file):
z=zipfile.ZipFile(apk_file,"r")
for i in z.namelist():
if i=="AndroidManifest.xml":
ap=apk.AXMLPrinter(z.read(i))
xml=parseString(ap.get_buff())
return xml
"""
get exported activity,receiver,service
"""
def get_exported_activity(xml):
exported_activies=[]
find_tags = ["activity", "activity-alias"]
for tag in find_tags:
for ac in xml.getElementsByTagName(tag):
exported=str(ac.getAttributeNS(NS_ANDROID_URI,"exported"))
if exported=="true":
exported_activies.append(str(ac.getAttributeNS(NS_ANDROID_URI,"name")))
return exported_activies
def get_exported_receiver(xml):
exported_receivers=[]
for rv in xml.getElementsByTagName("receiver"):
exported=str(rv.getAttributeNS(NS_ANDROID_URI,"exported"))
if exported=="true":
exported_receivers.append(str(rv.getAttributeNS(NS_ANDROID_URI,"name")))
return exported_receivers
def get_exported_service(xml):
exported_services=[]
for sv in xml.getElementsByTagName("service"):
exported=str(sv.getAttributeNS(NS_ANDROID_URI,"exported"))
if exported=="true":
exported_services.append(str(sv.getAttributeNS(NS_ANDROID_URI,"name")))
return exported_services
"""
get intent-filter activity,receiver,service
"""
def get_intent_filter_activities(xml):
#xml = get_manifestxml(apk_path)
name_list=[]
action_list=[]
for item in xml.getElementsByTagName("activity"):
exported=str(item.getAttributeNS(NS_ANDROID_URI,"exported"))
if exported!="false":
for filter_item in item.getElementsByTagName("intent-filter"):
for action_item in filter_item.getElementsByTagName("action"):
action=str(action_item.getAttributeNS(NS_ANDROID_URI,"name"))
if action!="":
activity_name=str(item.getAttributeNS(NS_ANDROID_URI,"name"))
name_list.append(activity_name)
return list(set(name_list))
def get_intent_filter_receiver(xml):
name_list=[]
action_list=[]
for item in xml.getElementsByTagName("receiver"):
exported=str(item.getAttributeNS(NS_ANDROID_URI,"exported"))
if exported!="false":
for filter_item in item.getElementsByTagName("intent-filter"):
for action_item in filter_item.getElementsByTagName("action"):
action=str(action_item.getAttributeNS(NS_ANDROID_URI,"name"))
action_list.append(action)
if action!="":
activity_name=str(item.getAttributeNS(NS_ANDROID_URI,"name"))
name_list.append(activity_name)
return list(set(name_list))
def get_intent_filter_service(xml):
name_list=[]
action_list=[]
for item in xml.getElementsByTagName("service"):
exported=str(item.getAttributeNS(NS_ANDROID_URI,"exported"))
if exported!="false":
for filter_item in item.getElementsByTagName("intent-filter"):
for action_item in filter_item.getElementsByTagName("action"):
action=str(action_item.getAttributeNS(NS_ANDROID_URI,"name"))
action_list.append(action)
if action!="":
activity_name=str(item.getAttributeNS(NS_ANDROID_URI,"name"))
name_list.append(activity_name)
return list(set(name_list))
"""
coolect activity,receiver,service
"""
def get_activities(xml):
ac_ex=get_exported_activity(xml)
ac_fi=get_intent_filter_activities(xml)
return list(set(ac_ex+ac_fi))
def get_receivers(xml):
rec_ex=get_exported_receiver(xml)
rec_fi=get_intent_filter_receiver(xml)
return list(set(rec_ex+rec_fi))
def get_services(xml):
se_ex=get_exported_service(xml)
se_fi=get_intent_filter_service(xml)
return list(set(se_ex+se_fi))
"""
get Main Activity
"""
def get_main_activity(xml):
for ac in xml.getElementsByTagName("activity"):
for intent_filter in ac.getElementsByTagName("intent-filter"):
for action in intent_filter.getElementsByTagName("action"):
for category in intent_filter.getElementsByTagName("category"):
if str(action.getAttributeNS(NS_ANDROID_URI,"name"))=="android.intent.action.MAIN" and str(category.getAttributeNS(NS_ANDROID_URI,"name"))=="android.intent.category.LAUNCHER":
main_activity=str(ac.getAttributeNS(NS_ANDROID_URI,"name"))
return main_activity
"""
get package name
"""
def get_package_name(xml):
return xml.documentElement.getAttribute("package")
if __name__=="__main__":
apk_file = r"C:\Users\yixianglin\Desktop\ofo.apk"
xml=get_androidmanifest(apk_file)
print get_activities(xml)
print get_receivers(xml)
print get_services(xml)
print get_main_activity(xml)
print get_package_name(xml)