frida-fusion 0.1.10__tar.gz → 0.1.11__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.10 → frida_fusion-0.1.11}/PKG-INFO +1 -1
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/__meta__.py +2 -2
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/fusion.py +23 -3
- frida_fusion-0.1.11/frida_fusion/modules/android_setings/settings.js +172 -0
- frida_fusion-0.1.11/frida_fusion/modules/android_setings/settings.py +106 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/modules/crypto/crypto.js +14 -14
- frida_fusion-0.1.11/frida_fusion/modules/tls_unpinning/__init__.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion.egg-info/PKG-INFO +1 -1
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion.egg-info/SOURCES.txt +3 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/LICENSE +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/README.md +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/__init__.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/__main__.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/args.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/config.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/libs/__init__.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/libs/color.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/libs/database.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/libs/helpers.js +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/libs/logger.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/libs/scriptlocation.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/module.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/modules/__init__.py +0 -0
- {frida_fusion-0.1.10/frida_fusion/modules/crypto → frida_fusion-0.1.11/frida_fusion/modules/android_setings}/__init__.py +0 -0
- {frida_fusion-0.1.10/frida_fusion/modules/tls_unpinning → frida_fusion-0.1.11/frida_fusion/modules/crypto}/__init__.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/modules/crypto/crypto.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion/modules/tls_unpinning/frida_multiple_unpinning.py +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion.egg-info/dependency_links.txt +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion.egg-info/entry_points.txt +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion.egg-info/requires.txt +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/frida_fusion.egg-info/top_level.txt +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/pyproject.toml +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/setup.cfg +0 -0
- {frida_fusion-0.1.10 → frida_fusion-0.1.11}/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.11
|
|
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.11'
|
|
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__ = 0xc8879a3
|
|
6
6
|
__author__ = "Helvio Junior (M4v3r1ck)"
|
|
7
7
|
__author_email__ = "helvio_junior@hotmail.com"
|
|
8
8
|
__license__ = "GPL-3.0"
|
|
@@ -194,9 +194,29 @@ class Fusion(object):
|
|
|
194
194
|
s.on("message", self.make_handler("fusion_bundle.js")) # register the message handler
|
|
195
195
|
s.load()
|
|
196
196
|
except Exception as e:
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
err = str(e)
|
|
200
|
+
pattern = re.compile(r'script\(line (\d+)\):')
|
|
201
|
+
matches = [
|
|
202
|
+
(
|
|
203
|
+
m.group(0),
|
|
204
|
+
self.translate_location(dict(
|
|
205
|
+
file_name="fusion_bundle.js",
|
|
206
|
+
line=m.group(1),
|
|
207
|
+
))
|
|
208
|
+
)
|
|
209
|
+
for m in pattern.finditer(err)
|
|
210
|
+
]
|
|
211
|
+
for m in matches:
|
|
212
|
+
err = err.replace(m[0], f"{m[1].file_name}(line {m[1].line})")
|
|
213
|
+
Logger.pl('{!} {R}Error:{O} %s{W}' % err)
|
|
214
|
+
print("")
|
|
215
|
+
sys.exit(1)
|
|
216
|
+
except Exception:
|
|
217
|
+
Logger.pl('{!} {R}Error:{O} %s{W}' % str(e))
|
|
218
|
+
print("")
|
|
219
|
+
sys.exit(1)
|
|
200
220
|
|
|
201
221
|
def attach(self, pid: int):
|
|
202
222
|
self.running = True
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Documentation
|
|
3
|
+
https://developer.android.com/reference/android/provider/Settings
|
|
4
|
+
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const SET_MODULES = {
|
|
8
|
+
Global: true,
|
|
9
|
+
Secure: true,
|
|
10
|
+
System: true,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
setTimeout(function() {
|
|
14
|
+
Java.perform(function() {
|
|
15
|
+
|
|
16
|
+
// Bypass Settings
|
|
17
|
+
var androidSettings = [
|
|
18
|
+
['adb_enabled', 0],
|
|
19
|
+
['development_settings_enabled', 0],
|
|
20
|
+
['play_protect_enabled', 1],
|
|
21
|
+
['adb_enabled', 0]
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
function settings_bypassValue(name, originalValue) {
|
|
25
|
+
androidSettings.forEach(function(item) {
|
|
26
|
+
let name = item[0];
|
|
27
|
+
let value = item[1];
|
|
28
|
+
|
|
29
|
+
if (name === name) {
|
|
30
|
+
fusion_sendMessage('D', `Bypassing ${name}`)
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return originalValue;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (SET_MODULES.System) {
|
|
38
|
+
|
|
39
|
+
fusion_sendMessage('D', "Module attached: android.provider.Settings.System");
|
|
40
|
+
const settingsSystem = Java.use("android.provider.Settings$System");
|
|
41
|
+
|
|
42
|
+
settingsSystem.getString.overload('android.content.ContentResolver', 'java.lang.String').implementation = function (cr, name) {
|
|
43
|
+
var data = this.getString.overload('android.content.ContentResolver', 'java.lang.String').call(this, cr, name);
|
|
44
|
+
fusion_sendKeyValueData("Settings$System.getString", [
|
|
45
|
+
{key: "Name", value: name},
|
|
46
|
+
{key: "Result", value: data}
|
|
47
|
+
]);
|
|
48
|
+
return data
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
settingsSystem.putString.overload('android.content.ContentResolver', 'java.lang.String', 'java.lang.String').implementation = function (cr, name, value) {
|
|
52
|
+
fusion_sendKeyValueData("Settings$System.putString", [
|
|
53
|
+
{key: "Name", value: name},
|
|
54
|
+
{key: "Value", value: value}
|
|
55
|
+
]);
|
|
56
|
+
return this.putString.overload('android.content.ContentResolver', 'java.lang.String', 'java.lang.String').call(this, cr, name, value);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
settingsSystem.getUriFor.overload('java.lang.String').implementation = function (name) {
|
|
60
|
+
var data = this.getUriFor.overload('java.lang.String').call(this, name);
|
|
61
|
+
fusion_sendKeyValueData("Settings$System.getUriFor", [
|
|
62
|
+
{key: "Name", value: name},
|
|
63
|
+
{key: "Result", value: data}
|
|
64
|
+
]);
|
|
65
|
+
return data
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
settingsSystem.getInt.overload('android.content.ContentResolver', 'java.lang.String', 'int').implementation = function(cr, name, flag) {
|
|
69
|
+
var data = this.getInt.overload('android.content.ContentResolver', 'java.lang.String', 'int').call(this, cr, name, flag);
|
|
70
|
+
fusion_sendKeyValueData("Settings$System.getInt", [
|
|
71
|
+
{key: "Name", value: name},
|
|
72
|
+
{key: "Flag", value: flag},
|
|
73
|
+
{key: "Result", value: data}
|
|
74
|
+
]);
|
|
75
|
+
|
|
76
|
+
return settings_bypassValue(name, data);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
settingsSystem.getInt.overload('android.content.ContentResolver', 'java.lang.String').implementation = function(cr, name) {
|
|
80
|
+
var data = this.getInt.overload('android.content.ContentResolver', 'java.lang.String').call(this, cr, name);
|
|
81
|
+
fusion_sendKeyValueData("Settings$System.getInt", [
|
|
82
|
+
{key: "Name", value: name},
|
|
83
|
+
{key: "Result", value: data}
|
|
84
|
+
]);
|
|
85
|
+
return settings_bypassValue(name, data);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (SET_MODULES.Secure) {
|
|
91
|
+
|
|
92
|
+
fusion_sendMessage('D', "Module attached: android.provider.Settings.Secure");
|
|
93
|
+
const settingsSecure = Java.use("android.provider.Settings$Secure");
|
|
94
|
+
|
|
95
|
+
settingsSecure.getString.overload('android.content.ContentResolver', 'java.lang.String').implementation = function (cr, name) {
|
|
96
|
+
var data = this.getString.overload('android.content.ContentResolver', 'java.lang.String').call(this, cr, name);
|
|
97
|
+
fusion_sendKeyValueData("Settings$Secure.getString", [
|
|
98
|
+
{key: "Name", value: name},
|
|
99
|
+
{key: "Result", value: data}
|
|
100
|
+
]);
|
|
101
|
+
return data
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
settingsSecure.putString.overload('android.content.ContentResolver', 'java.lang.String', 'java.lang.String').implementation = function (cr, name, value) {
|
|
105
|
+
fusion_sendKeyValueData("Settings$Secure.putString", [
|
|
106
|
+
{key: "Name", value: name},
|
|
107
|
+
{key: "Value", value: value}
|
|
108
|
+
]);
|
|
109
|
+
return this.putString.overload('android.content.ContentResolver', 'java.lang.String', 'java.lang.String').call(this, cr, name, value);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
settingsSecure.getUriFor.overload('java.lang.String').implementation = function (name) {
|
|
113
|
+
var data = this.getUriFor.overload('java.lang.String').call(this, name);
|
|
114
|
+
fusion_sendKeyValueData("Settings$Secure.getUriFor", [
|
|
115
|
+
{key: "Name", value: name},
|
|
116
|
+
{key: "Result", value: data}
|
|
117
|
+
]);
|
|
118
|
+
return data
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
settingsSecure.getInt.overload('android.content.ContentResolver', 'java.lang.String', 'int').implementation = function(cr, name, flag) {
|
|
122
|
+
var data = this.getInt.overload('android.content.ContentResolver', 'java.lang.String', 'int').call(this, cr, name, flag);
|
|
123
|
+
fusion_sendKeyValueData("Settings$Secure.getInt", [
|
|
124
|
+
{key: "Name", value: name},
|
|
125
|
+
{key: "Flag", value: flag},
|
|
126
|
+
{key: "Result", value: data}
|
|
127
|
+
]);
|
|
128
|
+
|
|
129
|
+
return settings_bypassValue(name, data);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
settingsSecure.getInt.overload('android.content.ContentResolver', 'java.lang.String').implementation = function(cr, name) {
|
|
133
|
+
var data = this.getInt.overload('android.content.ContentResolver', 'java.lang.String').call(this, cr, name);
|
|
134
|
+
fusion_sendKeyValueData("Settings$Secure.getInt", [
|
|
135
|
+
{key: "Name", value: name},
|
|
136
|
+
{key: "Result", value: data}
|
|
137
|
+
]);
|
|
138
|
+
return settings_bypassValue(name, data);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (SET_MODULES.Global) {
|
|
144
|
+
|
|
145
|
+
fusion_sendMessage('D', "Module attached: android.provider.Settings.Global");
|
|
146
|
+
const settingGlobal = Java.use('android.provider.Settings$Global');
|
|
147
|
+
|
|
148
|
+
settingGlobal.getInt.overload('android.content.ContentResolver', 'java.lang.String', 'int').implementation = function(cr, name, flag) {
|
|
149
|
+
var data = this.getInt.overload('android.content.ContentResolver', 'java.lang.String', 'int').call(this, cr, name, flag);
|
|
150
|
+
fusion_sendKeyValueData("Settings$Global.getInt", [
|
|
151
|
+
{key: "Name", value: name},
|
|
152
|
+
{key: "Flag", value: flag},
|
|
153
|
+
{key: "Result", value: data}
|
|
154
|
+
]);
|
|
155
|
+
return settings_bypassValue(name, data);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
settingGlobal.getInt.overload('android.content.ContentResolver', 'java.lang.String').implementation = function(cr, name) {
|
|
159
|
+
var data = this.getInt.overload('android.content.ContentResolver', 'java.lang.String').call(this, cr, name);
|
|
160
|
+
fusion_sendKeyValueData("Settings$Global.getInt", [
|
|
161
|
+
{key: "Name", value: name},
|
|
162
|
+
{key: "Result", value: data}
|
|
163
|
+
]);
|
|
164
|
+
return settings_bypassValue(name, data);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fusion_sendMessage("W", "Android Settings hook module have been successfully initialized.")
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
}, 0);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os.path
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import base64
|
|
5
|
+
import string
|
|
6
|
+
|
|
7
|
+
from frida_fusion.libs.logger import Logger
|
|
8
|
+
from frida_fusion.libs.database import Database
|
|
9
|
+
from frida_fusion.libs.scriptlocation import ScriptLocation
|
|
10
|
+
from frida_fusion.module import ModuleBase
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Settings(ModuleBase):
|
|
14
|
+
class SettingsDB(Database):
|
|
15
|
+
dbName = ""
|
|
16
|
+
|
|
17
|
+
def __init__(self, db_name: str):
|
|
18
|
+
super().__init__(
|
|
19
|
+
auto_create=True,
|
|
20
|
+
db_name=db_name
|
|
21
|
+
)
|
|
22
|
+
self.create_db()
|
|
23
|
+
|
|
24
|
+
def create_db(self):
|
|
25
|
+
super().create_db()
|
|
26
|
+
conn = self.connect_to_db(check=False)
|
|
27
|
+
|
|
28
|
+
# definindo um cursor
|
|
29
|
+
cursor = conn.cursor()
|
|
30
|
+
|
|
31
|
+
# criando a tabela (schema)
|
|
32
|
+
cursor.execute("""
|
|
33
|
+
CREATE TABLE IF NOT EXISTS [android_settings] (
|
|
34
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
35
|
+
module TEXT NULL,
|
|
36
|
+
name TEXT NULL,
|
|
37
|
+
flag INTEGER NULL DEFAULT (0),
|
|
38
|
+
data TEXT NULL,
|
|
39
|
+
created_date datetime not null DEFAULT (datetime('now','localtime')),
|
|
40
|
+
UNIQUE (module, name, flag, data)
|
|
41
|
+
);
|
|
42
|
+
""")
|
|
43
|
+
|
|
44
|
+
conn.commit()
|
|
45
|
+
|
|
46
|
+
# Must get the constraints
|
|
47
|
+
self.get_constraints(conn)
|
|
48
|
+
|
|
49
|
+
def __init__(self):
|
|
50
|
+
super().__init__('Settings', 'Hook Android Settings functions')
|
|
51
|
+
self._settings_db = None
|
|
52
|
+
self.mod_path = str(Path(__file__).resolve().parent)
|
|
53
|
+
|
|
54
|
+
def start_module(self, **kwargs) -> bool:
|
|
55
|
+
if 'db_path' not in kwargs:
|
|
56
|
+
raise Exception("parameter db_path not found")
|
|
57
|
+
|
|
58
|
+
self._settings_db = Settings.SettingsDB(db_name=kwargs['db_path'])
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
def js_files(self) -> list:
|
|
62
|
+
return [
|
|
63
|
+
os.path.join(self.mod_path, "settings.js")
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
def key_value_event(self,
|
|
67
|
+
script_location: ScriptLocation = None,
|
|
68
|
+
stack_trace: str = None,
|
|
69
|
+
module: str = None,
|
|
70
|
+
received_data: dict = None
|
|
71
|
+
) -> bool:
|
|
72
|
+
|
|
73
|
+
if module in ["Settings$Secure.getString",
|
|
74
|
+
"Settings$Secure.putString",
|
|
75
|
+
"Settings$Secure.getUriFor",
|
|
76
|
+
"Settings$Secure.getInt",
|
|
77
|
+
"Settings$System.getString",
|
|
78
|
+
"Settings$System.putString",
|
|
79
|
+
"Settings$System.getUriFor",
|
|
80
|
+
"Settings$System.getInt",
|
|
81
|
+
"Settings$Global.getInt"
|
|
82
|
+
]:
|
|
83
|
+
name = received_data.get('name', None)
|
|
84
|
+
flag = received_data.get('flag', 0)
|
|
85
|
+
value = received_data.get('value', None)
|
|
86
|
+
result = received_data.get('result', value)
|
|
87
|
+
|
|
88
|
+
self._settings_db.insert_ignore_one(
|
|
89
|
+
table_name='android_settings',
|
|
90
|
+
module=module,
|
|
91
|
+
name=name,
|
|
92
|
+
flag=flag,
|
|
93
|
+
data=result
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return True
|
|
97
|
+
|
|
98
|
+
def data_event(self,
|
|
99
|
+
script_location: ScriptLocation = None,
|
|
100
|
+
stack_trace: str = None,
|
|
101
|
+
received_data: str = None
|
|
102
|
+
) -> bool:
|
|
103
|
+
#Nothing by now
|
|
104
|
+
return True
|
|
105
|
+
|
|
106
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
const
|
|
2
|
+
const CRYPTO_MODULES = {
|
|
3
3
|
KeyGenerator: true,
|
|
4
4
|
KeyPairGenerator: true,
|
|
5
5
|
SecretKeySpec: true,
|
|
@@ -20,7 +20,7 @@ setTimeout(function() {
|
|
|
20
20
|
|
|
21
21
|
const System = Java.use("java.lang.System");
|
|
22
22
|
|
|
23
|
-
if (
|
|
23
|
+
if (CRYPTO_MODULES.KeyGenerator) {
|
|
24
24
|
fusion_sendMessage('*', "Module attached: javax.crypto.KeyGenerator");
|
|
25
25
|
const keyGenerator = Java.use("javax.crypto.KeyGenerator");
|
|
26
26
|
|
|
@@ -54,7 +54,7 @@ setTimeout(function() {
|
|
|
54
54
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
if (
|
|
57
|
+
if (CRYPTO_MODULES.KeyPairGenerator) {
|
|
58
58
|
fusion_sendMessage('*', "Module attached: java.security.KeyPairGenerator");
|
|
59
59
|
const keyPairGenerator = Java.use("java.security.KeyPairGenerator");
|
|
60
60
|
keyPairGenerator.getInstance.overload("java.lang.String").implementation = function (arg0) {
|
|
@@ -81,7 +81,7 @@ setTimeout(function() {
|
|
|
81
81
|
};
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
if (
|
|
84
|
+
if (CRYPTO_MODULES.SecretKeySpec) {
|
|
85
85
|
fusion_sendMessage('*', "Module attached: javax.crypto.spec.SecretKeySpec");
|
|
86
86
|
const secretKeySpec = Java.use("javax.crypto.spec.SecretKeySpec");
|
|
87
87
|
secretKeySpec.$init.overload("[B", "java.lang.String").implementation = function (key, cipher) {
|
|
@@ -95,7 +95,7 @@ setTimeout(function() {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
if (
|
|
98
|
+
if (CRYPTO_MODULES.MessageDigest) {
|
|
99
99
|
fusion_sendMessage('*', "Module attached: java.security.MessageDigest");
|
|
100
100
|
const messageDigest = Java.use("java.security.MessageDigest");
|
|
101
101
|
messageDigest.getInstance.overload("java.lang.String").implementation = function (arg0) {
|
|
@@ -144,7 +144,7 @@ setTimeout(function() {
|
|
|
144
144
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
if (
|
|
147
|
+
if (CRYPTO_MODULES.SecretKeyFactory) {
|
|
148
148
|
fusion_sendMessage('*', "Module attached: javax.crypto.SecretKeyFactory");
|
|
149
149
|
const secretKeyFactory = Java.use("javax.crypto.SecretKeyFactory");
|
|
150
150
|
secretKeyFactory.getInstance.overload("java.lang.String").implementation = function (arg0) {
|
|
@@ -171,7 +171,7 @@ setTimeout(function() {
|
|
|
171
171
|
};
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
if (
|
|
174
|
+
if (CRYPTO_MODULES.Signature) {
|
|
175
175
|
fusion_sendMessage('*', "Module attached: java.security.Signature");
|
|
176
176
|
const signature = Java.use("java.security.Signature");
|
|
177
177
|
signature.getInstance.overload("java.lang.String").implementation = function (arg0) {
|
|
@@ -198,7 +198,7 @@ setTimeout(function() {
|
|
|
198
198
|
};
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
-
if (
|
|
201
|
+
if (CRYPTO_MODULES.Cipher) {
|
|
202
202
|
fusion_sendMessage('*', "Module attached: javax.crypto.Cipher");
|
|
203
203
|
var iv_parameter_spec = Java.use("javax.crypto.spec.IvParameterSpec");
|
|
204
204
|
var pbe_parameter_spec = Java.use("javax.crypto.spec.PBEParameterSpec");
|
|
@@ -365,7 +365,7 @@ setTimeout(function() {
|
|
|
365
365
|
}
|
|
366
366
|
|
|
367
367
|
|
|
368
|
-
if (
|
|
368
|
+
if (CRYPTO_MODULES.Mac) {
|
|
369
369
|
fusion_sendMessage('*', "Module attached: javax.crypto.Mac");
|
|
370
370
|
const mac = Java.use("javax.crypto.Mac");
|
|
371
371
|
mac.getInstance.overload("java.lang.String").implementation = function (arg0) {
|
|
@@ -392,7 +392,7 @@ setTimeout(function() {
|
|
|
392
392
|
};
|
|
393
393
|
}
|
|
394
394
|
|
|
395
|
-
if (
|
|
395
|
+
if (CRYPTO_MODULES.KeyGenParameterSpec) {
|
|
396
396
|
fusion_sendMessage('*', "Module attached: android.security.keystore.KeyGenParameterSpec$Builder");
|
|
397
397
|
const useKeyGen = Java.use("android.security.keystore.KeyGenParameterSpec$Builder");
|
|
398
398
|
useKeyGen.$init.overload("java.lang.String", "int").implementation = function (keyStoreAlias, purpose) {
|
|
@@ -466,7 +466,7 @@ setTimeout(function() {
|
|
|
466
466
|
}
|
|
467
467
|
}
|
|
468
468
|
|
|
469
|
-
if (
|
|
469
|
+
if (CRYPTO_MODULES.IvParameterSpec) {
|
|
470
470
|
fusion_sendMessage('*', "Module attached: javax.crypto.spec.IvParameterSpec");
|
|
471
471
|
const ivParameter = Java.use("javax.crypto.spec.IvParameterSpec");
|
|
472
472
|
ivParameter.$init.overload("[B").implementation = function (ivKey) {
|
|
@@ -488,7 +488,7 @@ setTimeout(function() {
|
|
|
488
488
|
}
|
|
489
489
|
}
|
|
490
490
|
|
|
491
|
-
if (
|
|
491
|
+
if (CRYPTO_MODULES.GCMParameterSpec) {
|
|
492
492
|
fusion_sendMessage('*', "Module attached: javax.crypto.spec.GCMParameterSpec");
|
|
493
493
|
const gcmParameter = Java.use("javax.crypto.spec.GCMParameterSpec");
|
|
494
494
|
gcmParameter.$init.overload("int", "[B").implementation = function (tLen, ivKey) {
|
|
@@ -512,7 +512,7 @@ setTimeout(function() {
|
|
|
512
512
|
}
|
|
513
513
|
}
|
|
514
514
|
|
|
515
|
-
if (
|
|
515
|
+
if (CRYPTO_MODULES.PBEParameterSpec) {
|
|
516
516
|
fusion_sendMessage('*', "Module attached: javax.crypto.spec.PBEParameterSpec");
|
|
517
517
|
const pbeParameter = Java.use("javax.crypto.spec.PBEParameterSpec");
|
|
518
518
|
pbeParameter.$init.overload("[B", "int").implementation = function (salt, iterationCount) {
|
|
@@ -547,7 +547,7 @@ setTimeout(function() {
|
|
|
547
547
|
}
|
|
548
548
|
}
|
|
549
549
|
|
|
550
|
-
if (
|
|
550
|
+
if (CRYPTO_MODULES.X509EncodedKeySpec) {
|
|
551
551
|
fusion_sendMessage('*', "Module attached: java.security.spec.X509EncodedKeySpec");
|
|
552
552
|
const x509EncodedKeySpec = Java.use("java.security.spec.X509EncodedKeySpec");
|
|
553
553
|
x509EncodedKeySpec.$init.overload("[B").implementation = function (encodedKey) {
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frida-fusion
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.11
|
|
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>
|
|
@@ -22,6 +22,9 @@ frida_fusion/libs/helpers.js
|
|
|
22
22
|
frida_fusion/libs/logger.py
|
|
23
23
|
frida_fusion/libs/scriptlocation.py
|
|
24
24
|
frida_fusion/modules/__init__.py
|
|
25
|
+
frida_fusion/modules/android_setings/__init__.py
|
|
26
|
+
frida_fusion/modules/android_setings/settings.js
|
|
27
|
+
frida_fusion/modules/android_setings/settings.py
|
|
25
28
|
frida_fusion/modules/crypto/__init__.py
|
|
26
29
|
frida_fusion/modules/crypto/crypto.js
|
|
27
30
|
frida_fusion/modules/crypto/crypto.py
|
|
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
|
|
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
|