frida-fusion 0.1.20__tar.gz → 0.1.22__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.

Files changed (49) hide show
  1. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/PKG-INFO +1 -1
  2. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/__meta__.py +2 -2
  3. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/libs/logger.py +16 -0
  4. frida_fusion-0.1.22/frida_fusion/modules/log/log.js +83 -0
  5. frida_fusion-0.1.22/frida_fusion/modules/log/log.py +75 -0
  6. frida_fusion-0.1.22/frida_fusion/modules/tls_unpinning/__init__.py +0 -0
  7. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion.egg-info/PKG-INFO +1 -1
  8. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion.egg-info/SOURCES.txt +3 -0
  9. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/LICENSE +0 -0
  10. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/README.md +0 -0
  11. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/__init__.py +0 -0
  12. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/__main__.py +0 -0
  13. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/args.py +0 -0
  14. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/config.py +0 -0
  15. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/exceptions.py +0 -0
  16. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/fusion.py +0 -0
  17. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/libs/__init__.py +0 -0
  18. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/libs/color.py +0 -0
  19. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/libs/database.py +0 -0
  20. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/libs/helpers.js +0 -0
  21. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/libs/scriptlocation.py +0 -0
  22. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/module.py +0 -0
  23. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/__init__.py +0 -0
  24. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/android_setings/__init__.py +0 -0
  25. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/android_setings/settings.js +0 -0
  26. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/android_setings/settings.py +0 -0
  27. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/crypto/__init__.py +0 -0
  28. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/crypto/crypto.js +0 -0
  29. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/crypto/crypto.py +0 -0
  30. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/hermes_injector/__init__.py +0 -0
  31. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/hermes_injector/hermes_hook.js +0 -0
  32. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/hermes_injector/hermes_injector.js +0 -0
  33. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/hermes_injector/hermes_injector.py +0 -0
  34. {frida_fusion-0.1.20/frida_fusion/modules/shared_preferences → frida_fusion-0.1.22/frida_fusion/modules/log}/__init__.py +0 -0
  35. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/okhttp_logging/okhttp-logging.js +0 -0
  36. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/okhttp_logging/okhttp-logging.py +0 -0
  37. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/reflection/reflection-stalker.js +0 -0
  38. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/reflection/reflection-stalker.py +0 -0
  39. {frida_fusion-0.1.20/frida_fusion/modules/tls_unpinning → frida_fusion-0.1.22/frida_fusion/modules/shared_preferences}/__init__.py +0 -0
  40. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/shared_preferences/shared_preferences.js +0 -0
  41. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/shared_preferences/shared_preferences.py +0 -0
  42. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion/modules/tls_unpinning/frida_multiple_unpinning.py +0 -0
  43. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion.egg-info/dependency_links.txt +0 -0
  44. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion.egg-info/entry_points.txt +0 -0
  45. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion.egg-info/requires.txt +0 -0
  46. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/frida_fusion.egg-info/top_level.txt +0 -0
  47. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/pyproject.toml +0 -0
  48. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/setup.cfg +0 -0
  49. {frida_fusion-0.1.20 → frida_fusion-0.1.22}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frida-fusion
3
- Version: 0.1.20
3
+ Version: 0.1.22
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.20'
1
+ __version__ = '0.1.22'
2
2
  __title__ = "Frida Fusion"
3
3
  __description__ = "📱 frida-fusion - runtime mobile exploration"
4
4
  __url__ = "https://github.com/helviojunior/frida-fusion"
5
- __build__ = 0x472df92
5
+ __build__ = 0xc4b4a96
6
6
  __author__ = "Helvio Junior (M4v3r1ck)"
7
7
  __author_email__ = "helvio_junior@hotmail.com"
8
8
  __license__ = "GPL-3.0"
@@ -126,6 +126,22 @@ class Logger(object):
126
126
  except:
127
127
  return f"[ERROR] Type %s not serializable{type(obj)}"
128
128
 
129
+ @classmethod
130
+ def check_print(cls, level: str = "*"):
131
+
132
+ if level is None:
133
+ level = "*"
134
+
135
+ dbg_tag = next(iter([
136
+ k
137
+ for k in Logger.level_map.keys()
138
+ if level.upper() == k
139
+ ]), Logger.level_tag.get(level, "I"))
140
+
141
+ dbg_idx = Logger.level_map.get(dbg_tag, 0)
142
+
143
+ return Logger.debug_level <= dbg_idx
144
+
129
145
  @classmethod
130
146
  def print_message(cls, level: str = "*", message: str = "",
131
147
  script_location: ScriptLocation = None, filename_col_len: int = 26):
