-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathwideXtractor.py
executable file
·127 lines (105 loc) · 3.47 KB
/
wideXtractor.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
#! /usr/bin/python3
import frida
import time
import sys
import os
from pathlib import Path
# Global var for module script
modules = []
def usage():
print(sys.argv[0] + " [legacy]\n\nlegacy -> Android before version 7")
def get_mediadrm_name():
numberOfArgs = len(sys.argv)
if numberOfArgs > 2:
usage()
exit(-1)
elif numberOfArgs == 2:
mode = sys.argv[1]
else:
mode = "new"
if mode != 'legacy' and mode != 'new':
usage()
exit(-2)
if mode == 'legacy':
mediadrm = 'mediaserver'
else:
mediadrm = 'mediadrmserver'
return mediadrm
def write2file(header, data, folder):
if not os.path.exists(folder):
os.makedirs(folder)
fileName = folder + header + str(int(round(time.time() * 1000))) + ".bin";
print("\n[+] Writing buffer to file: " + fileName + '\n')
f = open(fileName, 'wb')
f.write(data)
f.close()
def onMessage(message, data):
if message["type"] == "send":
payload = message['payload']
typ, tag, tag2 = payload.split(":")
if (typ == "buffer"):
if tag2 == '':
tag2 = tag
folder = "./out/" + tag + "_buffers/"
else:
folder = "./out/" + tag + "_buffers/" + tag2 + "/"
buffer = bytearray([c for c in data])
write2file(tag2 + "_buffer_", buffer, folder)
else:
print(message, file=sys.stderr)
def on_message_lib(message, data):
global modules
if message["type"] == "send":
modules.append(message['payload'])
def get_wv_module(modules, mediadrm):
widevine_libs = {'libwvdrmengine.so',
'libwvhidl.so',
'libwvdrm_L1.so',
'libdrmwvmplugin.so',
'libWVStreamControlAPI_L1.so',
'libmediadrm.so',
'libwvm.so'}
wv_module = None
for lib in widevine_libs:
if lib in modules:
wv_module = lib
if wv_module == None:
print("No Widevine Module in {}.".format(mediadrm), file=sys.stderr)
exit(-1)
return wv_module
def main():
global modules
device = frida.get_usb_device()
mediadrm = get_mediadrm_name()
session = device.attach(mediadrm)
print("[+] Attached to " + mediadrm)
script = session.create_script("""
Process.enumerateModules({
onMatch: function(module){
send(module.name);
},
onComplete: function(){}
});
""")
script.on('message', on_message_lib)
print("[+] Searching Widevine Module in {}.".format(mediadrm))
script.load()
wv_module = get_wv_module(modules, mediadrm)
print("[+] Widevine Module {} found.".format(wv_module))
print("[+] Processing Frida JS scripts")
script_data = ""
for p in Path("js/hooks").glob('*.js'):
with p.open() as f:
symbol = str(p).split("/")[-1].split(".js")[0]
script_data += "Math.sin = Module.findExportByName('{}', '{}');if (Math.sin != null) {{Interceptor.attach(Math.sin, {});}}\n\n".format(wv_module, symbol, f.read())
script_instance = session.create_script(script_data);
script_instance.on('message', onMessage)
print("\t[+] Loading hooks")
script_instance.load()
print("\t[+] Hooks loaded successfully")
print("[+] Listening...")
sys.stdin.read()
session.detach()
print("[+] Detached")
if __name__ == '__main__':
main()