dissect.target 3.15.dev27__py3-none-any.whl → 3.15.dev28__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|