dissect.target 3.20.dev38__py3-none-any.whl → 3.20.dev39__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- dissect/target/plugins/apps/editor/editor.py +23 -0
- dissect/target/plugins/apps/{texteditor → editor}/windowsnotepad.py +40 -31
- {dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/METADATA +1 -1
- {dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/RECORD +10 -10
- dissect/target/plugins/apps/texteditor/texteditor.py +0 -13
- /dissect/target/plugins/apps/{texteditor → editor}/__init__.py +0 -0
- {dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/COPYRIGHT +0 -0
- {dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/LICENSE +0 -0
- {dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/WHEEL +0 -0
- {dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/entry_points.txt +0 -0
- {dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
from dissect.target.plugin import NamespacePlugin, export
|
2
|
+
|
3
|
+
COMMON_EDITOR_FIELDS = [
|
4
|
+
("datetime", "ts"),
|
5
|
+
("string", "editor"),
|
6
|
+
("path", "source"),
|
7
|
+
]
|
8
|
+
|
9
|
+
|
10
|
+
class EditorPlugin(NamespacePlugin):
|
11
|
+
"""Editor plugin."""
|
12
|
+
|
13
|
+
__namespace__ = "editor"
|
14
|
+
|
15
|
+
@export
|
16
|
+
def extensions(self) -> None:
|
17
|
+
"""Yields installed extensions."""
|
18
|
+
raise NotImplementedError
|
19
|
+
|
20
|
+
@export
|
21
|
+
def history(self) -> None:
|
22
|
+
"""Yields history of files."""
|
23
|
+
raise NotImplementedError
|
@@ -16,11 +16,8 @@ from dissect.target.helpers.record import (
|
|
16
16
|
WindowsUserRecord,
|
17
17
|
create_extended_descriptor,
|
18
18
|
)
|
19
|
-
from dissect.target.plugin import export
|
20
|
-
from dissect.target.plugins.apps.
|
21
|
-
GENERIC_TAB_CONTENTS_RECORD_FIELDS,
|
22
|
-
TexteditorPlugin,
|
23
|
-
)
|
19
|
+
from dissect.target.plugin import alias, export
|
20
|
+
from dissect.target.plugins.apps.editor.editor import COMMON_EDITOR_FIELDS, EditorPlugin
|
24
21
|
from dissect.target.target import Target
|
25
22
|
|
26
23
|
# Thanks to @Nordgaren, @daddycocoaman, @JustArion and @ogmini for their suggestions and feedback in the PR
|
@@ -94,16 +91,25 @@ struct options_v2 {
|
|
94
91
|
};
|
95
92
|
"""
|
96
93
|
|
97
|
-
|
94
|
+
GENERIC_TAB_CONTENTS_RECORD_FIELDS = [
|
95
|
+
("string", "content"),
|
96
|
+
("path", "path"),
|
97
|
+
("string", "deleted_content"),
|
98
|
+
]
|
98
99
|
|
99
100
|
WindowsNotepadUnsavedTabRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
|
100
|
-
"
|
101
|
-
GENERIC_TAB_CONTENTS_RECORD_FIELDS,
|
101
|
+
"application/editor/windowsnotepad/tab/unsaved",
|
102
|
+
COMMON_EDITOR_FIELDS + GENERIC_TAB_CONTENTS_RECORD_FIELDS,
|
102
103
|
)
|
103
104
|
|
104
105
|
WindowsNotepadSavedTabRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
|
105
|
-
"
|
106
|
-
|
106
|
+
"application/editor/windowsnotepad/tab/saved",
|
107
|
+
COMMON_EDITOR_FIELDS
|
108
|
+
+ GENERIC_TAB_CONTENTS_RECORD_FIELDS
|
109
|
+
+ [
|
110
|
+
("digest", "digest"),
|
111
|
+
("path", "saved_path"),
|
112
|
+
],
|
107
113
|
)
|
108
114
|
|
109
115
|
c_windowstab = cstruct().load(windowstab_def)
|
@@ -264,7 +270,7 @@ class WindowsNotepadTab:
|
|
264
270
|
self.deleted_content = deleted_content if deleted_content else None
|
265
271
|
|
266
272
|
|
267
|
-
class WindowsNotepadPlugin(
|
273
|
+
class WindowsNotepadPlugin(EditorPlugin):
|
268
274
|
"""Windows notepad tab content plugin."""
|
269
275
|
|
270
276
|
__namespace__ = "windowsnotepad"
|
@@ -273,28 +279,27 @@ class WindowsNotepadPlugin(TexteditorPlugin):
|
|
273
279
|
|
274
280
|
def __init__(self, target: Target):
|
275
281
|
super().__init__(target)
|
276
|
-
self.users_tabs:
|
282
|
+
self.users_tabs: set[TargetPath, UnixUserRecord | WindowsUserRecord] = set()
|
277
283
|
for user_details in self.target.user_details.all_with_home():
|
278
284
|
for tab_file in user_details.home_path.glob(self.GLOB):
|
279
|
-
# These files
|
280
|
-
# and are skipped for now
|
285
|
+
# These files contain information on different settings / configurations, and are skipped for now.
|
281
286
|
if tab_file.name.endswith(".1.bin") or tab_file.name.endswith(".0.bin"):
|
282
287
|
continue
|
283
288
|
|
284
|
-
self.users_tabs.
|
289
|
+
self.users_tabs.add((tab_file, user_details.user))
|
285
290
|
|
286
291
|
def check_compatible(self) -> None:
|
287
292
|
if not self.users_tabs:
|
288
293
|
raise UnsupportedPluginError("No Windows Notepad tab files found")
|
289
294
|
|
295
|
+
@alias("tabs")
|
290
296
|
@export(record=[WindowsNotepadSavedTabRecord, WindowsNotepadUnsavedTabRecord])
|
291
|
-
def
|
297
|
+
def history(self) -> Iterator[WindowsNotepadSavedTabRecord | WindowsNotepadUnsavedTabRecord]:
|
292
298
|
"""Return contents from Windows 11 Notepad tabs - and its deleted content if available.
|
293
299
|
|
294
300
|
Windows Notepad application for Windows 11 is now able to restore both saved and unsaved tabs when you re-open
|
295
301
|
the application.
|
296
302
|
|
297
|
-
|
298
303
|
Resources:
|
299
304
|
- https://github.com/fox-it/dissect.target/pull/540
|
300
305
|
- https://github.com/JustArion/Notepad-Tabs
|
@@ -304,37 +309,41 @@ class WindowsNotepadPlugin(TexteditorPlugin):
|
|
304
309
|
- https://github.com/Nordgaren/tabstate-util/issues/1
|
305
310
|
- https://medium.com/@mahmoudsoheem/new-digital-forensics-artifact-from-windows-notepad-527645906b7b
|
306
311
|
|
307
|
-
Yields
|
312
|
+
Yields ``WindowsNotepadSavedTabRecord`` or ``WindowsNotepadUnsavedTabRecord`` records:
|
308
313
|
|
309
314
|
.. code-block:: text
|
310
315
|
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
316
|
+
ts (datetime): The modification time of the tab.
|
317
|
+
content (string): The content of the tab.
|
318
|
+
path (path): The path to the tab file.
|
319
|
+
deleted_content (string): The deleted content of the tab, if available.
|
320
|
+
digest (digest): A digest of the tab content.
|
321
|
+
saved_path (path): The path where the tab was saved.
|
317
322
|
"""
|
318
323
|
for file, user in self.users_tabs:
|
319
|
-
|
320
|
-
tab: WindowsNotepadTab = WindowsNotepadTab(file)
|
324
|
+
tab = WindowsNotepadTab(file)
|
321
325
|
|
322
326
|
if tab.is_saved:
|
323
327
|
yield WindowsNotepadSavedTabRecord(
|
328
|
+
ts=wintimestamp(tab.tab_header.timestamp),
|
329
|
+
editor="windowsnotepad",
|
324
330
|
content=tab.content,
|
325
331
|
path=tab.file,
|
326
332
|
deleted_content=tab.deleted_content,
|
327
|
-
|
333
|
+
digest=digest((None, None, tab.tab_header.sha256.hex())),
|
328
334
|
saved_path=tab.tab_header.filePath,
|
329
|
-
|
330
|
-
_target=self.target,
|
335
|
+
source=file,
|
331
336
|
_user=user,
|
337
|
+
_target=self.target,
|
332
338
|
)
|
339
|
+
|
333
340
|
else:
|
334
341
|
yield WindowsNotepadUnsavedTabRecord(
|
342
|
+
editor="windowsnotepad",
|
335
343
|
content=tab.content,
|
344
|
+
deleted_content=tab.deleted_content,
|
336
345
|
path=tab.file,
|
337
|
-
|
346
|
+
source=file,
|
338
347
|
_user=user,
|
339
|
-
|
348
|
+
_target=self.target,
|
340
349
|
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: dissect.target
|
3
|
-
Version: 3.20.
|
3
|
+
Version: 3.20.dev39
|
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
|
@@ -127,6 +127,9 @@ dissect/target/plugins/apps/browser/firefox.py,sha256=mZBBagFfIdiz9kUyK4Hi989I4g
|
|
127
127
|
dissect/target/plugins/apps/browser/iexplore.py,sha256=g_xw0toaiyjevxO8g9XPCOqc-CXZp39FVquRhPFGdTE,8801
|
128
128
|
dissect/target/plugins/apps/container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
129
129
|
dissect/target/plugins/apps/container/docker.py,sha256=LTsZplaECSfO1Ysp_Y-9WsnNocsreu_iHO8fbSif3g0,16221
|
130
|
+
dissect/target/plugins/apps/editor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
131
|
+
dissect/target/plugins/apps/editor/editor.py,sha256=yJctXY0XTfwW3GKy6XLO2WaWFQLssdBck9ZOcZSyf80,495
|
132
|
+
dissect/target/plugins/apps/editor/windowsnotepad.py,sha256=A9cfFrqbU2zjHRrzYsCnXr-uxKAIsVIKdXXJPYMt6MU,15068
|
130
133
|
dissect/target/plugins/apps/other/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
131
134
|
dissect/target/plugins/apps/other/env.py,sha256=_I12S_wjyT18WlUJ5cWOy5OTI140AheH6tq743iiyys,1874
|
132
135
|
dissect/target/plugins/apps/remoteaccess/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -141,9 +144,6 @@ dissect/target/plugins/apps/ssh/openssh.py,sha256=e3bj9fWxvU2K9Gk9JqA2_E-opkzLTv
|
|
141
144
|
dissect/target/plugins/apps/ssh/opensshd.py,sha256=VL78AuMaacn-pGNoPwvWm_9lbhj-ZNJDmRbL-UlQpIM,5545
|
142
145
|
dissect/target/plugins/apps/ssh/putty.py,sha256=EmsXr2NbOB13-EWS5AkpEPMUhOkVl6FAy8JGUiaDhxk,10133
|
143
146
|
dissect/target/plugins/apps/ssh/ssh.py,sha256=d3U8PJbtMvOV3K0wV_9KzGt2oRs-mfNQz1_Xd6SNx0Y,9320
|
144
|
-
dissect/target/plugins/apps/texteditor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
145
|
-
dissect/target/plugins/apps/texteditor/texteditor.py,sha256=h-tF1x2hLlgeNM3W-0Z9g0mjjkb9ietT1D5c-9GaMr8,543
|
146
|
-
dissect/target/plugins/apps/texteditor/windowsnotepad.py,sha256=BXGhcwWIW6zlQyD_nHpc1r5Lxt6WMvhfqY2PWf0A6pw,14852
|
147
147
|
dissect/target/plugins/apps/virtualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
148
148
|
dissect/target/plugins/apps/virtualization/vmware_workstation.py,sha256=7G-MRZCMN6aSYfs5NpaW2wkezqlx_EXq9-GzdbvtRrk,2088
|
149
149
|
dissect/target/plugins/apps/vpn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -370,10 +370,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
|
|
370
370
|
dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
|
371
371
|
dissect/target/volumes/md.py,sha256=7ShPtusuLGaIv27SvEETtgsuoQyAa4iAAeOR1NEaajI,1689
|
372
372
|
dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
|
373
|
-
dissect.target-3.20.
|
374
|
-
dissect.target-3.20.
|
375
|
-
dissect.target-3.20.
|
376
|
-
dissect.target-3.20.
|
377
|
-
dissect.target-3.20.
|
378
|
-
dissect.target-3.20.
|
379
|
-
dissect.target-3.20.
|
373
|
+
dissect.target-3.20.dev39.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
|
374
|
+
dissect.target-3.20.dev39.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
375
|
+
dissect.target-3.20.dev39.dist-info/METADATA,sha256=kytETAlhT5qsu2qAkum-3O6NZxRkd7N0Ytx-GwcMqCE,12897
|
376
|
+
dissect.target-3.20.dev39.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
377
|
+
dissect.target-3.20.dev39.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
|
378
|
+
dissect.target-3.20.dev39.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
|
379
|
+
dissect.target-3.20.dev39.dist-info/RECORD,,
|
@@ -1,13 +0,0 @@
|
|
1
|
-
from dissect.target.helpers.descriptor_extensions import UserRecordDescriptorExtension
|
2
|
-
from dissect.target.helpers.record import create_extended_descriptor
|
3
|
-
from dissect.target.plugin import NamespacePlugin
|
4
|
-
|
5
|
-
GENERIC_TAB_CONTENTS_RECORD_FIELDS = [("string", "content"), ("path", "path"), ("string", "deleted_content")]
|
6
|
-
|
7
|
-
TexteditorTabContentRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
|
8
|
-
"texteditor/tab", GENERIC_TAB_CONTENTS_RECORD_FIELDS
|
9
|
-
)
|
10
|
-
|
11
|
-
|
12
|
-
class TexteditorPlugin(NamespacePlugin):
|
13
|
-
__namespace__ = "texteditor"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dissect.target-3.20.dev38.dist-info → dissect.target-3.20.dev39.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|