trueseeing 2.2.6__tar.gz → 2.2.7__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.
Files changed (102) hide show
  1. {trueseeing-2.2.6 → trueseeing-2.2.7}/Dockerfile +8 -1
  2. {trueseeing-2.2.6 → trueseeing-2.2.7}/PKG-INFO +5 -4
  3. {trueseeing-2.2.6 → trueseeing-2.2.7}/README.md +2 -2
  4. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/__init__.py +1 -1
  5. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/api.py +1 -0
  6. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/ios/engage.py +56 -0
  7. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/inspect.py +4 -1
  8. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/shell.py +2 -2
  9. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/context.py +13 -3
  10. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/env.py +13 -0
  11. {trueseeing-2.2.6 → trueseeing-2.2.7}/.dockerignore +0 -0
  12. {trueseeing-2.2.6 → trueseeing-2.2.7}/.github/FUNDING.yml +0 -0
  13. {trueseeing-2.2.6 → trueseeing-2.2.7}/.github/workflows/deploy.yaml +0 -0
  14. {trueseeing-2.2.6 → trueseeing-2.2.7}/.github/workflows/lint.yaml +0 -0
  15. {trueseeing-2.2.6 → trueseeing-2.2.7}/.github/workflows/publish.yaml +0 -0
  16. {trueseeing-2.2.6 → trueseeing-2.2.7}/.github/workflows/stale.yaml +0 -0
  17. {trueseeing-2.2.6 → trueseeing-2.2.7}/.gitignore +0 -0
  18. {trueseeing-2.2.6 → trueseeing-2.2.7}/COPYING +0 -0
  19. {trueseeing-2.2.6 → trueseeing-2.2.7}/pyproject.toml +0 -0
  20. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/__init__.py +0 -0
  21. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/__init__.py +0 -0
  22. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/alias.py +0 -0
  23. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/analyze.py +0 -0
  24. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/android/__init__.py +0 -0
  25. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/android/asm.py +0 -0
  26. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/android/engage.py +0 -0
  27. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/android/recon.py +0 -0
  28. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/android/search.py +0 -0
  29. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/android/show.py +0 -0
  30. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/config.py +0 -0
  31. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/info.py +0 -0
  32. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/ios/__init__.py +0 -0
  33. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/report.py +0 -0
  34. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/scan.py +0 -0
  35. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/search.py +0 -0
  36. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/cmd/show.py +0 -0
  37. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/app/scan.py +0 -0
  38. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/__init__.py +0 -0
  39. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/analyze.py +0 -0
  40. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/analyze/__init__.py +0 -0
  41. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/analyze/flow.py +0 -0
  42. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/analyze/nat.py +0 -0
  43. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/analyze/op.py +0 -0
  44. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/asm.py +0 -0
  45. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/context.py +0 -0
  46. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/db.py +0 -0
  47. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/device.py +0 -0
  48. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/model.py +0 -0
  49. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/store.py +0 -0
  50. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/android/tools.py +0 -0
  51. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/config.py +0 -0
  52. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/cvss.py +0 -0
  53. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/db.py +0 -0
  54. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/exc.py +0 -0
  55. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ext.py +0 -0
  56. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/__init__.py +0 -0
  57. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/analyze.py +0 -0
  58. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/context.py +0 -0
  59. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/db.py +0 -0
  60. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/device.py +0 -0
  61. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/model.py +0 -0
  62. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/store.py +0 -0
  63. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ios/swift.py +0 -0
  64. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/model/__init__.py +0 -0
  65. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/model/cmd.py +0 -0
  66. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/model/issue.py +0 -0
  67. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/model/sig.py +0 -0
  68. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/nat.py +0 -0
  69. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/report.py +0 -0
  70. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/scan.py +0 -0
  71. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/store.py +0 -0
  72. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/tools.py +0 -0
  73. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/ui.py +0 -0
  74. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/core/z.py +0 -0
  75. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/LICENSE.md +0 -0
  76. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/abe.jar +0 -0
  77. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/apkeditor.jar +0 -0
  78. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/apksigner.jar +0 -0
  79. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/frida-app.smali +0 -0
  80. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/frida-scriptdir.config +0 -0
  81. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/nsc.xml +0 -0
  82. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/store.0.sql +0 -0
  83. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/android/store.1.sql +0 -0
  84. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/files.0.sql +0 -0
  85. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/ios/store.0.sql +0 -0
  86. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/ios/store.1.sql +0 -0
  87. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/public_suffix_list.dat +0 -0
  88. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/store.0.sql +0 -0
  89. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/store.s.sql +0 -0
  90. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/template/report.html +0 -0
  91. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/libs/tlds.txt +0 -0
  92. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/py.typed +0 -0
  93. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/__init__.py +0 -0
  94. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/android/__init__.py +0 -0
  95. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/android/crypto.py +0 -0
  96. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/android/fingerprint.py +0 -0
  97. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/android/manifest.py +0 -0
  98. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/android/nat.py +0 -0
  99. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/android/privacy.py +0 -0
  100. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/android/security.py +0 -0
  101. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/ios/__init__.py +0 -0
  102. {trueseeing-2.2.6 → trueseeing-2.2.7}/trueseeing/sig/ios/base.py +0 -0
