dissect.target 3.15.dev27__py3-none-any.whl → 3.15.dev28__py3-none-any.whl

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.
@@ -13,7 +13,6 @@ from typing import (
13
13
  BinaryIO,
14
14
  Callable,
15
15
  Iterator,
16
- List,
17
16
  Optional,
18
17
  Type,
19
18
  Union,
@@ -217,7 +216,7 @@ class Filesystem:
217
216
  """
218
217
  return self.get(path).scandir()
219
218
 
220
- def listdir(self, path: str) -> List[str]:
219
+ def listdir(self, path: str) -> list[str]:
221
220
  """List the contents of a directory as strings.
222
221
 
223
222
  Args:
@@ -228,7 +227,7 @@ class Filesystem:
228
227
  """
229
228
  return list(self.iterdir(path))
230
229
 
231
- def listdir_ext(self, path: str) -> List[FilesystemEntry]:
230
+ def listdir_ext(self, path: str) -> list[FilesystemEntry]:
232
231
  """List the contents of a directory as FilesystemEntry's.
233
232
 
234
233
  Args:
@@ -487,7 +486,7 @@ class Filesystem:
487
486
  """
488
487
  return self.get(path).sha256()
489
488
 
490
- def hash(self, path: str, algos: Optional[Union[List[str], List[Callable]]] = None) -> tuple[str]:
489
+ def hash(self, path: str, algos: Optional[Union[list[str], list[Callable]]] = None) -> tuple[str]:
491
490
  """Calculate the digest of the contents of ``path``, using the ``algos`` algorithms.
492
491
 
493
492
  Args:
@@ -574,7 +573,7 @@ class FilesystemEntry:
574
573
  """
575
574
  raise NotImplementedError()
576
575
 
577
- def listdir(self) -> List[str]:
576
+ def listdir(self) -> list[str]:
578
577
  """List the contents of a directory as strings.
579
578
 
580
579
  Returns:
@@ -582,7 +581,7 @@ class FilesystemEntry:
582
581
  """
583
582
  return list(self.iterdir())
584
583
 
585
- def listdir_ext(self) -> List[FilesystemEntry]:
584
+ def listdir_ext(self) -> list[FilesystemEntry]:
586
585
  """List the contents of a directory as FilesystemEntry's.
587
586
 
588
587
  Returns:
@@ -823,7 +822,7 @@ class FilesystemEntry:
823
822
  """
824
823
  return hashutil.sha256(self.open())
825
824
 
826
- def hash(self, algos: Optional[Union[List[str], List[Callable]]] = None) -> tuple[str]:
825
+ def hash(self, algos: Optional[Union[list[str], list[Callable]]] = None) -> tuple[str]:
827
826
  """Calculate the digest of this entry, using the ``algos`` algorithms.
828
827
 
829
828
  Args:
dissect/target/target.py CHANGED
@@ -225,7 +225,10 @@ class Target:
225
225
 
226
226
  loader_cls = loader.find_loader(path, parsed_path=parsed_path)
227
227
  if loader_cls:
228
- loader_instance = loader_cls(path, parsed_path=parsed_path)
228
+ try:
229
+ loader_instance = loader_cls(path, parsed_path=parsed_path)
230
+ except Exception as e:
231
+ raise TargetError(f"Failed to initiate {loader_cls.__name__} for target {path}: {e}", cause=e)
229
232
  return cls._load(path, loader_instance)
230
233
  return cls.open_raw(path)
231
234
 
@@ -281,7 +284,8 @@ class Target:
281
284
  try:
282
285
  ldr = loader_cls(sub_entry, parsed_path=parsed_path)
283
286
  except Exception as e:
284
- getlogger(sub_entry).error("Failed to initiate loader", exc_info=e)
287
+ getlogger(sub_entry).error("Failed to initiate loader: %s", e)
288
+ getlogger(sub_entry).debug("", exc_info=e)
285
289
  continue
286
290
 
287
291
  try:
@@ -9,6 +9,7 @@ import sys
9
9
  from dissect.util.stream import RangeStream
10
10
 
11
11
  from dissect.target import Target
12
+ from dissect.target.exceptions import TargetError
12
13
  from dissect.target.tools.utils import (
13
14
  catch_sigpipe,
14
15
  configure_generic_arguments,
@@ -39,7 +40,12 @@ def main():
39
40
 
40
41
  process_generic_arguments(args)
41
42
 
42
- t = Target.open(args.target)
43
+ try:
44
+ t = Target.open(args.target)
45
+ except TargetError as e:
46
+ log.error(e)
47
+ log.debug("", exc_info=e)
48
+ parser.exit(1)
43
49
 
44
50
  if len(t.disks) > 1:
45
51
  parser.exit("Target has more than one disk")
@@ -10,6 +10,7 @@ import shutil
10
10
  import sys
11
11
 
12
12
  from dissect.target import Target
13
+ from dissect.target.exceptions import TargetError
13
14
  from dissect.target.helpers.fsutil import TargetPath
14
15
  from dissect.target.tools.utils import (
15
16
  catch_sigpipe,
@@ -113,7 +114,13 @@ def main():
113
114
 
114
115
  process_generic_arguments(args)
115
116
 
116
- target = Target.open(args.target)
117
+ try:
118
+ target = Target.open(args.target)
119
+ except TargetError as e:
120
+ log.error(e)
121
+ log.debug("", exc_info=e)
122
+ parser.exit(1)
123
+
117
124
  path = target.fs.path(args.path)
118
125
 
119
126
  if not path.exists():
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  from typing import Union
9
9
 
10
10
  from dissect.target import Target
11
+ from dissect.target.exceptions import TargetError
11
12
  from dissect.target.helpers.record import TargetRecordDescriptor
12
13
  from dissect.target.tools.query import record_output
13
14
  from dissect.target.tools.utils import (
@@ -72,22 +73,27 @@ def main():
72
73
  targets = targets[:-1]
73
74
  args.targets = targets
74
75
 
75
- for i, target in enumerate(Target.open_all(args.targets)):
76
- try:
77
- if args.jsonlines:
78
- print(json.dumps(get_target_info(target), default=str))
79
- elif args.json:
80
- print(json.dumps(get_target_info(target), indent=4, default=str))
81
- elif args.record:
82
- rs = record_output(args.strings)
83
- rs.write(InfoRecord(**get_target_info(target), _target=target))
84
- else:
85
- if i > 0:
86
- print("-" * 70)
87
- print_target_info(target)
88
- except Exception as e:
89
- target.log.error("Exception in retrieving information for target: `%s`. Use `-vv` for details.", target)
90
- target.log.debug("", exc_info=e)
76
+ try:
77
+ for i, target in enumerate(Target.open_all(args.targets)):
78
+ try:
79
+ if args.jsonlines:
80
+ print(json.dumps(get_target_info(target), default=str))
81
+ elif args.json:
82
+ print(json.dumps(get_target_info(target), indent=4, default=str))
83
+ elif args.record:
84
+ rs = record_output(args.strings)
85
+ rs.write(InfoRecord(**get_target_info(target), _target=target))
86
+ else:
87
+ if i > 0:
88
+ print("-" * 70)
89
+ print_target_info(target)
90
+ except Exception as e:
91
+ target.log.error("Exception in retrieving information for target: `%s`. Use `-vv` for details.", target)
92
+ target.log.debug("", exc_info=e)
93
+ except TargetError as e:
94
+ log.error(e)
95
+ log.debug("", exc_info=e)
96
+ parser.exit(1)
91
97
 
92
98
 
93
99
  def get_target_info(target: Target) -> dict[str, Union[str, list[str]]]:
@@ -3,6 +3,7 @@ import logging
3
3
  from typing import Union
4
4
 
5
5
  from dissect.target import Target, filesystem
6
+ from dissect.target.exceptions import TargetError
6
7
  from dissect.target.helpers.utils import parse_options_string
7
8
  from dissect.target.tools.utils import (
8
9
  catch_sigpipe,
@@ -44,7 +45,13 @@ def main():
44
45
  if not HAS_FUSE:
45
46
  parser.exit("fusepy is not installed: pip install fusepy")
46
47
 
47
- t = Target.open(args.target)
48
+ try:
49
+ t = Target.open(args.target)
50
+ except TargetError as e:
51
+ log.error(e)
52
+ log.debug("", exc_info=e)
53
+ parser.exit(1)
54
+
48
55
  vfs = filesystem.VirtualFilesystem()
49
56
  vfs.mount("fs", t.fs)
50
57
 
@@ -14,6 +14,7 @@ from dissect.target import Target
14
14
  from dissect.target.exceptions import (
15
15
  FatalError,
16
16
  PluginNotFoundError,
17
+ TargetError,
17
18
  UnsupportedPluginError,
18
19
  )
19
20
  from dissect.target.helpers import cache, record_modifier
@@ -254,148 +255,152 @@ def main():
254
255
  execution_report.set_cli_args(args)
255
256
  execution_report.set_event_callbacks(Target)
256
257
 
257
- for target in Target.open_all(targets, args.children):
258
- if args.child:
259
- try:
260
- target = target.open_child(args.child)
261
- except Exception:
262
- target.log.exception("Exception while opening child '%s'", args.child)
263
-
264
- if args.dry_run:
265
- print(f"Dry run on: {target}")
266
-
267
- record_entries = []
268
- basic_entries = []
269
- yield_entries = []
270
-
271
- # Keep a set of plugins that were already executed on the target.
272
- executed_plugins = set()
273
-
274
- first_seen_output_type = default_output_type
275
- cli_params_unparsed = rest
276
-
277
- func_defs, _ = find_plugin_functions(target, args.function, compatibility=False)
278
- excluded_funcs, _ = find_plugin_functions(target, args.excluded_functions, compatibility=False)
279
- excluded_func_paths = {excluded_func.path for excluded_func in excluded_funcs}
280
-
281
- for func_def in func_defs:
282
- if func_def.path in excluded_func_paths:
283
- continue
284
-
285
- # Avoid executing same plugin for multiple OSes (like hostname)
286
- if func_def.name in executed_plugins:
287
- continue
288
- executed_plugins.add(func_def.name)
289
-
290
- # If the default type is record (meaning we skip everything else)
291
- # and actual output type is not record, continue.
292
- # We perform this check here because plugins that require output files/dirs
293
- # will exit if we attempt to exec them without (because they are implied by the wildcard).
294
- # Also this saves cycles of course.
295
- if default_output_type == "record" and func_def.output_type != "record":
296
- continue
258
+ try:
259
+ for target in Target.open_all(targets, args.children):
260
+ if args.child:
261
+ try:
262
+ target = target.open_child(args.child)
263
+ except Exception:
264
+ target.log.exception("Exception while opening child '%s'", args.child)
297
265
 
298
266
  if args.dry_run:
299
- print(f" execute: {func_def.name} ({func_def.path})")
300
- continue
301
-
302
- try:
303
- output_type, result, cli_params_unparsed = execute_function_on_target(
304
- target, func_def, cli_params_unparsed
305
- )
306
- except UnsupportedPluginError as e:
307
- target.log.error(
308
- "Unsupported plugin for %s: %s",
309
- func_def.name,
310
- e.root_cause_str(),
311
- )
312
-
313
- target.log.debug("%s", func_def, exc_info=e)
314
- continue
315
- except PluginNotFoundError:
316
- target.log.error("Cannot find plugin `%s`", func_def)
317
- continue
318
- except FatalError as fatal:
319
- fatal.emit_last_message(target.log.error)
320
- parser.exit(1)
321
- except Exception:
322
- target.log.error("Exception while executing function `%s`", func_def, exc_info=True)
323
- continue
324
-
325
- if first_seen_output_type and output_type != first_seen_output_type:
326
- target.log.error(
327
- (
328
- "Can't mix functions that generate different outputs: output type `%s` from `%s` "
329
- "does not match first seen output `%s`."
330
- ),
331
- output_type,
332
- func_def,
333
- first_seen_output_type,
334
- )
335
- parser.exit()
336
-
337
- if not first_seen_output_type:
338
- first_seen_output_type = output_type
339
-
340
- if output_type == "record":
341
- record_entries.append(result)
342
- elif output_type == "yield":
343
- yield_entries.append(result)
344
- elif output_type == "none":
345
- target.log.info("No result for function `%s` (output type is set to 'none')", func_def)
346
- continue
347
- else:
348
- basic_entries.append(result)
349
-
350
- # Write basic functions
351
- if len(basic_entries) > 0:
352
- basic_entries_delim = args.delimiter.join(map(str, basic_entries))
353
- if not args.cmdb:
354
- print(f"{target} {basic_entries_delim}")
355
- else:
356
- print(f"{target.path}{args.delimiter}{basic_entries_delim}")
267
+ print(f"Dry run on: {target}")
268
+
269
+ record_entries = []
270
+ basic_entries = []
271
+ yield_entries = []
272
+
273
+ # Keep a set of plugins that were already executed on the target.
274
+ executed_plugins = set()
275
+
276
+ first_seen_output_type = default_output_type
277
+ cli_params_unparsed = rest
278
+
279
+ func_defs, _ = find_plugin_functions(target, args.function, compatibility=False)
280
+ excluded_funcs, _ = find_plugin_functions(target, args.excluded_functions, compatibility=False)
281
+ excluded_func_paths = {excluded_func.path for excluded_func in excluded_funcs}
282
+
283
+ for func_def in func_defs:
284
+ if func_def.path in excluded_func_paths:
285
+ continue
286
+
287
+ # Avoid executing same plugin for multiple OSes (like hostname)
288
+ if func_def.name in executed_plugins:
289
+ continue
290
+ executed_plugins.add(func_def.name)
291
+
292
+ # If the default type is record (meaning we skip everything else)
293
+ # and actual output type is not record, continue.
294
+ # We perform this check here because plugins that require output files/dirs
295
+ # will exit if we attempt to exec them without (because they are implied by the wildcard).
296
+ # Also this saves cycles of course.
297
+ if default_output_type == "record" and func_def.output_type != "record":
298
+ continue
299
+
300
+ if args.dry_run:
301
+ print(f" execute: {func_def.name} ({func_def.path})")
302
+ continue
303
+
304
+ try:
305
+ output_type, result, cli_params_unparsed = execute_function_on_target(
306
+ target, func_def, cli_params_unparsed
307
+ )
308
+ except UnsupportedPluginError as e:
309
+ target.log.error(
310
+ "Unsupported plugin for %s: %s",
311
+ func_def.name,
312
+ e.root_cause_str(),
313
+ )
314
+
315
+ target.log.debug("%s", func_def, exc_info=e)
316
+ continue
317
+ except PluginNotFoundError:
318
+ target.log.error("Cannot find plugin `%s`", func_def)
319
+ continue
320
+ except FatalError as fatal:
321
+ fatal.emit_last_message(target.log.error)
322
+ parser.exit(1)
323
+ except Exception:
324
+ target.log.error("Exception while executing function `%s`", func_def, exc_info=True)
325
+ continue
326
+
327
+ if first_seen_output_type and output_type != first_seen_output_type:
328
+ target.log.error(
329
+ (
330
+ "Can't mix functions that generate different outputs: output type `%s` from `%s` "
331
+ "does not match first seen output `%s`."
332
+ ),
333
+ output_type,
334
+ func_def,
335
+ first_seen_output_type,
336
+ )
337
+ parser.exit()
338
+
339
+ if not first_seen_output_type:
340
+ first_seen_output_type = output_type
341
+
342
+ if output_type == "record":
343
+ record_entries.append(result)
344
+ elif output_type == "yield":
345
+ yield_entries.append(result)
346
+ elif output_type == "none":
347
+ target.log.info("No result for function `%s` (output type is set to 'none')", func_def)
348
+ continue
349
+ else:
350
+ basic_entries.append(result)
357
351
 
358
- # Write yield functions
359
- for entry in yield_entries:
360
- for e in entry:
361
- print(e)
352
+ # Write basic functions
353
+ if len(basic_entries) > 0:
354
+ basic_entries_delim = args.delimiter.join(map(str, basic_entries))
355
+ if not args.cmdb:
356
+ print(f"{target} {basic_entries_delim}")
357
+ else:
358
+ print(f"{target.path}{args.delimiter}{basic_entries_delim}")
362
359
 
363
- # Write records
364
- count = 0
365
- break_out = False
360
+ # Write yield functions
361
+ for entry in yield_entries:
362
+ for e in entry:
363
+ print(e)
366
364
 
367
- modifier_type = None
365
+ # Write records
366
+ count = 0
367
+ break_out = False
368
368
 
369
- if args.resolve:
370
- modifier_type = record_modifier.Modifier.RESOLVE
369
+ modifier_type = None
371
370
 
372
- if args.hash:
373
- modifier_type = record_modifier.Modifier.HASH
371
+ if args.resolve:
372
+ modifier_type = record_modifier.Modifier.RESOLVE
374
373
 
375
- modifier_func = record_modifier.get_modifier_function(modifier_type)
374
+ if args.hash:
375
+ modifier_type = record_modifier.Modifier.HASH
376
376
 
377
- if not len(record_entries):
378
- continue
377
+ modifier_func = record_modifier.get_modifier_function(modifier_type)
379
378
 
380
- rs = record_output(args.strings, args.json)
381
- for entry in record_entries:
382
- try:
383
- for record_entries in entry:
384
- rs.write(modifier_func(target, record_entries))
385
- count += 1
386
- if args.limit is not None and count >= args.limit:
387
- break_out = True
388
- break
389
- except Exception as e:
390
- # Ignore errors if multiple functions
391
- if len(funcs) > 1:
392
- target.log.error(f"Exception occurred while processing output of {func}", exc_info=e)
393
- pass
394
- else:
395
- raise e
379
+ if not record_entries:
380
+ continue
396
381
 
397
- if break_out:
398
- break
382
+ rs = record_output(args.strings, args.json)
383
+ for entry in record_entries:
384
+ try:
385
+ for record_entries in entry:
386
+ rs.write(modifier_func(target, record_entries))
387
+ count += 1
388
+ if args.limit is not None and count >= args.limit:
389
+ break_out = True
390
+ break
391
+ except Exception as e:
392
+ # Ignore errors if multiple functions
393
+ if len(funcs) > 1:
394
+ target.log.error(f"Exception occurred while processing output of {func}", exc_info=e)
395
+ else:
396
+ raise e
397
+
398
+ if break_out:
399
+ break
400
+ except TargetError as e:
401
+ log.error(e)
402
+ log.debug("", exc_info=e)
403
+ parser.exit(1)
399
404
 
400
405
  timestamp = datetime.utcnow()
401
406
 
@@ -6,7 +6,7 @@ import argparse
6
6
  import logging
7
7
 
8
8
  from dissect.target import Target
9
- from dissect.target.exceptions import RegistryError
9
+ from dissect.target.exceptions import RegistryError, TargetError
10
10
  from dissect.target.tools.utils import (
11
11
  catch_sigpipe,
12
12
  configure_generic_arguments,
@@ -36,23 +36,28 @@ def main():
36
36
 
37
37
  process_generic_arguments(args)
38
38
 
39
- for target in Target.open_all(args.targets):
40
- try:
41
- if args.value:
42
- for key in target.registry.keys(args.key):
39
+ try:
40
+ for target in Target.open_all(args.targets):
41
+ try:
42
+ if args.value:
43
+ for key in target.registry.keys(args.key):
44
+ try:
45
+ print(key.value(args.value))
46
+ except RegistryError:
47
+ continue
48
+ else:
43
49
  try:
44
- print(key.value(args.value))
50
+ print(target)
51
+ for key in target.registry.keys(args.key):
52
+ recursor(key, args.depth, 0)
45
53
  except RegistryError:
46
- continue
47
- else:
48
- try:
49
- print(target)
50
- for key in target.registry.keys(args.key):
51
- recursor(key, args.depth, 0)
52
- except RegistryError:
53
- log.exception("Failed to find registry value")
54
- except Exception:
55
- log.exception("Failed to iterate key")
54
+ log.exception("Failed to find registry value")
55
+ except Exception:
56
+ log.exception("Failed to iterate key")
57
+ except TargetError as e:
58
+ log.error(e)
59
+ log.debug("", exc_info=e)
60
+ parser.exit(1)
56
61
 
57
62
 
58
63
  def recursor(key, depth, indent):
@@ -29,6 +29,7 @@ from dissect.target.exceptions import (
29
29
  RegistryError,
30
30
  RegistryKeyNotFoundError,
31
31
  RegistryValueNotFoundError,
32
+ TargetError,
32
33
  )
33
34
  from dissect.target.filesystem import FilesystemEntry, RootFilesystemEntry
34
35
  from dissect.target.helpers import cyber, fsutil, regutil
@@ -1233,7 +1234,11 @@ def main() -> None:
1233
1234
  if args.quiet:
1234
1235
  logging.getLogger("dissect").setLevel(level=logging.ERROR)
1235
1236
 
1236
- open_shell(args.targets, args.python, args.registry)
1237
+ try:
1238
+ open_shell(args.targets, args.python, args.registry)
1239
+ except TargetError as e:
1240
+ log.error(e)
1241
+ log.debug("", exc_info=e)
1237
1242
 
1238
1243
 
1239
1244
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.15.dev27
3
+ Version: 3.15.dev28
4
4
  Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License: Affero General Public License v3
@@ -1,11 +1,11 @@
1
1
  dissect/target/__init__.py,sha256=Oc7ounTgq2hE4nR6YcNabetc7SQA40ldSa35VEdZcQU,63
2
2
  dissect/target/container.py,sha256=9ixufT1_0WhraqttBWwQjG80caToJqvCX8VjFk8d5F0,9307
3
3
  dissect/target/exceptions.py,sha256=VVW_Rq_vQinapz-2mbJ3UkxBEZpb2pE_7JlhMukdtrY,2877
4
- dissect/target/filesystem.py,sha256=jbHXWjknRHvtnJ8uAJFHPztEiwznJGVRGHQZvdLNn7Y,53886
4
+ dissect/target/filesystem.py,sha256=aLkvZMgeah39Nhlscawh77cm2mzFYI9J5h3uT3Rigtc,53876
5
5
  dissect/target/loader.py,sha256=0-LcZNi7S0qsXR7XGtrzxpuCh9BsLcqNR1T15O7SnBM,7257
6
6
  dissect/target/plugin.py,sha256=-ME1mkgsnVGlgACFWjM_4DyQ230toCMuh6tPJshSLsw,48112
7
7
  dissect/target/report.py,sha256=06uiP4MbNI8cWMVrC1SasNS-Yg6ptjVjckwj8Yhe0Js,7958
8
- dissect/target/target.py,sha256=CuqLTD3fwr4HIxtDgN_fwJ3UHSqe5PhNJlLTVGsluB8,31908
8
+ dissect/target/target.py,sha256=1mj4VoDmFZ2d8oXWKVQ-zBK-gXzr0lop6ytQ8E-8GH0,32137
9
9
  dissect/target/volume.py,sha256=aQZAJiny8jjwkc9UtwIRwy7nINXjCxwpO-_UDfh6-BA,15801
10
10
  dissect/target/containers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  dissect/target/containers/asdf.py,sha256=DJp0QEFwUjy2MFwKYcYqIR_BS1fQT1Yi9Kcmqt0aChM,1366
@@ -297,14 +297,14 @@ dissect/target/plugins/os/windows/task_helpers/tasks_records.py,sha256=vpCyKqLQS
297
297
  dissect/target/plugins/os/windows/task_helpers/tasks_xml.py,sha256=oOsYse2-BrliVQRXlHD1-89hsmNrJqg42DJy681AW0U,15268
298
298
  dissect/target/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
299
  dissect/target/tools/build_pluginlist.py,sha256=5fomcuMwsVzcnYx5Htf5f9lSwsLeUUvomLUXNA4t7m4,849
300
- dissect/target/tools/dd.py,sha256=Nlh2CFOCV0ksxyedFp7BuyoQ3tBFi6rK6UO0_k5GR_8,1758
301
- dissect/target/tools/fs.py,sha256=IL71ntXA_oS92l0NPpqyOVrHOZ-bf3qag1amZzAaeHc,3548
302
- dissect/target/tools/info.py,sha256=wgLBn8Vj-In8HtqBDOQYD4FXThKkrEVXudopMHuY3KI,5231
300
+ dissect/target/tools/dd.py,sha256=rTM-lgXxrYBpVAtJqFqAatDz45bLoD8-mFt_59Q3Lio,1928
301
+ dissect/target/tools/fs.py,sha256=cizCrW8rqdpT1irA8g6mslkaXX7CynWVQ7fvRUrcxNU,3719
302
+ dissect/target/tools/info.py,sha256=3smHr8I71yj3kCjsQ5nXkOHI9T_N8UwvkVa1CNOxB-s,5461
303
303
  dissect/target/tools/logging.py,sha256=5ZnumtMWLyslxfrUGZ4ntRyf3obOOhmn8SBjKfdLcEg,4174
304
- dissect/target/tools/mount.py,sha256=m6Ise8H82jgIW2FN0hXKO4l9t3emKiOi55O4LyEqvxk,2581
305
- dissect/target/tools/query.py,sha256=WUKAGl-TbNuCQ3cvaiZr_7gkA7VdRfL6a_algc0bfL0,15447
306
- dissect/target/tools/reg.py,sha256=ZB5WDmKfiDvs988kHZVyzF-RIoDLXcXuvdLjuEYvDi4,2181
307
- dissect/target/tools/shell.py,sha256=m-XypYGePuNv5GcBvWJxXMsq9UvEPgVyZ0QJl8W4jqE,43137
304
+ dissect/target/tools/mount.py,sha256=4qyejisU0TH9iKB9hLe9Wxri1lT_dcDPkuwwt9AQ8oY,2752
305
+ dissect/target/tools/query.py,sha256=1LbvUKSmXOCMb4xqP3t86JkOgFzKlc7mLCqcczfLht8,16018
306
+ dissect/target/tools/reg.py,sha256=tII0MLqJ-3lOt7jE-zHUDqYrk0P4euPjiSS_99FT6LE,2378
307
+ dissect/target/tools/shell.py,sha256=EBRNKiIV3ljaXKAXraA6DmrIw8Cy5h9irAuwlblP3zo,43251
308
308
  dissect/target/tools/utils.py,sha256=bhVZ3-8YynpHkBl4m1T4IpSpCArAXnEjjYwAFGW5JPg,10595
309
309
  dissect/target/tools/dump/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
310
  dissect/target/tools/dump/run.py,sha256=yHn9xl_VjasgiuLpjtZdnLW32QCbkwHfnnTPY6Ck_aw,9689
@@ -318,10 +318,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
318
318
  dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
319
319
  dissect/target/volumes/md.py,sha256=j1K1iKmspl0C_OJFc7-Q1BMWN2OCC5EVANIgVlJ_fIE,1673
320
320
  dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
321
- dissect.target-3.15.dev27.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
322
- dissect.target-3.15.dev27.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
323
- dissect.target-3.15.dev27.dist-info/METADATA,sha256=YfmgWD2QIDnunICFylG-1EotMjyF4BgIlGKnccApr20,11113
324
- dissect.target-3.15.dev27.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
325
- dissect.target-3.15.dev27.dist-info/entry_points.txt,sha256=tvFPa-Ap-gakjaPwRc6Fl6mxHzxEZ_arAVU-IUYeo_s,447
326
- dissect.target-3.15.dev27.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
327
- dissect.target-3.15.dev27.dist-info/RECORD,,
321
+ dissect.target-3.15.dev28.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
322
+ dissect.target-3.15.dev28.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
323
+ dissect.target-3.15.dev28.dist-info/METADATA,sha256=1Qg1LKAgTAEyjK5_QtDXzreQog_6XIGFcpOFKWRjm3o,11113
324
+ dissect.target-3.15.dev28.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
325
+ dissect.target-3.15.dev28.dist-info/entry_points.txt,sha256=tvFPa-Ap-gakjaPwRc6Fl6mxHzxEZ_arAVU-IUYeo_s,447
326
+ dissect.target-3.15.dev28.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
327
+ dissect.target-3.15.dev28.dist-info/RECORD,,