@@ -0,0 +1,83 @@
1
+ // log.js
2
+ // Intercept android.util.Log.*
3
+
4
+ setTimeout(function () {
5
+
6
+ Java.perform(function () {
7
+ var Log = null;
8
+ try {
9
+ Log = Java.use("android.util.Log");
10
+ } catch (err) {
11
+ fusion_sendMessage('E', `Class android.util.Log not found: ${err}`);
12
+ return;
13
+ }
14
+
15
+ var methods = ['d', 'i', 'w', 'e', 'v', 'wtf', 'println'];
16
+
17
+ function argToStr(a) {
18
+ try {
19
+ if (a === null || a === undefined) return String(a);
20
+ // alguns objetos Java têm toString() seguros
21
+ return a.toString();
22
+ } catch (e) {
23
+ try { return JSON.stringify(a); } catch(_) { return '[unprintable]'; }
24
+ }
25
+ }
26
+
27
+ methods.forEach(function (m) {
28
+ if (typeof Log[m] === 'undefined') return;
29
+
30
+ var overloads = Log[m].overloads;
31
+ for (var j = 0; j < overloads.length; j++) {
32
+ (function (ov, methodName, idx) {
33
+ // guarda referência à implementação existente (pode ser null)
34
+ var origImpl = ov.implementation;
35
+
36
+ ov.implementation = function () {
37
+ var args = [];
38
+ for (var k = 0; k < arguments.length; k++) args.push(arguments[k]);
39
+
40
+ // tenta extrair tag/msg conforme padrões conhecidos
41
+ var tag = args.length > 0 ? argToStr(args[0]) : "";
42
+ var msg = args.length > 1 ? argToStr(args[1]) : "";
43
+ var extra = "";
44
+ if (args.length === 3 && typeof args[0] === 'number') {
45
+ extra = "priority=" + args[0] + " ";
46
+ tag = argToStr(args[1]);
47
+ msg = argToStr(args[2]);
48
+ }
49
+
50
+ fusion_sendKeyValueData('android.util.Log', [
51
+ { key: "Level", value: m },
52
+ { key: "Tag", value: tag },
53
+ { key: "Message", value: msg },
54
+ { key: "RawArgs", value: args }
55
+ ]);
56
+
57
+ // se quiser enviar para o host:
58
+ // send({type: "log", level: methodName, tag: tag, msg: msg, rawArgs: args});
59
+
60
+ // chama implementação original se for uma função válida
61
+ try {
62
+ if (origImpl && typeof origImpl === 'function') {
63
+ return origImpl.apply(this, arguments);
64
+ } else {
65
+ // fallback seguro:
66
+ // a maioria dos métodos Log.* retorna int (0 em caso de "ok")
67
+ // retornar 0 evita crashes quando não há implementação original
68
+ return 0;
69
+ }
70
+ } catch (callErr) {
71
+ // captura qualquer erro ao chamar a implementação original
72
+ fusion_sendMessage('E', `Erro ao chamar implementação original de Log.${methodName}: ${callErr}`);
73
+ return 0;
74
+ }
75
+ };
76
+ })(overloads[j], m, j);
77
+ }
78
+ });
79
+
80
+ fusion_sendMessage('W', "Hook android.util.Log to: " + methods.join(", "));
81
+ });
82
+
83
+ }, 0);
@@ -0,0 +1,75 @@
1
+ import json
2
+ import os.path
3
+ from pathlib import Path
4
+ from frida_fusion.libs.logger import Logger
5
+ from frida_fusion.libs.database import Database
6
+ from frida_fusion.libs.scriptlocation import ScriptLocation
7
+ from frida_fusion.module import ModuleBase
8
+
9
+
10
+ class AndroidLog(ModuleBase):
11
+ def __init__(self):
12
+ super().__init__('Log', 'Hook android.util.Log.* functions')
13
+ self._package = None
14
+ self._suppress_messages = False
15
+ self.mod_path = str(Path(__file__).resolve().parent)
16
+
17
+ def start_module(self, **kwargs) -> bool:
18
+ if 'db_path' not in kwargs:
19
+ raise Exception("parameter db_path not found")
20
+
21
+ self._package = kwargs['package']
22
+ return True
23
+
24
+ def js_files(self) -> list:
25
+ return [
26
+ os.path.join(self.mod_path, "log.js")
27
+ ]
28
+
29
+ def suppress_messages(self):
30
+ self._suppress_messages = True
31
+
32
+ def key_value_event(self,
33
+ script_location: ScriptLocation = None,
34
+ stack_trace: str = None,
35
+ module: str = None,
36
+ received_data: dict = None
37
+ ) -> bool:
38
+
39
+ if 'android.util.Log' in module:
40
+ level = received_data.get('level', "I")
41
+ if level is None:
42
+ level = "I"
43
+ message = received_data.get('message', '')
44
+ tag = received_data.get('tag', '')
45
+ if tag is None or tag.strip() == '':
46
+ tag = None
47
+ try:
48
+ received_data['rawargs'] = json.loads(received_data.get('rawargs', ''))
49
+ except Exception:
50
+ pass
51
+
52
+ # raw_args = received_data.get('rawargs', '')
53
+ if Logger.check_print(level="D"):
54
+ message += f"\n{stack_trace}"
55
+
56
+ if not self._suppress_messages:
57
+ Logger.print_message(
58
+ level=level.upper(),
59
+ message=f"{message}",
60
+ script_location=ScriptLocation(
61
+ file_name=tag,
62
+ line=f"{script_location.file_name}",
63
+ function_name=script_location.function_name
64
+ ) if tag is not None else script_location
65
+ )
66
+
67
+ return True
68
+
69
+ def data_event(self,
70
+ script_location: ScriptLocation = None,
71
+ stack_trace: str = None,
72
+ received_data: str = None
73
+ ) -> bool:
74
+ # Nothing by now
75
+ return True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frida-fusion
3
- Version: 0.1.20
3
+ Version: 0.1.22
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>
@@ -33,6 +33,9 @@ frida_fusion/modules/hermes_injector/__init__.py
33
33
  frida_fusion/modules/hermes_injector/hermes_hook.js
34
34
  frida_fusion/modules/hermes_injector/hermes_injector.js
35
35
  frida_fusion/modules/hermes_injector/hermes_injector.py
36
+ frida_fusion/modules/log/__init__.py
37
+ frida_fusion/modules/log/log.js
38
+ frida_fusion/modules/log/log.py
36
39
  frida_fusion/modules/okhttp_logging/okhttp-logging.js
37
40
  frida_fusion/modules/okhttp_logging/okhttp-logging.py
38
41
  frida_fusion/modules/reflection/reflection-stalker.js
File without changes
File without changes
File without changes
File without changes