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.
- dissect/target/filesystem.py +6 -7
- dissect/target/target.py +6 -2
- dissect/target/tools/dd.py +7 -1
- dissect/target/tools/fs.py +8 -1
- dissect/target/tools/info.py +22 -16
- dissect/target/tools/mount.py +8 -1
- dissect/target/tools/query.py +136 -131
- dissect/target/tools/reg.py +21 -16
- dissect/target/tools/shell.py +6 -1
- {dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/METADATA +1 -1
- {dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/RECORD +16 -16
- {dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/COPYRIGHT +0 -0
- {dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/LICENSE +0 -0
- {dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/WHEEL +0 -0
- {dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/entry_points.txt +0 -0
- {dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/top_level.txt +0 -0
dissect/target/filesystem.py
CHANGED
@@ -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) ->
|
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) ->
|
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[
|
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) ->
|
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) ->
|
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[
|
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
|
-
|
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",
|
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:
|
dissect/target/tools/dd.py
CHANGED
@@ -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
|
-
|
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")
|
dissect/target/tools/fs.py
CHANGED
@@ -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
|
-
|
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():
|
dissect/target/tools/info.py
CHANGED
@@ -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
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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]]]:
|
dissect/target/tools/mount.py
CHANGED
@@ -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
|
-
|
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
|
|
dissect/target/tools/query.py
CHANGED
@@ -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
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
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"
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
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
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
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
|
-
|
364
|
-
|
365
|
-
|
360
|
+
# Write yield functions
|
361
|
+
for entry in yield_entries:
|
362
|
+
for e in entry:
|
363
|
+
print(e)
|
366
364
|
|
367
|
-
|
365
|
+
# Write records
|
366
|
+
count = 0
|
367
|
+
break_out = False
|
368
368
|
|
369
|
-
|
370
|
-
modifier_type = record_modifier.Modifier.RESOLVE
|
369
|
+
modifier_type = None
|
371
370
|
|
372
|
-
|
373
|
-
|
371
|
+
if args.resolve:
|
372
|
+
modifier_type = record_modifier.Modifier.RESOLVE
|
374
373
|
|
375
|
-
|
374
|
+
if args.hash:
|
375
|
+
modifier_type = record_modifier.Modifier.HASH
|
376
376
|
|
377
|
-
|
378
|
-
continue
|
377
|
+
modifier_func = record_modifier.get_modifier_function(modifier_type)
|
379
378
|
|
380
|
-
|
381
|
-
|
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
|
-
|
398
|
-
|
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
|
|
dissect/target/tools/reg.py
CHANGED
@@ -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
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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(
|
50
|
+
print(target)
|
51
|
+
for key in target.registry.keys(args.key):
|
52
|
+
recursor(key, args.depth, 0)
|
45
53
|
except RegistryError:
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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):
|
dissect/target/tools/shell.py
CHANGED
@@ -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
|
-
|
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.
|
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=
|
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=
|
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=
|
301
|
-
dissect/target/tools/fs.py,sha256=
|
302
|
-
dissect/target/tools/info.py,sha256=
|
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=
|
305
|
-
dissect/target/tools/query.py,sha256=
|
306
|
-
dissect/target/tools/reg.py,sha256=
|
307
|
-
dissect/target/tools/shell.py,sha256=
|
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.
|
322
|
-
dissect.target-3.15.
|
323
|
-
dissect.target-3.15.
|
324
|
-
dissect.target-3.15.
|
325
|
-
dissect.target-3.15.
|
326
|
-
dissect.target-3.15.
|
327
|
-
dissect.target-3.15.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
{dissect.target-3.15.dev27.dist-info → dissect.target-3.15.dev28.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|