@@ -3,16 +3,23 @@ run pip install flit
3
3
  copy . /tmp/build/
4
4
  run (cd /tmp/build && flit build)
5
5
 
6
+ from python:3.13-slim
7
+ run apt-get update -y && apt-get install -y git
8
+ run (cd /opt && git clone https://github.com/AloneMonkey/frida-ios-dump.git && cd frida-ios-dump && python3 -m venv .venv && .venv/bin/pip install -r ./requirements.txt)
9
+
6
10
  from python:3.13-slim
7
11
  run apt-get update -y && apt-get install -y openjdk-17-jre-headless zip adb
8
12
  run install -d -m 777 /data /ext /cache /out && ln -sfn /cache /root/.local
13
+ copy --from=1 /opt/frida-ios-dump /opt/frida-ios-dump
9
14
  copy --from=0 /tmp/build/dist/*.whl /tmp/dist/
10
15
  run pip install /tmp/dist/*.whl && rm -rf /tmp/dist /tmp/ext
11
- env PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
16
+ env PATH=/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin
12
17
  env TS2_IN_DOCKER=1
13
18
  env TS2_CACHEDIR=/cache
14
19
  env TS2_HOME=/data
15
20
  env TS2_EXTDIR=/ext
21
+ env TS2_FRIDA_IOS_DUMP_PATH=/opt/frida-ios-dump/dump.py
22
+ env TS2_FRIDA_IOS_DUMP_INTERP=/opt/frida-ios-dump/.venv/bin/python3
16
23
  env TS2_SWIFT_DEMANGLER_URL=http://ts2-swift-demangle
17
24
  workdir /out
18
25
  entrypoint ["trueseeing"]
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: trueseeing
3
- Version: 2.2.6
3
+ Version: 2.2.7
4
4
  Summary: Trueseeing is a non-decompiling iOS/Android application vulnerability scanner.
5
5
  Keywords: ios,android,security,pentest,hacking
6
6
  Author-email: Takahiro Yoshimura <alterakey@protonmail.com>
@@ -13,6 +13,7 @@ Classifier: Operating System :: POSIX :: BSD
13
13
  Classifier: Operating System :: MacOS :: MacOS X
14
14
  Classifier: Operating System :: Android
15
15
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
16
+ License-File: COPYING
16
17
  Requires-Dist: lxml~=5.0
17
18
  Requires-Dist: pyyaml~=6.0
18
19
  Requires-Dist: jinja2~=3.1
@@ -90,7 +91,7 @@ Alternatively, you can install our package with pip as follows. This form of ins
90
91
  You can interactively scan/analyze/patch/etc. apps -- making it the ideal choice for manual analysis:
91
92
 
92
93
  $ trueseeing target.apk
93
- [+] trueseeing 2.2.6
94
+ [+] trueseeing 2.2.7
94
95
  ts[target.apk]> ?
95
96
  ...
96
97
  ts[target.apk]> i # show generic information
@@ -323,7 +324,7 @@ class APKFileFormatHandler(FileFormatHandler):
323
324
  return APKFileFormatHandler()
324
325
 
325
326
  def get_formats(self) -> FormatMap:
326
- return {'apk2':dict(e=self._handle, r=r'\.apk$', d='sample file format')}
327
+ return {'apk2':dict(e=self._handle, r=r'\.apk$', d='sample file format', t=None)} # if this handler can suggest device context type, advertise at t
327
328
 
328
329
  def get_configs(self) -> ConfigMap:
329
330
  return dict()
@@ -55,7 +55,7 @@ Alternatively, you can install our package with pip as follows. This form of ins
55
55
  You can interactively scan/analyze/patch/etc. apps -- making it the ideal choice for manual analysis:
56
56
 
57
57
  $ trueseeing target.apk
58
- [+] trueseeing 2.2.6
58
+ [+] trueseeing 2.2.7
59
59
  ts[target.apk]> ?
60
60
  ...
61
61
  ts[target.apk]> i # show generic information
@@ -288,7 +288,7 @@ class APKFileFormatHandler(FileFormatHandler):
288
288
  return APKFileFormatHandler()
289
289
 
290
290
  def get_formats(self) -> FormatMap:
291
- return {'apk2':dict(e=self._handle, r=r'\.apk$', d='sample file format')}
291
+ return {'apk2':dict(e=self._handle, r=r'\.apk$', d='sample file format', t=None)} # if this handler can suggest device context type, advertise at t
292
292
 
293
293
  def get_configs(self) -> ConfigMap:
294
294
  return dict()
@@ -1,2 +1,2 @@
1
1
  """Trueseeing is a non-decompiling iOS/Android application vulnerability scanner."""
2
- __version__ = '2.2.6'
2
+ __version__ = '2.2.7'
@@ -54,6 +54,7 @@ if TYPE_CHECKING:
54
54
  e: FormatHandlerEntrypoint
55
55
  r: str
56
56
  d: str
57
+ t: Optional[Set[ContextType]]
57
58
 
58
59
  CommandMap = Mapping[str, CommandEntry]
59
60
  CommandPatternMap = Mapping[str, CommandPatternEntry]
@@ -24,6 +24,8 @@ class EngageCommand(CommandMixin):
24
24
  def get_commands(self) -> CommandMap:
25
25
  return {
26
26
  '!!!':dict(e=self._run_frida_shell, n='!!!', d='attach frida to the foreground process', t={'ipa'}),
27
+ 'xg':dict(e=self._engage_grab_package, n='xg[!] package [output.ipa]', d='engage: grab package', t={'ipa'}),
28
+ 'xg!':dict(e=self._engage_grab_package, t={'ipa'}),
27
29
  'xs':dict(e=self._engage_frida_attach, n='xs[!] [config]', d='engage: attach frida scripts (!: force)', t={'ipa'}),
28
30
  'xs!':dict(e=self._engage_frida_attach, t={'ipa'}),
29
31
  'xst':dict(e=self._engage_frida_trace_call, n='xst[!] [init.js]', d='engage: trace calls (!: force)', t={'ipa'}),
@@ -139,6 +141,60 @@ class EngageCommand(CommandMixin):
139
141
 
140
142
  ui.success("done ({t:.2f} sec.)".format(t=time() - at))
141
143
 
144
+ async def _engage_grab_package(self, args: deque[str]) -> None:
145
+ cmd = args.popleft()
146
+
147
+ import os
148
+ if not args:
149
+ ui.fatal('need the package name')
150
+
151
+ pkg = args.popleft()
152
+
153
+ if args:
154
+ outfn = args.popleft()
155
+ else:
156
+ outfn = f'{pkg}.ipa'
157
+
158
+ if os.path.exists(outfn):
159
+ if not cmd.endswith('!'):
160
+ ui.fatal('output file exists; force (!) to overwrite')
161
+ else:
162
+ os.remove(outfn)
163
+
164
+ from time import time
165
+ from tempfile import TemporaryDirectory
166
+ from trueseeing.core.ios.device import IOSDevice
167
+
168
+ dev = IOSDevice()
169
+ at = time()
170
+ outfn = os.path.realpath(outfn)
171
+
172
+ ui.info(f'grabbing package: {pkg} -> {outfn}')
173
+
174
+ with TemporaryDirectory() as td:
175
+ from os import chdir, getcwd
176
+ from trueseeing.core.env import get_frida_ios_dump_interp, get_frida_ios_dump_path
177
+ from shlex import quote
178
+ cd = getcwd()
179
+ try:
180
+ chdir(td)
181
+ from subprocess import CalledProcessError
182
+ try:
183
+ await dev.invoke_frida_passthru("{interp} {dump} -o t.ipa {name}".format(
184
+ interp=get_frida_ios_dump_interp(),
185
+ dump=get_frida_ios_dump_path(),
186
+ name=quote(pkg),
187
+ ))
188
+ except CalledProcessError:
189
+ ui.fatal('cannot attach to process')
190
+
191
+ from shutil import copy2
192
+ copy2('t.ipa', outfn)
193
+
194
+ ui.success('done ({t:.02f} sec)'.format(t=time() - at))
195
+ finally:
196
+ chdir(cd)
197
+
142
198
  def _get_context(self) -> IPAContext:
143
199
  return self._helper.get_context().require_type('ipa') # type:ignore[return-value]
144
200
 
@@ -452,7 +452,10 @@ class CommandHelperImpl:
452
452
  from trueseeing.core.exc import InvalidFileFormatError
453
453
  t = self.get_target()
454
454
  if not t:
455
- return None
455
+ try:
456
+ return self._opener.get_device_context_type()
457
+ except InvalidFileFormatError:
458
+ raise ui.fatal('invalid file type for device (try "apk" or "ipa", or not at all)')
456
459
  try:
457
460
  return self._opener.get_context(t).type
458
461
  except InvalidFileFormatError:
@@ -46,8 +46,8 @@ class Shell:
46
46
  parser.add_argument('--quiet', action='store_true', help='Be less verbose')
47
47
  parser.add_argument('-d', '--debug', action='store_true', help='Debug mode')
48
48
  parser.add_argument('-e', '--abort-on-errors', action='store_true', help='Abort on errors')
49
- parser.add_argument('-F', dest='force_opener', help='Open target as specified format')
50
- parser.add_argument('-n', dest='no_target', action='store_true', help='Run without target')
49
+ parser.add_argument('-F', dest='force_opener', metavar='FORMAT', help='Set file format')
50
+ parser.add_argument('-n', dest='no_target', action='store_true', help='Run without target (use -F for assuming device type)')
51
51
  args_mut0.add_argument('-i', dest='scriptfn', metavar='FILE', help='Run script file before prompt')
52
52
  args_mut0.add_argument('-c', dest='inline_cmd', metavar='COMMAND', help='Run commands before prompt')
53
53
  args_mut1.add_argument('-q', dest='mode', action='store_const', const='batch', help='Batch mode; quit instead of giving prompt')
@@ -53,6 +53,16 @@ class FileOpener:
53
53
  return c
54
54
  raise InvalidFileFormatError()
55
55
 
56
+ def get_device_context_type(self) -> Optional[Set[ContextType]]:
57
+ from trueseeing.core.exc import InvalidFileFormatError
58
+ if self._force_opener is None:
59
+ return None
60
+ if self._force_opener in self._formats:
61
+ t = self._formats[self._force_opener]['t']
62
+ if t is not None:
63
+ return t
64
+ raise InvalidFileFormatError()
65
+
56
66
  def get_formats(self) -> Iterator[Mapping[str, str]]:
57
67
  for k,v in self._formats.items():
58
68
  yield dict(n=k, d=v['d'])
@@ -61,9 +71,9 @@ class FileOpener:
61
71
  from trueseeing.core.ext import Extension
62
72
 
63
73
  self._formats.update({
64
- 'apk':dict(e=self._handle_apk, r=r'\.apk$', d='Android application package'),
65
- 'xapk':dict(e=self._handle_xapk, r=r'\.xapk$', d='Android appllication bundle'),
66
- 'ipa': dict(e=self._handle_ipa, r=r'\.ipa$', d='iOS application archive'),
74
+ 'apk':dict(e=self._handle_apk, r=r'\.apk$', d='Android application package', t={'apk','file'}),
75
+ 'xapk':dict(e=self._handle_xapk, r=r'\.xapk$', d='Android appllication bundle', t=None),
76
+ 'ipa': dict(e=self._handle_ipa, r=r'\.ipa$', d='iOS application archive', t={'ipa', 'file'}),
67
77
  })
68
78
 
69
79
  for clazz in Extension.get().get_fileformathandlers():
@@ -80,6 +80,19 @@ def get_device_frida_dir(package_name: str) -> str:
80
80
  def get_swift_demangler_url() -> str:
81
81
  return os.environ.get('TS2_SWIFT_DEMANGLER_URL', 'http://127.0.0.1:8000')
82
82
 
83
+ @cache
84
+ def get_frida_ios_dump_interp() -> str:
85
+ from sys import executable
86
+ return os.environ.get('TS2_FRIDA_IOS_DUMP_INTERP', executable) # XXX
87
+
88
+ @cache
89
+ def get_frida_ios_dump_path() -> str:
90
+ try:
91
+ return os.environ['TS2_FRIDA_IOS_DUMP_PATH']
92
+ except KeyError:
93
+ from trueseeing.core.ui import ui
94
+ ui.fatal('need frida-ios-dump (try setting TS2_FRIDA_IOS_DUMP_PATH to the path to its dump.py)') # XXX
95
+
83
96
  @cache
84
97
  def get_cpu_count() -> int:
85
98
  from os import cpu_count
File without changes
File without changes
File without changes
File without changes