frida-fusion 0.1.11__tar.gz → 0.1.13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of frida-fusion might be problematic. Click here for more details.
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/PKG-INFO +1 -1
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/__meta__.py +2 -2
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/args.py +4 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/config.py +35 -2
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/fusion.py +22 -1
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/module.py +6 -7
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/android_setings/settings.js +1 -1
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/android_setings/settings.py +4 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/crypto/crypto.py +71 -27
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion.egg-info/PKG-INFO +1 -1
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/LICENSE +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/README.md +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/__init__.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/__main__.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/libs/__init__.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/libs/color.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/libs/database.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/libs/helpers.js +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/libs/logger.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/libs/scriptlocation.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/__init__.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/android_setings/__init__.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/crypto/__init__.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/crypto/crypto.js +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/tls_unpinning/__init__.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/tls_unpinning/frida_multiple_unpinning.py +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion.egg-info/SOURCES.txt +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion.egg-info/dependency_links.txt +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion.egg-info/entry_points.txt +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion.egg-info/requires.txt +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion.egg-info/top_level.txt +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/pyproject.toml +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/setup.cfg +0 -0
- {frida_fusion-0.1.11 → frida_fusion-0.1.13}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frida-fusion
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.13
|
|
4
4
|
Summary: Hook your mobile tests with Frida
|
|
5
5
|
Author-email: "Helvio Junior (M4v3r1ck)" <helvio_junior@hotmail.com>
|
|
6
6
|
Maintainer-email: "Helvio Junior (M4v3r1ck)" <helvio_junior@hotmail.com>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
__version__ = '0.1.
|
|
1
|
+
__version__ = '0.1.13'
|
|
2
2
|
__title__ = "Frida Fusion"
|
|
3
3
|
__description__ = "📱 frida-fusion - runtime mobile exploration"
|
|
4
4
|
__url__ = "https://github.com/helviojunior/frida-fusion"
|
|
5
|
-
__build__ =
|
|
5
|
+
__build__ = 0xf8869e4
|
|
6
6
|
__author__ = "Helvio Junior (M4v3r1ck)"
|
|
7
7
|
__author_email__ = "helvio_junior@hotmail.com"
|
|
8
8
|
__license__ = "GPL-3.0"
|
|
@@ -148,4 +148,8 @@ class Arguments(object):
|
|
|
148
148
|
dest='enabled_modules',
|
|
149
149
|
help='Enabled module by name. You can specify multiple values repeating the flag.')
|
|
150
150
|
|
|
151
|
+
modules.add_argument('--silence-module-messages',
|
|
152
|
+
action='append',
|
|
153
|
+
dest='ignore_messages_modules',
|
|
154
|
+
help='Silence messages becaming from module by name. You can specify multiple values repeating the flag.')
|
|
151
155
|
|
|
@@ -22,6 +22,7 @@ class Configuration(object):
|
|
|
22
22
|
base_path = str(Path(__file__).resolve().parent)
|
|
23
23
|
db_path = os.path.join(str(Path(".").resolve()), "fusion.db")
|
|
24
24
|
enabled_modules = {}
|
|
25
|
+
ignore_messages_modules = {}
|
|
25
26
|
|
|
26
27
|
# Device vars
|
|
27
28
|
device_id = None
|
|
@@ -180,9 +181,15 @@ class Configuration(object):
|
|
|
180
181
|
|
|
181
182
|
Logger.pl(' {C}min debug level:{O} %s{W}' % str(args.debug_level).upper())
|
|
182
183
|
|
|
183
|
-
if args.enabled_modules is not None and isinstance(args.enabled_modules, list)
|
|
184
|
+
if (args.enabled_modules is not None and isinstance(args.enabled_modules, list)) or \
|
|
185
|
+
(args.ignore_messages_modules is not None and isinstance(args.ignore_messages_modules, list)):
|
|
184
186
|
mods = ModuleManager.list_modules()
|
|
185
|
-
for mod in
|
|
187
|
+
for mod in [
|
|
188
|
+
m.strip()
|
|
189
|
+
for md in args.enabled_modules
|
|
190
|
+
for m in md.split(",")
|
|
191
|
+
if m.strip() != ""
|
|
192
|
+
]:
|
|
186
193
|
fm = next(iter([
|
|
187
194
|
m
|
|
188
195
|
for _, m in mods.items()
|
|
@@ -196,6 +203,26 @@ class Configuration(object):
|
|
|
196
203
|
name = fm.safe_name()
|
|
197
204
|
if name not in Configuration.enabled_modules.keys():
|
|
198
205
|
Configuration.enabled_modules[name] = fm
|
|
206
|
+
if args.ignore_messages_modules is not None and isinstance(args.ignore_messages_modules, list):
|
|
207
|
+
for mod in [
|
|
208
|
+
m.strip()
|
|
209
|
+
for md in args.ignore_messages_modules
|
|
210
|
+
for m in md.split(",")
|
|
211
|
+
if m.strip() != ""
|
|
212
|
+
]:
|
|
213
|
+
fm = next(iter([
|
|
214
|
+
m
|
|
215
|
+
for _, m in mods.items()
|
|
216
|
+
if m.safe_name() == mod.lower()
|
|
217
|
+
]), None)
|
|
218
|
+
if fm is None:
|
|
219
|
+
Color.pl(
|
|
220
|
+
'{!} {R}error: module {O}%s{R} not found{W}\r\n' % mod)
|
|
221
|
+
sys.exit(1)
|
|
222
|
+
|
|
223
|
+
name = fm.safe_name()
|
|
224
|
+
if name not in Configuration.ignore_messages_modules.keys():
|
|
225
|
+
Configuration.ignore_messages_modules[name] = fm
|
|
199
226
|
|
|
200
227
|
if len(Configuration.enabled_modules) > 0:
|
|
201
228
|
Logger.pl(' {C}modules:{O} %s{W}' % ', '.join([
|
|
@@ -203,6 +230,12 @@ class Configuration(object):
|
|
|
203
230
|
for _, m in Configuration.enabled_modules.items()
|
|
204
231
|
]))
|
|
205
232
|
|
|
233
|
+
if len(Configuration.ignore_messages_modules) > 0:
|
|
234
|
+
Logger.pl(' {C}ignored messages from modules:{O} %s{W}' % ', '.join([
|
|
235
|
+
m.name
|
|
236
|
+
for _, m in Configuration.ignore_messages_modules.items()
|
|
237
|
+
]))
|
|
238
|
+
|
|
206
239
|
Logger.pl("")
|
|
207
240
|
|
|
208
241
|
@staticmethod
|
|
@@ -44,6 +44,7 @@ class Fusion(object):
|
|
|
44
44
|
self.pid = 0
|
|
45
45
|
self.script_trace = {}
|
|
46
46
|
self._modules = []
|
|
47
|
+
self._ignore_messages = []
|
|
47
48
|
signal.signal(signal.SIGINT, self.signal_handler)
|
|
48
49
|
|
|
49
50
|
t = threading.Thread(target=Fusion._db_worker, daemon=True)
|
|
@@ -293,6 +294,10 @@ class Fusion(object):
|
|
|
293
294
|
mType = jData.get('type', '').lower()
|
|
294
295
|
mLevel = jData.get('level', None)
|
|
295
296
|
if mType == "message":
|
|
297
|
+
|
|
298
|
+
if script_location.file_name in self._ignore_messages:
|
|
299
|
+
return
|
|
300
|
+
|
|
296
301
|
msg = jData.get('message', '')
|
|
297
302
|
try:
|
|
298
303
|
msg = base64.b64decode(msg).decode("UTF-8")
|
|
@@ -621,7 +626,23 @@ class Fusion(object):
|
|
|
621
626
|
if len(self._modules) > 0:
|
|
622
627
|
Logger.pl("{+} Starting selected modules")
|
|
623
628
|
for m in self._modules:
|
|
624
|
-
m.start_module(
|
|
629
|
+
m.start_module(
|
|
630
|
+
package=Configuration.package,
|
|
631
|
+
db_path=Configuration.db_path
|
|
632
|
+
)
|
|
633
|
+
if m.safe_name() in Configuration.ignore_messages_modules.keys():
|
|
634
|
+
m.suppress_messages()
|
|
635
|
+
|
|
636
|
+
self._ignore_messages = [
|
|
637
|
+
Path(f).name
|
|
638
|
+
for _, md in Configuration.ignore_messages_modules.items()
|
|
639
|
+
if (m := next(iter([
|
|
640
|
+
mi
|
|
641
|
+
for mi in self._modules
|
|
642
|
+
if mi.name == md.name
|
|
643
|
+
]), None)) is not None
|
|
644
|
+
for f in m.js_files()
|
|
645
|
+
]
|
|
625
646
|
|
|
626
647
|
self.get_device()
|
|
627
648
|
if self.device is not None:
|
|
@@ -8,13 +8,9 @@ import requests
|
|
|
8
8
|
import importlib.util
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
|
|
11
|
-
from typing import TYPE_CHECKING
|
|
12
|
-
|
|
13
11
|
from .__meta__ import __version__
|
|
14
12
|
from .libs.logger import Logger
|
|
15
|
-
|
|
16
|
-
if TYPE_CHECKING:
|
|
17
|
-
from .fusion import Fusion # só no type checker
|
|
13
|
+
from .libs.scriptlocation import ScriptLocation
|
|
18
14
|
|
|
19
15
|
|
|
20
16
|
class ModuleLoaderError(Exception):
|
|
@@ -42,8 +38,11 @@ class ModuleBase(object):
|
|
|
42
38
|
def js_files(self) -> list:
|
|
43
39
|
return []
|
|
44
40
|
|
|
41
|
+
def suppress_messages(self):
|
|
42
|
+
pass
|
|
43
|
+
|
|
45
44
|
def key_value_event(self,
|
|
46
|
-
script_location:
|
|
45
|
+
script_location: ScriptLocation = None,
|
|
47
46
|
stack_trace: str = None,
|
|
48
47
|
module: str = None,
|
|
49
48
|
received_data: dict = None
|
|
@@ -51,7 +50,7 @@ class ModuleBase(object):
|
|
|
51
50
|
raise Exception('Method "key_value_event" is not yet implemented.')
|
|
52
51
|
|
|
53
52
|
def data_event(self,
|
|
54
|
-
script_location:
|
|
53
|
+
script_location: ScriptLocation = None,
|
|
55
54
|
stack_trace: str = None,
|
|
56
55
|
received_data: str = None
|
|
57
56
|
) -> bool:
|
{frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/android_setings/settings.py
RENAMED
|
@@ -32,6 +32,7 @@ class Settings(ModuleBase):
|
|
|
32
32
|
cursor.execute("""
|
|
33
33
|
CREATE TABLE IF NOT EXISTS [android_settings] (
|
|
34
34
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
35
|
+
package TEXT NOT NULL,
|
|
35
36
|
module TEXT NULL,
|
|
36
37
|
name TEXT NULL,
|
|
37
38
|
flag INTEGER NULL DEFAULT (0),
|
|
@@ -49,12 +50,14 @@ class Settings(ModuleBase):
|
|
|
49
50
|
def __init__(self):
|
|
50
51
|
super().__init__('Settings', 'Hook Android Settings functions')
|
|
51
52
|
self._settings_db = None
|
|
53
|
+
self._package = None
|
|
52
54
|
self.mod_path = str(Path(__file__).resolve().parent)
|
|
53
55
|
|
|
54
56
|
def start_module(self, **kwargs) -> bool:
|
|
55
57
|
if 'db_path' not in kwargs:
|
|
56
58
|
raise Exception("parameter db_path not found")
|
|
57
59
|
|
|
60
|
+
self._package = kwargs['package']
|
|
58
61
|
self._settings_db = Settings.SettingsDB(db_name=kwargs['db_path'])
|
|
59
62
|
return True
|
|
60
63
|
|
|
@@ -87,6 +90,7 @@ class Settings(ModuleBase):
|
|
|
87
90
|
|
|
88
91
|
self._settings_db.insert_ignore_one(
|
|
89
92
|
table_name='android_settings',
|
|
93
|
+
package=self._package,
|
|
90
94
|
module=module,
|
|
91
95
|
name=name,
|
|
92
96
|
flag=flag,
|
|
@@ -32,6 +32,7 @@ class Crypto(ModuleBase):
|
|
|
32
32
|
cursor.execute("""
|
|
33
33
|
CREATE TABLE IF NOT EXISTS [crypto] (
|
|
34
34
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
35
|
+
package TEXT NOT NULL,
|
|
35
36
|
hashcode TEXT NOT NULL,
|
|
36
37
|
algorithm TEXT NULL,
|
|
37
38
|
init_key TEXT NULL,
|
|
@@ -52,6 +53,7 @@ class Crypto(ModuleBase):
|
|
|
52
53
|
cursor.execute("""
|
|
53
54
|
CREATE TABLE IF NOT EXISTS [crypto_key] (
|
|
54
55
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
56
|
+
package TEXT NOT NULL,
|
|
55
57
|
key TEXT NULL,
|
|
56
58
|
printable_key TEXT NULL,
|
|
57
59
|
salt TEXT NULL,
|
|
@@ -59,7 +61,7 @@ class Crypto(ModuleBase):
|
|
|
59
61
|
key_class TEXT NULL DEFAULT ('<unknown>'),
|
|
60
62
|
additional_data TEXT NULL,
|
|
61
63
|
created_date datetime not null DEFAULT (datetime('now','localtime')),
|
|
62
|
-
UNIQUE (key, key_class)
|
|
64
|
+
UNIQUE (package, key, key_class)
|
|
63
65
|
);
|
|
64
66
|
""")
|
|
65
67
|
|
|
@@ -68,6 +70,7 @@ class Crypto(ModuleBase):
|
|
|
68
70
|
cursor.execute("""
|
|
69
71
|
CREATE TABLE IF NOT EXISTS [digest] (
|
|
70
72
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
73
|
+
package TEXT NOT NULL,
|
|
71
74
|
algorithm TEXT NOT NULL,
|
|
72
75
|
hashcode TEXT NULL,
|
|
73
76
|
clear_text TEXT NULL,
|
|
@@ -98,7 +101,7 @@ class Crypto(ModuleBase):
|
|
|
98
101
|
|
|
99
102
|
def update_crypto(self, iv=None, hashcode=None, flow=None, key=None, before_final=None,
|
|
100
103
|
after_final=None, stack_trace=None, id=None, algorithm=None,
|
|
101
|
-
status=None):
|
|
104
|
+
status=None, package=None):
|
|
102
105
|
|
|
103
106
|
conn = self.connect_to_db(check=False)
|
|
104
107
|
cursor = conn.cursor()
|
|
@@ -124,6 +127,12 @@ class Crypto(ModuleBase):
|
|
|
124
127
|
|
|
125
128
|
data = []
|
|
126
129
|
update = "update [crypto] set "
|
|
130
|
+
|
|
131
|
+
if package is not None:
|
|
132
|
+
integrity = True
|
|
133
|
+
update += " package = ?,"
|
|
134
|
+
data.append(package)
|
|
135
|
+
|
|
127
136
|
if iv is not None:
|
|
128
137
|
integrity = True
|
|
129
138
|
update += " iv = ?,"
|
|
@@ -213,7 +222,7 @@ class Crypto(ModuleBase):
|
|
|
213
222
|
|
|
214
223
|
conn.close()
|
|
215
224
|
|
|
216
|
-
def insert_digest(self, hashcode, algorithm, data_input, data_output, stack_trace):
|
|
225
|
+
def insert_digest(self, package, hashcode, algorithm, data_input, data_output, stack_trace):
|
|
217
226
|
|
|
218
227
|
conn = self.connect_to_db(check=False)
|
|
219
228
|
|
|
@@ -243,9 +252,9 @@ class Crypto(ModuleBase):
|
|
|
243
252
|
|
|
244
253
|
cursor = conn.cursor()
|
|
245
254
|
cursor.execute("""
|
|
246
|
-
insert into [digest] ([hashcode], [algorithm], [clear_text], [clear_text_b64], [hash_b64], [hash_hex], [stack_trace])
|
|
247
|
-
VALUES (
|
|
248
|
-
""", (hashcode, algorithm, clear_text, clear_text_b64, hash_b64, hash_hex, stack_trace,))
|
|
255
|
+
insert into [digest] ([package], [hashcode], [algorithm], [clear_text], [clear_text_b64], [hash_b64], [hash_hex], [stack_trace])
|
|
256
|
+
VALUES (?,?,?,?,?,?,?,?);
|
|
257
|
+
""", (package, hashcode, algorithm, clear_text, clear_text_b64, hash_b64, hash_hex, stack_trace,))
|
|
249
258
|
|
|
250
259
|
conn.commit()
|
|
251
260
|
|
|
@@ -253,13 +262,14 @@ class Crypto(ModuleBase):
|
|
|
253
262
|
|
|
254
263
|
# Color.pl('{+} {W}Inserindo crypto. {C}Algorithm: {O}%s{W}' % algorithm)
|
|
255
264
|
|
|
256
|
-
def insert_crypto(self, hashcode, algorithm, init_key):
|
|
265
|
+
def insert_crypto(self, package, hashcode, algorithm, init_key):
|
|
257
266
|
|
|
258
267
|
if hashcode is None:
|
|
259
268
|
return
|
|
260
269
|
|
|
261
270
|
rows = self.select(
|
|
262
271
|
table_name='crypto',
|
|
272
|
+
package=package,
|
|
263
273
|
hashcode=hashcode,
|
|
264
274
|
status='open'
|
|
265
275
|
)
|
|
@@ -280,6 +290,7 @@ class Crypto(ModuleBase):
|
|
|
280
290
|
if init_key is not None and init_key != '' and init_key != 'IA==':
|
|
281
291
|
self.insert_one(
|
|
282
292
|
table_name='crypto',
|
|
293
|
+
package=package,
|
|
283
294
|
hashcode=hashcode,
|
|
284
295
|
algorithm=algorithm,
|
|
285
296
|
init_key=init_key,
|
|
@@ -287,15 +298,17 @@ class Crypto(ModuleBase):
|
|
|
287
298
|
else:
|
|
288
299
|
self.insert_one(
|
|
289
300
|
table_name='crypto',
|
|
301
|
+
package=package,
|
|
290
302
|
hashcode=hashcode,
|
|
291
303
|
algorithm=algorithm,
|
|
292
304
|
status='open')
|
|
293
305
|
|
|
294
|
-
def insert_crypto_key(self, key, key_class, salt=None,
|
|
306
|
+
def insert_crypto_key(self, package, key, key_class, salt=None,
|
|
295
307
|
iteration_count=0, module="<unknown>", additional_data=dict):
|
|
296
308
|
if key is not None and key != '' and key != 'IA==':
|
|
297
309
|
self.insert_ignore_one(
|
|
298
310
|
table_name='crypto_key',
|
|
311
|
+
package=package,
|
|
299
312
|
key=key,
|
|
300
313
|
printable_key=self.get_printable(key),
|
|
301
314
|
key_class=key_class,
|
|
@@ -309,13 +322,16 @@ class Crypto(ModuleBase):
|
|
|
309
322
|
|
|
310
323
|
def __init__(self):
|
|
311
324
|
super().__init__('Crypto', 'Hook cryptography/hashing functions')
|
|
325
|
+
self._package = None
|
|
312
326
|
self._crypto_db = None
|
|
327
|
+
self._suppress_messages = False
|
|
313
328
|
self.mod_path = str(Path(__file__).resolve().parent)
|
|
314
329
|
|
|
315
330
|
def start_module(self, **kwargs) -> bool:
|
|
316
331
|
if 'db_path' not in kwargs:
|
|
317
332
|
raise Exception("parameter db_path not found")
|
|
318
333
|
|
|
334
|
+
self._package = kwargs['package']
|
|
319
335
|
self._crypto_db = Crypto.CryptoDB(db_name=kwargs['db_path'])
|
|
320
336
|
return True
|
|
321
337
|
|
|
@@ -324,6 +340,9 @@ class Crypto(ModuleBase):
|
|
|
324
340
|
os.path.join(self.mod_path, "crypto.js")
|
|
325
341
|
]
|
|
326
342
|
|
|
343
|
+
def suppress_messages(self):
|
|
344
|
+
self._suppress_messages = True
|
|
345
|
+
|
|
327
346
|
def key_value_event(self,
|
|
328
347
|
script_location: ScriptLocation = None,
|
|
329
348
|
stack_trace: str = None,
|
|
@@ -347,6 +366,7 @@ class Crypto(ModuleBase):
|
|
|
347
366
|
iteration_count = received_data.get('iteration_count', None)
|
|
348
367
|
|
|
349
368
|
self._crypto_db.insert_crypto_key(
|
|
369
|
+
package=self._package,
|
|
350
370
|
key=key,
|
|
351
371
|
key_class=key_class,
|
|
352
372
|
salt=salt,
|
|
@@ -361,11 +381,13 @@ class Crypto(ModuleBase):
|
|
|
361
381
|
hashcode = received_data.get('hashcode', None)
|
|
362
382
|
key_class = received_data.get('classtype', "SecretKeySpec")
|
|
363
383
|
self._crypto_db.insert_crypto(
|
|
384
|
+
package=self._package,
|
|
364
385
|
hashcode=hashcode,
|
|
365
386
|
algorithm=algorithm,
|
|
366
387
|
init_key=key)
|
|
367
388
|
|
|
368
389
|
self._crypto_db.insert_crypto_key(
|
|
390
|
+
package=self._package,
|
|
369
391
|
key=key,
|
|
370
392
|
key_class=key_class,
|
|
371
393
|
module=module,
|
|
@@ -375,10 +397,24 @@ class Crypto(ModuleBase):
|
|
|
375
397
|
elif module == "IvParameterSpec.init":
|
|
376
398
|
bData = received_data.get('iv_key', None)
|
|
377
399
|
key_class = received_data.get('classtype', "IvParameterSpec")
|
|
378
|
-
|
|
400
|
+
|
|
401
|
+
offset = received_data.get('offset', None)
|
|
402
|
+
length = received_data.get('length', None)
|
|
403
|
+
if offset is not None and length is not None:
|
|
404
|
+
try:
|
|
405
|
+
offset = int(offset)
|
|
406
|
+
length = int(length)
|
|
407
|
+
if isinstance(bData, str):
|
|
408
|
+
bData = base64.b64decode(bData)
|
|
409
|
+
if offset + length <= len(bData):
|
|
410
|
+
bData = base64.b64encode(bData[offset:offset+length]).decode("UTF-8")
|
|
411
|
+
except:
|
|
412
|
+
pass
|
|
413
|
+
|
|
379
414
|
self._crypto_db.update_crypto(iv=bData)
|
|
380
415
|
|
|
381
416
|
self._crypto_db.insert_crypto_key(
|
|
417
|
+
package=self._package,
|
|
382
418
|
key=bData,
|
|
383
419
|
key_class=key_class,
|
|
384
420
|
module=module,
|
|
@@ -393,12 +429,14 @@ class Crypto(ModuleBase):
|
|
|
393
429
|
algorithm = received_data.get('algorithm', None)
|
|
394
430
|
|
|
395
431
|
self._crypto_db.insert_crypto(
|
|
432
|
+
package=self._package,
|
|
396
433
|
hashcode=hashcode,
|
|
397
434
|
algorithm=algorithm,
|
|
398
435
|
init_key=key
|
|
399
436
|
)
|
|
400
437
|
|
|
401
438
|
self._crypto_db.update_crypto(
|
|
439
|
+
package=self._package,
|
|
402
440
|
hashcode=hashcode,
|
|
403
441
|
flow='enc' if 'encrypt' in opmode else ('dec' if 'decrypt' in opmode else str(opmode)),
|
|
404
442
|
key=key,
|
|
@@ -406,28 +444,32 @@ class Crypto(ModuleBase):
|
|
|
406
444
|
)
|
|
407
445
|
|
|
408
446
|
self._crypto_db.insert_crypto_key(
|
|
447
|
+
package=self._package,
|
|
409
448
|
key=key,
|
|
410
449
|
key_class=key_class,
|
|
411
450
|
module=module,
|
|
412
451
|
additional_data=received_data
|
|
413
452
|
)
|
|
414
453
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
454
|
+
if not self._suppress_messages:
|
|
455
|
+
Logger.print_message(
|
|
456
|
+
level="W",
|
|
457
|
+
message=f"Cipher init received\nHashcode: {hashcode}\nOpmode: {opmode}\nKeytype: {key_class}",
|
|
458
|
+
script_location=script_location
|
|
459
|
+
)
|
|
420
460
|
|
|
421
461
|
elif module == "cipher.doFinal":
|
|
422
462
|
hashcode = received_data.get('hashcode', None)
|
|
423
463
|
|
|
424
464
|
self._crypto_db.insert_crypto(
|
|
465
|
+
package=self._package,
|
|
425
466
|
hashcode=hashcode,
|
|
426
467
|
algorithm=None,
|
|
427
468
|
init_key=None
|
|
428
469
|
)
|
|
429
470
|
|
|
430
471
|
self._crypto_db.update_crypto(
|
|
472
|
+
package=self._package,
|
|
431
473
|
hashcode=hashcode,
|
|
432
474
|
before_final=received_data.get('input', ''),
|
|
433
475
|
after_final=received_data.get('output', ''),
|
|
@@ -435,24 +477,25 @@ class Crypto(ModuleBase):
|
|
|
435
477
|
status="complete"
|
|
436
478
|
)
|
|
437
479
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
480
|
+
if not self._suppress_messages:
|
|
481
|
+
Logger.print_message(
|
|
482
|
+
level="D",
|
|
483
|
+
message=f"Cipher doFinal received\n{stack_trace}",
|
|
484
|
+
script_location=script_location
|
|
485
|
+
)
|
|
443
486
|
|
|
444
487
|
elif module == "messageDigest.update":
|
|
445
488
|
hashcode = received_data.get('hashcode', None)
|
|
446
489
|
algorithm = received_data.get('algorithm', None)
|
|
447
490
|
bInput = received_data.get('input', None)
|
|
448
|
-
self._crypto_db.insert_digest(hashcode, algorithm, bInput, None, stack_trace=stack_trace)
|
|
491
|
+
self._crypto_db.insert_digest(self._package, hashcode, algorithm, bInput, None, stack_trace=stack_trace)
|
|
449
492
|
|
|
450
493
|
elif module == "messageDigest.digest":
|
|
451
494
|
hashcode = received_data.get('hashcode', None)
|
|
452
495
|
algorithm = received_data.get('algorithm', None)
|
|
453
496
|
bInput = received_data.get('input', None) # Se não existir teve um messageDigest.update antes
|
|
454
497
|
bOutput = received_data.get('output', None)
|
|
455
|
-
self._crypto_db.insert_digest(hashcode, algorithm, bInput, bOutput, stack_trace=stack_trace)
|
|
498
|
+
self._crypto_db.insert_digest(self._package, hashcode, algorithm, bInput, bOutput, stack_trace=stack_trace)
|
|
456
499
|
|
|
457
500
|
hash_hex = ""
|
|
458
501
|
if bOutput is not None:
|
|
@@ -465,12 +508,13 @@ class Crypto(ModuleBase):
|
|
|
465
508
|
pass
|
|
466
509
|
|
|
467
510
|
# Do not print TLS certificate verification hash
|
|
468
|
-
if
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
511
|
+
if not self._suppress_messages:
|
|
512
|
+
if 'com.android.org.conscrypt.ConscryptEngine.verifyCertificateChain' not in stack_trace:
|
|
513
|
+
Logger.print_message(
|
|
514
|
+
level="D",
|
|
515
|
+
message=f"Message digest\nAlgorithm: {algorithm}\nHash: {hash_hex}\n{stack_trace}",
|
|
516
|
+
script_location=script_location
|
|
517
|
+
)
|
|
474
518
|
|
|
475
519
|
return True
|
|
476
520
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frida-fusion
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.13
|
|
4
4
|
Summary: Hook your mobile tests with Frida
|
|
5
5
|
Author-email: "Helvio Junior (M4v3r1ck)" <helvio_junior@hotmail.com>
|
|
6
6
|
Maintainer-email: "Helvio Junior (M4v3r1ck)" <helvio_junior@hotmail.com>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{frida_fusion-0.1.11 → frida_fusion-0.1.13}/frida_fusion/modules/android_setings/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|