dissect.target 3.19.dev33__py3-none-any.whl → 3.19.dev35__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/helpers/config.py +22 -7
- dissect/target/plugins/filesystem/yara.py +1 -1
- dissect/target/target.py +3 -2
- dissect/target/tools/shell.py +34 -2
- {dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/METADATA +1 -1
- {dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/RECORD +11 -11
- {dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/COPYRIGHT +0 -0
- {dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/LICENSE +0 -0
- {dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/WHEEL +0 -0
- {dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/entry_points.txt +0 -0
- {dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/top_level.txt +0 -0
dissect/target/helpers/config.py
CHANGED
@@ -1,27 +1,35 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import ast
|
2
4
|
import importlib.machinery
|
3
5
|
import importlib.util
|
4
6
|
import logging
|
5
7
|
from pathlib import Path
|
6
8
|
from types import ModuleType
|
7
|
-
from typing import Optional, Union
|
8
9
|
|
9
10
|
log = logging.getLogger(__name__)
|
10
11
|
|
11
12
|
CONFIG_NAME = ".targetcfg.py"
|
12
13
|
|
13
14
|
|
14
|
-
def load(
|
15
|
+
def load(paths: list[Path | str] | Path | str | None) -> ModuleType:
|
16
|
+
"""Attempt to load one configuration from the provided path(s)."""
|
17
|
+
|
18
|
+
if isinstance(paths, Path) or isinstance(paths, str):
|
19
|
+
paths = [paths]
|
20
|
+
|
15
21
|
config_spec = importlib.machinery.ModuleSpec("config", None)
|
16
22
|
config = importlib.util.module_from_spec(config_spec)
|
17
|
-
config_file = _find_config_file(
|
23
|
+
config_file = _find_config_file(paths)
|
24
|
+
|
18
25
|
if config_file:
|
19
26
|
config_values = _parse_ast(config_file.read_bytes())
|
20
27
|
config.__dict__.update(config_values)
|
28
|
+
|
21
29
|
return config
|
22
30
|
|
23
31
|
|
24
|
-
def _parse_ast(code: str) -> dict[str,
|
32
|
+
def _parse_ast(code: str) -> dict[str, str | int]:
|
25
33
|
# Only allow basic value assignments for backwards compatibility
|
26
34
|
obj = {}
|
27
35
|
|
@@ -49,15 +57,19 @@ def _parse_ast(code: str) -> dict[str, Union[str, int]]:
|
|
49
57
|
return obj
|
50
58
|
|
51
59
|
|
52
|
-
def _find_config_file(
|
53
|
-
"""Find a config file anywhere in the given path and return it.
|
60
|
+
def _find_config_file(paths: list[Path | str] | None) -> Path | None:
|
61
|
+
"""Find a config file anywhere in the given path(s) and return it.
|
54
62
|
|
55
63
|
This algorithm allows parts of the path to not exist or the last part to be a filename.
|
56
64
|
It also does not look in the root directory ('/') for config files.
|
57
65
|
"""
|
58
66
|
|
67
|
+
if not paths:
|
68
|
+
return
|
69
|
+
|
59
70
|
config_file = None
|
60
|
-
|
71
|
+
|
72
|
+
for path in paths:
|
61
73
|
path = Path(path)
|
62
74
|
cur_path = path.absolute()
|
63
75
|
|
@@ -69,4 +81,7 @@ def _find_config_file(path: Optional[Union[Path, str]]) -> Optional[Path]:
|
|
69
81
|
config_file = cur_config
|
70
82
|
cur_path = cur_path.parent
|
71
83
|
|
84
|
+
if config_file:
|
85
|
+
break
|
86
|
+
|
72
87
|
return config_file
|
@@ -45,7 +45,7 @@ class YaraPlugin(Plugin):
|
|
45
45
|
|
46
46
|
@arg("-r", "--rules", required=True, nargs="*", help="path(s) to YARA rule file(s) or folder(s)")
|
47
47
|
@arg("-p", "--path", default="/", help="path on target(s) to recursively scan")
|
48
|
-
@arg("-m", "--max-size", default=DEFAULT_MAX_SCAN_SIZE, help="maximum file size in bytes to scan")
|
48
|
+
@arg("-m", "--max-size", type=int, default=DEFAULT_MAX_SCAN_SIZE, help="maximum file size in bytes to scan")
|
49
49
|
@arg("-c", "--check", default=False, action="store_true", help="check if every YARA rule is valid")
|
50
50
|
@export(record=YaraMatchRecord)
|
51
51
|
def yara(
|
dissect/target/target.py
CHANGED
@@ -87,9 +87,10 @@ class Target:
|
|
87
87
|
self._applied = False
|
88
88
|
|
89
89
|
try:
|
90
|
-
self._config = config.load(self.path)
|
90
|
+
self._config = config.load([self.path, os.getcwd()])
|
91
91
|
except Exception as e:
|
92
|
-
self.log.
|
92
|
+
self.log.warning("Error loading config file: %s", self.path)
|
93
|
+
self.log.debug("", exc_info=e)
|
93
94
|
self._config = config.load(None) # This loads an empty config.
|
94
95
|
|
95
96
|
# Fill the disks and/or volumes and/or filesystems and apply() will
|
dissect/target/tools/shell.py
CHANGED
@@ -58,6 +58,7 @@ try:
|
|
58
58
|
except ImportError:
|
59
59
|
# Readline is not available on Windows
|
60
60
|
log.warning("Readline module is not available")
|
61
|
+
readline = None
|
61
62
|
|
62
63
|
# ['mode', 'addr', 'dev', 'nlink', 'uid', 'gid', 'size', 'atime', 'mtime', 'ctime']
|
63
64
|
STAT_TEMPLATE = """ File: {path} {symlink}
|
@@ -111,12 +112,43 @@ class TargetCmd(cmd.Cmd):
|
|
111
112
|
|
112
113
|
CMD_PREFIX = "cmd_"
|
113
114
|
|
115
|
+
DEFAULT_HISTFILE = "~/.dissect_history"
|
116
|
+
DEFAULT_HISTFILESIZE = 10_000
|
117
|
+
DEFAULT_HISTDIR = None
|
118
|
+
DEFAULT_HISTDIRFMT = ".dissect_history_{uid}_{target}"
|
119
|
+
|
114
120
|
def __init__(self, target: Target):
|
115
121
|
cmd.Cmd.__init__(self)
|
116
122
|
self.target = target
|
117
123
|
self.debug = False
|
118
124
|
self.identchars += "."
|
119
125
|
|
126
|
+
self.histfilesize = getattr(target._config, "HISTFILESIZE", self.DEFAULT_HISTFILESIZE)
|
127
|
+
self.histdir = getattr(target._config, "HISTDIR", self.DEFAULT_HISTDIR)
|
128
|
+
|
129
|
+
if self.histdir:
|
130
|
+
self.histdirfmt = getattr(target._config, "HISTDIRFMT", self.DEFAULT_HISTDIRFMT)
|
131
|
+
self.histfile = pathlib.Path(self.histdir).resolve() / pathlib.Path(
|
132
|
+
self.histdirfmt.format(uid=os.getuid(), target=target.name)
|
133
|
+
)
|
134
|
+
else:
|
135
|
+
self.histfile = pathlib.Path(getattr(target._config, "HISTFILE", self.DEFAULT_HISTFILE)).expanduser()
|
136
|
+
|
137
|
+
def preloop(self) -> None:
|
138
|
+
if readline and self.histfile.exists():
|
139
|
+
try:
|
140
|
+
readline.read_history_file(self.histfile)
|
141
|
+
except Exception as e:
|
142
|
+
log.debug("Error reading history file: %s", e)
|
143
|
+
|
144
|
+
def postloop(self) -> None:
|
145
|
+
if readline:
|
146
|
+
readline.set_history_length(self.histfilesize)
|
147
|
+
try:
|
148
|
+
readline.write_history_file(self.histfile)
|
149
|
+
except Exception as e:
|
150
|
+
log.debug("Error writing history file: %s", e)
|
151
|
+
|
120
152
|
def __getattr__(self, attr: str) -> Any:
|
121
153
|
if attr.startswith("help_"):
|
122
154
|
_, _, command = attr.partition("_")
|
@@ -1241,10 +1273,11 @@ def run_cli(cli: cmd.Cmd) -> None:
|
|
1241
1273
|
# Print an empty newline on exit
|
1242
1274
|
print()
|
1243
1275
|
return
|
1276
|
+
|
1244
1277
|
except KeyboardInterrupt:
|
1245
1278
|
# Add a line when pressing ctrl+c, so the next one starts at a new line
|
1246
1279
|
print()
|
1247
|
-
|
1280
|
+
|
1248
1281
|
except Exception as e:
|
1249
1282
|
if cli.debug:
|
1250
1283
|
log.exception(e)
|
@@ -1252,7 +1285,6 @@ def run_cli(cli: cmd.Cmd) -> None:
|
|
1252
1285
|
log.info(e)
|
1253
1286
|
print(f"*** Unhandled error: {e}")
|
1254
1287
|
print("If you wish to see the full debug trace, enable debug mode.")
|
1255
|
-
pass
|
1256
1288
|
|
1257
1289
|
|
1258
1290
|
@catch_sigpipe
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: dissect.target
|
3
|
-
Version: 3.19.
|
3
|
+
Version: 3.19.dev35
|
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
|
@@ -5,7 +5,7 @@ dissect/target/filesystem.py,sha256=G1gbOUpnQZyovubYGEUKgaDV0eHH5vE83-0gTc5PZAM,
|
|
5
5
|
dissect/target/loader.py,sha256=I8WNzDA0SMy42F7zfyBcSKj_VKNv64213WUvtGZ77qE,7374
|
6
6
|
dissect/target/plugin.py,sha256=HAN8maaDt-Rlqt8Rr1IW7gXQpzNQZjCVz-i4aSPphSw,48677
|
7
7
|
dissect/target/report.py,sha256=06uiP4MbNI8cWMVrC1SasNS-Yg6ptjVjckwj8Yhe0Js,7958
|
8
|
-
dissect/target/target.py,sha256=
|
8
|
+
dissect/target/target.py,sha256=nqd5OuVTwYR7XSzlMp7SHQoRCgZD_Z7QshnEEKcX-tw,32426
|
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
|
@@ -45,7 +45,7 @@ dissect/target/filesystems/xfs.py,sha256=kIyFGKYlyFYC7H3jaEv-lNKtBW4ZkD92H0WpfGc
|
|
45
45
|
dissect/target/filesystems/zip.py,sha256=WT1bQhzX_1MXXVZTKrJniae4xqRqMZ8FsfbvhgGQRTQ,4462
|
46
46
|
dissect/target/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
47
47
|
dissect/target/helpers/cache.py,sha256=TXlJBdFRz6V9zKs903am4Yawr0maYw5kZY0RqklDQJM,8568
|
48
|
-
dissect/target/helpers/config.py,sha256=
|
48
|
+
dissect/target/helpers/config.py,sha256=RMHnIuKJHINHiLrvKN3EyA0jFA1o6-pbeaycG8Pgrp8,2596
|
49
49
|
dissect/target/helpers/configutil.py,sha256=AEnkMQ0e6PncvCqGa-ACzBQWQBhMGBCzO5qzGJtRu60,27644
|
50
50
|
dissect/target/helpers/cyber.py,sha256=WnJlk-HqAETmDAgLq92JPxyDLxvzSoFV_WrO-odVKBI,16805
|
51
51
|
dissect/target/helpers/descriptor_extensions.py,sha256=uT8GwznfDAiIgMM7JKKOY0PXKMv2c0GCqJTCkWFgops,2605
|
@@ -164,7 +164,7 @@ dissect/target/plugins/filesystem/acquire_hash.py,sha256=OVxI19-Bl1tdqCiFMscFMLm
|
|
164
164
|
dissect/target/plugins/filesystem/icat.py,sha256=bOMi04IlljnKwxTWTZJKtK7RxKnabFu3WcXyUwzkE-4,4090
|
165
165
|
dissect/target/plugins/filesystem/resolver.py,sha256=HfyASUFV4F9uD-yFXilFpPTORAsRDvdmTvuYHgOaOWg,4776
|
166
166
|
dissect/target/plugins/filesystem/walkfs.py,sha256=e8HEZcV5Wiua26FGWL3xgiQ_PIhcNvGI5KCdsAx2Nmo,2298
|
167
|
-
dissect/target/plugins/filesystem/yara.py,sha256=
|
167
|
+
dissect/target/plugins/filesystem/yara.py,sha256=zh4hU3L_egddLqDeaHDVuCWYhTlNzPYPVak36Q6IMxI,6621
|
168
168
|
dissect/target/plugins/filesystem/ntfs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
169
169
|
dissect/target/plugins/filesystem/ntfs/mft.py,sha256=2ibCLJA7yUrZshFSPKdjoNt3TpfwTtk-DaErghe91CM,11445
|
170
170
|
dissect/target/plugins/filesystem/ntfs/mft_timeline.py,sha256=vvNFAZbr7s3X2OTYf4ES_L6-XsouTXcTymfxnHfZ1Rw,6791
|
@@ -331,7 +331,7 @@ dissect/target/tools/logging.py,sha256=5ZnumtMWLyslxfrUGZ4ntRyf3obOOhmn8SBjKfdLc
|
|
331
331
|
dissect/target/tools/mount.py,sha256=L_0tSmiBdW4aSaF0vXjB0bAkTC0kmT2N1hrbW6s5Jow,3254
|
332
332
|
dissect/target/tools/query.py,sha256=ONHu2FVomLccikb84qBrlhNmEfRoHYFQMcahk_y2c9A,15580
|
333
333
|
dissect/target/tools/reg.py,sha256=FDsiBBDxjWVUBTRj8xn82vZe-J_d9piM-TKS3PHZCcM,3193
|
334
|
-
dissect/target/tools/shell.py,sha256=
|
334
|
+
dissect/target/tools/shell.py,sha256=sjoc4nI9fsU5ZG7nDPNZvE-RtIPTwREbVdbg8WA3XTo,46442
|
335
335
|
dissect/target/tools/utils.py,sha256=sQizexY3ui5vmWw4KOBLg5ecK3TPFjD-uxDqRn56ZTY,11304
|
336
336
|
dissect/target/tools/yara.py,sha256=70k-2VMulf1EdkX03nCACzejaOEcsFHOyX-4E40MdQU,2044
|
337
337
|
dissect/target/tools/dump/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -346,10 +346,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
|
|
346
346
|
dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
|
347
347
|
dissect/target/volumes/md.py,sha256=7ShPtusuLGaIv27SvEETtgsuoQyAa4iAAeOR1NEaajI,1689
|
348
348
|
dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
|
349
|
-
dissect.target-3.19.
|
350
|
-
dissect.target-3.19.
|
351
|
-
dissect.target-3.19.
|
352
|
-
dissect.target-3.19.
|
353
|
-
dissect.target-3.19.
|
354
|
-
dissect.target-3.19.
|
355
|
-
dissect.target-3.19.
|
349
|
+
dissect.target-3.19.dev35.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
|
350
|
+
dissect.target-3.19.dev35.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
351
|
+
dissect.target-3.19.dev35.dist-info/METADATA,sha256=3ApP47TWFjPe5wV6_fuejtFbpr7YL-bwmvPePNKfN1M,12719
|
352
|
+
dissect.target-3.19.dev35.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
353
|
+
dissect.target-3.19.dev35.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
|
354
|
+
dissect.target-3.19.dev35.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
|
355
|
+
dissect.target-3.19.dev35.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
{dissect.target-3.19.dev33.dist-info → dissect.target-3.19.dev35.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|