dissect.target 3.18.dev6__py3-none-any.whl → 3.18.dev7__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. dissect/target/helpers/protobuf.py +6 -10
  2. dissect/target/helpers/ssh.py +3 -4
  3. dissect/target/plugins/apps/av/trendmicro.py +2 -3
  4. dissect/target/plugins/apps/container/docker.py +1 -1
  5. dissect/target/plugins/os/unix/locate/gnulocate.py +1 -2
  6. dissect/target/plugins/os/unix/locate/mlocate.py +3 -4
  7. dissect/target/plugins/os/unix/locate/plocate.py +1 -2
  8. dissect/target/plugins/os/unix/log/atop.py +3 -4
  9. dissect/target/plugins/os/unix/log/journal.py +5 -4
  10. dissect/target/plugins/os/unix/log/lastlog.py +2 -3
  11. dissect/target/plugins/os/unix/log/utmp.py +6 -7
  12. dissect/target/plugins/os/windows/adpolicy.py +3 -4
  13. dissect/target/plugins/os/windows/credhist.py +1 -2
  14. dissect/target/plugins/os/windows/datetime.py +3 -4
  15. dissect/target/plugins/os/windows/defender.py +3 -4
  16. dissect/target/plugins/os/windows/dpapi/blob.py +1 -2
  17. dissect/target/plugins/os/windows/dpapi/master_key.py +2 -3
  18. dissect/target/plugins/os/windows/notifications.py +1 -2
  19. dissect/target/plugins/os/windows/prefetch.py +26 -27
  20. dissect/target/plugins/os/windows/recyclebin.py +10 -8
  21. dissect/target/plugins/os/windows/regf/auditpol.py +4 -5
  22. dissect/target/plugins/os/windows/regf/bam.py +2 -3
  23. dissect/target/plugins/os/windows/regf/cit.py +1 -2
  24. dissect/target/plugins/os/windows/regf/recentfilecache.py +3 -4
  25. dissect/target/plugins/os/windows/regf/shellbags.py +1 -2
  26. dissect/target/plugins/os/windows/regf/shimcache.py +2 -3
  27. dissect/target/plugins/os/windows/regf/userassist.py +5 -6
  28. dissect/target/plugins/os/windows/sam.py +4 -5
  29. dissect/target/plugins/os/windows/task_helpers/tasks_job.py +3 -4
  30. {dissect.target-3.18.dev6.dist-info → dissect.target-3.18.dev7.dist-info}/METADATA +49 -24
  31. {dissect.target-3.18.dev6.dist-info → dissect.target-3.18.dev7.dist-info}/RECORD +36 -36
  32. {dissect.target-3.18.dev6.dist-info → dissect.target-3.18.dev7.dist-info}/COPYRIGHT +0 -0
  33. {dissect.target-3.18.dev6.dist-info → dissect.target-3.18.dev7.dist-info}/LICENSE +0 -0
  34. {dissect.target-3.18.dev6.dist-info → dissect.target-3.18.dev7.dist-info}/WHEEL +0 -0
  35. {dissect.target-3.18.dev6.dist-info → dissect.target-3.18.dev7.dist-info}/entry_points.txt +0 -0
  36. {dissect.target-3.18.dev6.dist-info → dissect.target-3.18.dev7.dist-info}/top_level.txt +0 -0
@@ -3,30 +3,26 @@ from __future__ import annotations
3
3
  from typing import Any, BinaryIO
4
4
 
5
5
  from dissect.cstruct.types.base import BaseType
6
- from dissect.cstruct.types.bytesinteger import BytesInteger
7
6
 
8
7
 
9
- class ProtobufVarint(BytesInteger):
8
+ class ProtobufVarint(BaseType):
10
9
  """Implements a protobuf integer type for dissect.cstruct that can span a variable amount of bytes.
11
10
 
12
- Mainly follows the cstruct BytesInteger implementation with minor tweaks
13
- to support protobuf's msb varint implementation.
11
+ Supports protobuf's msb varint implementation.
14
12
 
15
13
  Resources:
16
14
  - https://protobuf.dev/programming-guides/encoding/
17
15
  - https://github.com/protocolbuffers/protobuf/blob/main/python/google/protobuf/internal/decoder.py
18
16
  """
19
17
 
20
- def _read(self, stream: BinaryIO, context: dict[str, Any] = None) -> int:
18
+ @classmethod
19
+ def _read(cls, stream: BinaryIO, context: dict[str, Any] = None) -> int:
21
20
  return decode_varint(stream)
22
21
 
23
- def _write(self, stream: BinaryIO, data: int) -> int:
22
+ @classmethod
23
+ def _write(cls, stream: BinaryIO, data: int) -> int:
24
24
  return stream.write(encode_varint(data))
25
25
 
26
- _read_array = BaseType._read_array
27
-
28
- _write_array = BaseType._write_array
29
-
30
26
 
31
27
  def decode_varint(stream: BinaryIO) -> int:
32
28
  """Reads a varint from the provided buffer stream.
@@ -1,9 +1,9 @@
1
1
  import base64
2
2
  import binascii
3
3
 
4
- from dissect import cstruct
4
+ from dissect.cstruct import cstruct
5
5
 
6
- c_rfc4716_def = """
6
+ rfc4716_def = """
7
7
  struct ssh_string {
8
8
  uint32 length;
9
9
  char value[length];
@@ -23,8 +23,7 @@ struct ssh_private_key {
23
23
  }
24
24
  """
25
25
 
26
- c_rfc4716 = cstruct.cstruct(endian=">")
27
- c_rfc4716.load(c_rfc4716_def)
26
+ c_rfc4716 = cstruct(endian=">").load(rfc4716_def)
28
27
 
29
28
  RFC4716_MARKER_START = b"-----BEGIN OPENSSH PRIVATE KEY-----"
30
29
  RFC4716_MARKER_END = b"-----END OPENSSH PRIVATE KEY-----"
@@ -1,6 +1,6 @@
1
1
  from typing import Iterator
2
2
 
3
- from dissect import cstruct
3
+ from dissect.cstruct import cstruct
4
4
  from dissect.util.ts import from_unix
5
5
 
6
6
  from dissect.target import Target
@@ -47,8 +47,7 @@ struct firewall_entry {
47
47
  char _pad3[10];
48
48
  };
49
49
  """
50
- c_pfwlog = cstruct.cstruct()
51
- c_pfwlog.load(pfwlog_def)
50
+ c_pfwlog = cstruct().load(pfwlog_def)
52
51
 
53
52
 
54
53
  class TrendMicroPlugin(Plugin):
@@ -88,7 +88,7 @@ struct entry {
88
88
  """
89
89
 
90
90
  c_local = cstruct(endian=">")
91
- c_local.addtype("varint", ProtobufVarint(c_local, "varint", size=None, signed=False, alignment=1))
91
+ c_local.add_custom_type("varint", ProtobufVarint, size=None, alignment=1, signed=False)
92
92
  c_local.load(local_def, compiled=False)
93
93
 
94
94
  RE_DOCKER_NS = re.compile(r"\.(?P<nanoseconds>\d{7,})(?P<postfix>Z|\+\d{2}:\d{2})")
@@ -26,8 +26,7 @@ GNULocateRecord = TargetRecordDescriptor(
26
26
  ],
27
27
  )
28
28
 
29
- c_gnulocate = cstruct()
30
- c_gnulocate.load(gnulocate_def)
29
+ c_gnulocate = cstruct().load(gnulocate_def)
31
30
 
32
31
 
33
32
  class GNULocateFile:
@@ -20,10 +20,10 @@ struct header_config {
20
20
  int32 conf_size;
21
21
  int8 version; /* file format version */
22
22
  int8 require_visibility;
23
- int8 pad[2]; /* 32-bit total alignment */
23
+ int8 pad0[2]; /* 32-bit total alignment */
24
24
  char root_database;
25
25
  char config_block[conf_size];
26
- int8 pad;
26
+ int8 pad1;
27
27
  };
28
28
 
29
29
  enum DBE_TYPE: uint8 { /* database entry type */
@@ -68,8 +68,7 @@ MLocateRecord = TargetRecordDescriptor(
68
68
  ],
69
69
  )
70
70
 
71
- c_mlocate = cstruct(endian=">")
72
- c_mlocate.load(mlocate_def)
71
+ c_mlocate = cstruct(endian=">").load(mlocate_def)
73
72
 
74
73
 
75
74
  class MLocateFile:
@@ -65,8 +65,7 @@ PLocateRecord = TargetRecordDescriptor(
65
65
  ],
66
66
  )
67
67
 
68
- c_plocate = cstruct()
69
- c_plocate.load(plocate_def)
68
+ c_plocate = cstruct().load(plocate_def)
70
69
 
71
70
 
72
71
  class PLocateFile:
@@ -2,7 +2,7 @@ import zlib
2
2
  from io import BytesIO
3
3
  from typing import BinaryIO, Iterator
4
4
 
5
- from dissect.cstruct import Instance, cstruct
5
+ from dissect.cstruct import cstruct
6
6
 
7
7
  from dissect.target.exceptions import UnsupportedPluginError
8
8
  from dissect.target.helpers.record import TargetRecordDescriptor
@@ -178,8 +178,7 @@ struct tstat {
178
178
  };
179
179
  """ # noqa: E501
180
180
 
181
- c_atop = cstruct()
182
- c_atop.load(atop_def)
181
+ c_atop = cstruct().load(atop_def)
183
182
  c_atop.load(atop_tstat_def, align=True)
184
183
 
185
184
  AtopRecord = TargetRecordDescriptor(
@@ -226,7 +225,7 @@ class AtopFile:
226
225
  self.header = c_atop.rawheader(self.fh)
227
226
  self.version = self.version()
228
227
 
229
- def __iter__(self) -> Iterator[Instance]:
228
+ def __iter__(self) -> Iterator[c_atop.tstat]:
230
229
  while True:
231
230
  try:
232
231
  record = c_atop.rawrecord(self.fh)
@@ -1,8 +1,10 @@
1
+ from __future__ import annotations
2
+
1
3
  import lzma
2
4
  from typing import BinaryIO, Callable, Iterator
3
5
 
4
6
  import zstandard
5
- from dissect.cstruct import Instance, cstruct
7
+ from dissect.cstruct import cstruct
6
8
  from dissect.util import ts
7
9
  from dissect.util.compression import lz4
8
10
 
@@ -252,8 +254,7 @@ struct EntryArrayObject_Compact {
252
254
  };
253
255
  """ # noqa: E501
254
256
 
255
- c_journal = cstruct()
256
- c_journal.load(journal_def)
257
+ c_journal = cstruct().load(journal_def)
257
258
 
258
259
 
259
260
  def get_optional(value: str, to_type: Callable):
@@ -314,7 +315,7 @@ class JournalFile:
314
315
 
315
316
  return key, value
316
317
 
317
- def __iter__(self) -> Iterator[Instance]:
318
+ def __iter__(self) -> Iterator[dict[str, int | str]]:
318
319
  "Iterate over the entry objects to read payloads."
319
320
 
320
321
  for offset in self.entry_object_offsets():
@@ -1,6 +1,6 @@
1
1
  from typing import BinaryIO
2
2
 
3
- from dissect import cstruct
3
+ from dissect.cstruct import cstruct
4
4
  from dissect.util import ts
5
5
 
6
6
  from dissect.target.exceptions import FileNotFoundError, UnsupportedPluginError
@@ -36,8 +36,7 @@ struct entry {
36
36
  };
37
37
  """
38
38
 
39
- c_lastlog = cstruct.cstruct()
40
- c_lastlog.load(lastlog_def)
39
+ c_lastlog = cstruct().load(lastlog_def)
41
40
 
42
41
 
43
42
  class LastLogFile:
@@ -39,14 +39,14 @@ WtmpRecord = TargetRecordDescriptor(
39
39
  ],
40
40
  )
41
41
 
42
- c_utmp = """
42
+ utmp_def = """
43
43
  #define UT_LINESIZE 32
44
44
  #define UT_NAMESIZE 32
45
45
  #define UT_HOSTSIZE 256
46
46
 
47
47
  typedef uint32 pid_t;
48
48
 
49
- enum Type : char {
49
+ enum Type : uint8_t {
50
50
  EMPTY = 0x0,
51
51
  RUN_LVL = 0x1,
52
52
  BOOT_TIME = 0x2,
@@ -84,8 +84,7 @@ struct entry {
84
84
  };
85
85
  """ # noqa: E501
86
86
 
87
- utmp = cstruct()
88
- utmp.load(c_utmp)
87
+ c_utmp = cstruct().load(utmp_def)
89
88
 
90
89
  UTMP_ENTRY = namedtuple(
91
90
  "UTMPRecord",
@@ -122,11 +121,11 @@ class UtmpFile:
122
121
 
123
122
  while True:
124
123
  try:
125
- entry = utmp.entry(byte_stream)
124
+ entry = c_utmp.entry(byte_stream)
126
125
 
127
126
  r_type = ""
128
- if entry.ut_type in utmp.Type.reverse:
129
- r_type = utmp.Type.reverse[entry.ut_type]
127
+ if entry.ut_type in c_utmp.Type:
128
+ r_type = c_utmp.Type(entry.ut_type).name
130
129
 
131
130
  ut_host = entry.ut_host.decode(errors="surrogateescape").strip("\x00")
132
131
  ut_addr = None
@@ -1,7 +1,7 @@
1
1
  from struct import unpack
2
2
 
3
3
  from defusedxml import ElementTree
4
- from dissect import cstruct
4
+ from dissect.cstruct import cstruct
5
5
  from dissect.regf.c_regf import (
6
6
  REG_BINARY,
7
7
  REG_DWORD,
@@ -18,14 +18,13 @@ from dissect.target.exceptions import UnsupportedPluginError
18
18
  from dissect.target.helpers.record import TargetRecordDescriptor
19
19
  from dissect.target.plugin import Plugin, export
20
20
 
21
- c_def = """
21
+ policy_def = """
22
22
  struct registry_policy_header {
23
23
  uint32 signature;
24
24
  uint32 version;
25
25
  };
26
26
  """
27
- c_adpolicy = cstruct.cstruct()
28
- c_adpolicy.load(c_def)
27
+ c_adpolicy = cstruct().load(policy_def)
29
28
 
30
29
  ADPolicyRecord = TargetRecordDescriptor(
31
30
  "windows/adpolicy",
@@ -53,8 +53,7 @@ struct entry {
53
53
  };
54
54
  """
55
55
 
56
- c_credhist = cstruct()
57
- c_credhist.load(credhist_def)
56
+ c_credhist = cstruct().load(credhist_def)
58
57
 
59
58
 
60
59
  @dataclass
@@ -3,7 +3,7 @@ from collections import namedtuple
3
3
  from datetime import datetime, timedelta, timezone, tzinfo
4
4
  from typing import Dict, Tuple
5
5
 
6
- from dissect import cstruct
6
+ from dissect.cstruct import cstruct
7
7
 
8
8
  from dissect.target.exceptions import (
9
9
  RegistryError,
@@ -34,8 +34,7 @@ typedef struct _REG_TZI_FORMAT {
34
34
  SYSTEMTIME DaylightDate;
35
35
  } REG_TZI_FORMAT;
36
36
  """
37
- c_tz = cstruct.cstruct()
38
- c_tz.load(tz_def)
37
+ c_tz = cstruct().load(tz_def)
39
38
 
40
39
 
41
40
  # Althoug calendar.SUNDAY is only officially documented since Python 3.10, it
@@ -63,7 +62,7 @@ ZERO = timedelta(0)
63
62
  HOUR = timedelta(hours=1)
64
63
 
65
64
 
66
- def parse_systemtime_transition(systemtime: cstruct.Instance, year: int) -> datetime:
65
+ def parse_systemtime_transition(systemtime: c_tz._SYSTEMTIME, year: int) -> datetime:
67
66
  """Return the transition datetime for a given year using the SYSTEMTIME of a STD or DST transition date.
68
67
 
69
68
  The SYSTEMTIME date of a TZI structure needs to be used to calculate the actual date for a given year.
@@ -237,8 +237,7 @@ struct QuarantineEntryResourceField {
237
237
  };
238
238
  """
239
239
 
240
- c_defender = cstruct()
241
- c_defender.load(defender_def)
240
+ c_defender = cstruct().load(defender_def)
242
241
 
243
242
  STREAM_ID = c_defender.STREAM_ID
244
243
  STREAM_ATTRIBUTES = c_defender.STREAM_ATTRIBUTES
@@ -381,7 +380,7 @@ class QuarantineEntryResource:
381
380
  self.last_access_time = ts.wintimestamp(int.from_bytes(field.Data, "little"))
382
381
  elif field.Identifier == FIELD_IDENTIFIER.LastWriteTime:
383
382
  self.last_write_time = ts.wintimestamp(int.from_bytes(field.Data, "little"))
384
- elif field.Identifier not in FIELD_IDENTIFIER.values.values():
383
+ elif field.Identifier not in FIELD_IDENTIFIER:
385
384
  self.unknown_fields.append(field)
386
385
 
387
386
 
@@ -526,7 +525,7 @@ class MicrosoftDefenderPlugin(plugin.Plugin):
526
525
  subdir = resource.resource_id[0:2]
527
526
  resourcedata_location = resourcedata_directory.joinpath(subdir).joinpath(resource.resource_id)
528
527
  if not resourcedata_location.exists():
529
- self.target.log.warning(f"Could not find a ResourceData file for {entry.resource_id}.")
528
+ self.target.log.warning(f"Could not find a ResourceData file for {resource.resource_id}.")
530
529
  continue
531
530
  if not resourcedata_location.is_file():
532
531
  self.target.log.warning(f"{resourcedata_location} is not a file!")
@@ -36,8 +36,7 @@ struct DPAPIBlob {
36
36
  };
37
37
  """
38
38
 
39
- c_blob = cstruct()
40
- c_blob.load(blob_def)
39
+ c_blob = cstruct().load(blob_def)
41
40
 
42
41
 
43
42
  class Blob:
@@ -29,7 +29,7 @@ struct DomainKey {
29
29
  DWORD accessCheckLen;
30
30
  char guid[16];
31
31
  char encryptedSecret[secretLen];
32
- char accessCheckLen[accessCheckLen];
32
+ char accessCheck[accessCheckLen];
33
33
  };
34
34
 
35
35
  struct CredHist {
@@ -66,8 +66,7 @@ struct MasterKeyFileHeader {
66
66
  QWORD qwDomainKeySize;
67
67
  };
68
68
  """
69
- c_master_key = cstruct()
70
- c_master_key.load(master_key_def)
69
+ c_master_key = cstruct().load(master_key_def)
71
70
 
72
71
 
73
72
  class MasterKey:
@@ -91,8 +91,7 @@ typedef struct {
91
91
  } Chunk; // size: 0x23810
92
92
  """
93
93
 
94
- c_appdb = cstruct(endian="<")
95
- c_appdb.load(appdb_def)
94
+ c_appdb = cstruct(endian="<").load(appdb_def)
96
95
 
97
96
  APPDB_MAGIC = b"DNPW"
98
97
  NUM_APPDB_CHUNKS = 256
@@ -1,6 +1,6 @@
1
1
  from io import BytesIO
2
2
 
3
- from dissect import cstruct
3
+ from dissect.cstruct import cstruct
4
4
  from dissect.util import lzxpress_huffman
5
5
  from dissect.util.ts import wintimestamp
6
6
 
@@ -33,7 +33,7 @@ GroupedPrefetchRecord = TargetRecordDescriptor(
33
33
  )
34
34
 
35
35
 
36
- c_prefetch = """
36
+ prefetch_def = """
37
37
  struct PREFETCH_HEADER_DETECT {
38
38
  char signature[4];
39
39
  uint32 size;
@@ -59,14 +59,14 @@ c_prefetch = """
59
59
  uint32 volumes_information_offset;
60
60
  uint32 number_of_volumes;
61
61
  uint32 volumes_information_size;
62
- uint32 unknown[2];
62
+ uint32 unknown0[2];
63
63
  uint64 last_run_time;
64
64
  uint64 last_run_remains[7];
65
- uint64 unknown[2];
65
+ uint64 unknown1[2];
66
66
  uint32 run_count;
67
- uint32 unknown;
68
- uint32 unknown;
69
- char unknown[88];
67
+ uint32 unknown2;
68
+ uint32 unknown3;
69
+ char unknown4[88];
70
70
  };
71
71
 
72
72
  struct FILE_INFORMATION_17 {
@@ -80,9 +80,9 @@ c_prefetch = """
80
80
  uint32 number_of_volumes;
81
81
  uint32 volumes_information_size;
82
82
  uint32 last_run_time;
83
- uint32 unknown;
83
+ uint32 unknown0;
84
84
  uint32 run_count;
85
- uint32 unknown;
85
+ uint32 unknown1;
86
86
  };
87
87
 
88
88
  struct FILE_INFORMATION_23 {
@@ -99,9 +99,9 @@ c_prefetch = """
99
99
  uint64 last_run_time;
100
100
  uint64 last_run_remains[2];
101
101
  uint32 run_count;
102
- uint32 unknown;
103
- uint32 unknown;
104
- char unknown[80];
102
+ uint32 unknown0;
103
+ uint32 unknown1;
104
+ char unknown2[80];
105
105
  };
106
106
 
107
107
  struct VOLUME_INFORMATION_17 {
@@ -125,19 +125,19 @@ c_prefetch = """
125
125
  uint32 file_reference_size;
126
126
  uint32 directory_strings_array_offset;
127
127
  uint32 number_of_directory_strings;
128
- char unknown[4];
129
- char unknown[24];
130
- char unknown[4];
131
- char unknown[24];
132
- char unknown[4];
128
+ char unknown0[4];
129
+ char unknown1[24];
130
+ char unknown2[4];
131
+ char unknown3[24];
132
+ char unknown4[4];
133
133
  };
134
134
 
135
135
  struct TRACE_CHAIN_ARRAY_ENTRY_17 {
136
136
  uint32 next_array_entry_index;
137
137
  uint32 total_block_load_count;
138
- uint32 unknown;
139
- uint32 unknown;
140
- uint32 unknown;
138
+ uint32 unknown0;
139
+ uint32 unknown1;
140
+ uint32 unknown2;
141
141
  };
142
142
 
143
143
  struct FILE_METRICS_ARRAY_ENTRY_17 {
@@ -158,25 +158,24 @@ c_prefetch = """
158
158
  uint64 ntfs_reference;
159
159
  };
160
160
  """
161
- prefetch = cstruct.cstruct()
162
- prefetch.load(c_prefetch)
161
+ c_prefetch = cstruct().load(prefetch_def)
163
162
 
164
163
  prefetch_version_structs = {
165
- 17: (prefetch.FILE_INFORMATION_17, prefetch.FILE_METRICS_ARRAY_ENTRY_17),
166
- 23: (prefetch.FILE_INFORMATION_23, prefetch.FILE_METRICS_ARRAY_ENTRY_23),
167
- 30: (prefetch.FILE_INFORMATION_26, prefetch.FILE_METRICS_ARRAY_ENTRY_23),
164
+ 17: (c_prefetch.FILE_INFORMATION_17, c_prefetch.FILE_METRICS_ARRAY_ENTRY_17),
165
+ 23: (c_prefetch.FILE_INFORMATION_23, c_prefetch.FILE_METRICS_ARRAY_ENTRY_23),
166
+ 30: (c_prefetch.FILE_INFORMATION_26, c_prefetch.FILE_METRICS_ARRAY_ENTRY_23),
168
167
  }
169
168
 
170
169
 
171
170
  class Prefetch:
172
171
  def __init__(self, fh):
173
- header_detect = prefetch.PREFETCH_HEADER_DETECT(fh.read(8))
172
+ header_detect = c_prefetch.PREFETCH_HEADER_DETECT(fh.read(8))
174
173
  if header_detect.signature == b"MAM\x04":
175
174
  fh = BytesIO(lzxpress_huffman.decompress(fh))
176
175
 
177
176
  self.fh = fh
178
177
  self.fh.seek(0)
179
- self.header = prefetch.PREFETCH_HEADER(self.fh)
178
+ self.header = c_prefetch.PREFETCH_HEADER(self.fh)
180
179
  self.version = self.identify()
181
180
  self.volumes = None
182
181
  self.metrics = None
@@ -1,6 +1,8 @@
1
+ from __future__ import annotations
2
+
1
3
  from typing import Generator
2
4
 
3
- from dissect import cstruct
5
+ from dissect.cstruct import cstruct
4
6
  from dissect.util.ts import wintimestamp
5
7
 
6
8
  from dissect.target import Target
@@ -21,7 +23,7 @@ RecycleBinRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
21
23
  ],
22
24
  )
23
25
 
24
- c_recyclebin_i = """
26
+ recyclebin_def = """
25
27
  struct header_v1 {
26
28
  int64 version;
27
29
  int64 file_size;
@@ -37,14 +39,14 @@ struct header_v2 {
37
39
  };
38
40
  """
39
41
 
42
+ c_recyclebin = cstruct().load(recyclebin_def)
43
+
40
44
 
41
45
  class RecyclebinPlugin(Plugin):
42
46
  """Recyclebin plugin."""
43
47
 
44
48
  def __init__(self, target: Target) -> None:
45
49
  super().__init__(target)
46
- self.recyclebin_parser = cstruct.cstruct()
47
- self.recyclebin_parser.load(c_recyclebin_i)
48
50
 
49
51
  def check_compatible(self) -> None:
50
52
  for fs_entry in self.target.fs.path("/").iterdir():
@@ -131,11 +133,11 @@ class RecyclebinPlugin(Plugin):
131
133
  return "unknown"
132
134
  return parent_path.name
133
135
 
134
- def select_header(self, data: bytes) -> cstruct.Structure:
136
+ def select_header(self, data: bytes) -> c_recyclebin.header_v1 | c_recyclebin.header_v2:
135
137
  """Selects the correct header based on the version field in the header"""
136
138
 
137
- header_version = self.recyclebin_parser.uint64(data[:8])
139
+ header_version = c_recyclebin.uint64(data[:8])
138
140
  if header_version == 2:
139
- return self.recyclebin_parser.header_v2
141
+ return c_recyclebin.header_v2
140
142
  else:
141
- return self.recyclebin_parser.header_v1
143
+ return c_recyclebin.header_v1
@@ -1,14 +1,12 @@
1
1
  import io
2
2
 
3
- from dissect import cstruct
3
+ from dissect.cstruct import cstruct
4
4
 
5
5
  from dissect.target.exceptions import UnsupportedPluginError
6
6
  from dissect.target.helpers.record import TargetRecordDescriptor
7
7
  from dissect.target.plugin import Plugin, export
8
8
 
9
- c_adtev = cstruct.cstruct()
10
- c_adtev.load(
11
- """
9
+ adtev_def = """
12
10
  struct header {
13
11
  uint16 unk0;
14
12
  uint16 unk1;
@@ -18,7 +16,8 @@ struct header {
18
16
  uint16 unk3;
19
17
  };
20
18
  """
21
- )
19
+
20
+ c_adtev = cstruct().load(adtev_def)
22
21
 
23
22
  POLICY_CATEGORIES = [
24
23
  "System",
@@ -5,13 +5,12 @@ from dissect.target.exceptions import UnsupportedPluginError
5
5
  from dissect.target.helpers.record import TargetRecordDescriptor
6
6
  from dissect.target.plugin import Plugin, export
7
7
 
8
- c_bamdef = """
8
+ bam_def = """
9
9
  struct entry {
10
10
  uint64 ts;
11
11
  };
12
12
  """
13
- c_bam = cstruct()
14
- c_bam.load(c_bamdef)
13
+ c_bam = cstruct().load(bam_def)
15
14
 
16
15
  BamDamRecord = TargetRecordDescriptor(
17
16
  "windows/registry/bam",
@@ -212,8 +212,7 @@ typedef struct _CIT_DP_DATA {
212
212
  } CIT_DP_DATA;
213
213
  """
214
214
 
215
- c_cit = cstruct()
216
- c_cit.load(cit_def)
215
+ c_cit = cstruct().load(cit_def)
217
216
 
218
217
 
219
218
  CITSystemRecord = TargetRecordDescriptor(
@@ -1,10 +1,10 @@
1
- from dissect import cstruct
1
+ from dissect.cstruct import cstruct
2
2
 
3
3
  from dissect.target.exceptions import UnsupportedPluginError
4
4
  from dissect.target.helpers.record import TargetRecordDescriptor
5
5
  from dissect.target.plugin import Plugin, export
6
6
 
7
- c_recent_files_def = """
7
+ recent_files_def = """
8
8
  struct header {
9
9
  uint32 magic;
10
10
  uint32 unk0;
@@ -18,8 +18,7 @@ c_recent_files_def = """
18
18
  wchar path[length + 1];
19
19
  };
20
20
  """
21
- c_recent_files = cstruct.cstruct()
22
- c_recent_files.load(c_recent_files_def)
21
+ c_recent_files = cstruct().load(recent_files_def)
23
22
 
24
23
  RecentFileCacheRecord = TargetRecordDescriptor(
25
24
  "windows/recentfilecache",
@@ -243,8 +243,7 @@ struct EXTENSION_BLOCK_HEADER {
243
243
  uint32 signature;
244
244
  };
245
245
  """
246
- c_bag = cstruct()
247
- c_bag.load(bag_def)
246
+ c_bag = cstruct().load(bag_def)
248
247
 
249
248
  DELEGATE_ITEM_IDENTIFIER = b"\x74\x1a\x59\x5e\x96\xdf\xd3\x48\x8d\x67\x17\x33\xbc\xee\x28\xba"
250
249
 
@@ -21,7 +21,7 @@ ShimcacheRecord = TargetRecordDescriptor(
21
21
  ],
22
22
  )
23
23
 
24
- c_shimdef = """
24
+ shim_def = """
25
25
  struct NT61_HEADER {
26
26
  uint32 magic;
27
27
  uint32 num_entries;
@@ -99,8 +99,7 @@ struct WIN10_ENTRY_DATA {
99
99
  uint64 ts;
100
100
  };
101
101
  """
102
- c_shim = cstruct()
103
- c_shim.load(c_shimdef)
102
+ c_shim = cstruct().load(shim_def)
104
103
 
105
104
  MAGIC_NT61 = 0xBADC0FEE
106
105
  MAGIC_NT52 = 0xBADC0FFE
@@ -1,6 +1,6 @@
1
1
  import codecs
2
2
 
3
- from dissect import cstruct
3
+ from dissect.cstruct import cstruct
4
4
  from dissect.util.ts import wintimestamp
5
5
 
6
6
  from dissect.target.exceptions import RegistryValueNotFoundError, UnsupportedPluginError
@@ -14,13 +14,13 @@ from dissect.target.plugin import Plugin, export
14
14
 
15
15
  userassist_def = """
16
16
  struct VERSION5_ENTRY {
17
- char padding[4];
17
+ char padding0[4];
18
18
  uint32 number_of_executions;
19
19
  uint32 application_focus_count;
20
20
  uint32 application_focus_duration;
21
- char padding[44];
21
+ char padding1[44];
22
22
  uint64 timestamp;
23
- char padding[4];
23
+ char padding2[4];
24
24
  };
25
25
 
26
26
  struct VERSION3_ENTRY {
@@ -29,8 +29,7 @@ struct VERSION3_ENTRY {
29
29
  uint64 timestamp;
30
30
  };
31
31
  """
32
- c_userassist = cstruct.cstruct()
33
- c_userassist.load(userassist_def)
32
+ c_userassist = cstruct().load(userassist_def)
34
33
 
35
34
  UserAssistRecordDescriptor = create_extended_descriptor(
36
35
  [
@@ -9,14 +9,14 @@ try:
9
9
  except ImportError:
10
10
  HAS_CRYPTO = False
11
11
 
12
- from dissect import cstruct
12
+ from dissect.cstruct import cstruct
13
13
  from dissect.util import ts
14
14
 
15
15
  from dissect.target.exceptions import UnsupportedPluginError
16
16
  from dissect.target.helpers.record import TargetRecordDescriptor
17
17
  from dissect.target.plugin import Plugin, export
18
18
 
19
- c_sam_def = """
19
+ sam_def = """
20
20
  struct user_F {
21
21
  char unknown1[8];
22
22
  uint64 t_last_login; /* Time of last login */
@@ -166,7 +166,7 @@ struct DOMAIN_ACCOUNT_F {
166
166
  uint16 min_password_length; /* 0x50 */
167
167
  uint16 password_history_length; /* 0x52 */
168
168
  uint16 lockout_threshold; /* 0x54 */
169
- uint16 unknown1_1; /* 0x56 */
169
+ uint16 unknown1_3; /* 0x56 */
170
170
  uint32 server_state; /* 0x58 */
171
171
  uint16 server_role; /* 0x5c */
172
172
  uint16 uas_compability_required; /* 0x5e */
@@ -207,8 +207,7 @@ struct SAM_HASH_AES { /* size: >=24 */
207
207
  };
208
208
  """
209
209
 
210
- c_sam = cstruct.cstruct()
211
- c_sam.load(c_sam_def)
210
+ c_sam = cstruct().load(sam_def)
212
211
 
213
212
  SamRecord = TargetRecordDescriptor(
214
213
  "windows/registry/sam",
@@ -2,7 +2,7 @@ import datetime
2
2
  import warnings
3
3
  from typing import Iterator, Optional
4
4
 
5
- from dissect import cstruct
5
+ from dissect.cstruct import cstruct
6
6
  from flow.record import GroupedRecord
7
7
 
8
8
  from dissect.target.exceptions import InvalidTaskError
@@ -135,8 +135,7 @@ struct ATJOB_DATA {
135
135
  // uint8 job_signature[64 * s_ver * c_ver]; /* - calculated job signature. */
136
136
  };
137
137
  """
138
- atjob = cstruct.cstruct()
139
- atjob.load(atjob_def)
138
+ c_atjob = cstruct().load(atjob_def)
140
139
 
141
140
 
142
141
  class AtTask:
@@ -149,7 +148,7 @@ class AtTask:
149
148
 
150
149
  def __init__(self, job_file: TargetPath, target: Target):
151
150
  try:
152
- self.at_data = atjob.ATJOB_DATA(job_file.open())
151
+ self.at_data = c_atjob.ATJOB_DATA(job_file.open())
153
152
  except Exception as e:
154
153
  raise InvalidTaskError(e)
155
154
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.18.dev6
3
+ Version: 3.18.dev7
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
@@ -23,36 +23,61 @@ Description-Content-Type: text/markdown
23
23
  License-File: LICENSE
24
24
  License-File: COPYRIGHT
25
25
  Requires-Dist: defusedxml
26
- Requires-Dist: dissect.cstruct <4.0.dev,>=3.0.dev
27
- Requires-Dist: dissect.eventlog <4.0.dev,>=3.0.dev
28
- Requires-Dist: dissect.evidence <4.0.dev,>=3.0.dev
29
- Requires-Dist: dissect.hypervisor <4.0.dev,>=3.0.dev
30
- Requires-Dist: dissect.ntfs <4.0.dev,>=3.4.dev
31
- Requires-Dist: dissect.regf <4.0.dev,>=3.3.dev
32
- Requires-Dist: dissect.util <4.0.dev,>=3.0.dev
33
- Requires-Dist: dissect.volume <4.0.dev,>=3.0.dev
26
+ Requires-Dist: dissect.cstruct <5,>=4.dev
27
+ Requires-Dist: dissect.eventlog <4,>=3
28
+ Requires-Dist: dissect.evidence <4,>=3
29
+ Requires-Dist: dissect.hypervisor <4,>=3
30
+ Requires-Dist: dissect.ntfs <4,>=3.4
31
+ Requires-Dist: dissect.regf <4,>=3.3
32
+ Requires-Dist: dissect.util <4,>=3
33
+ Requires-Dist: dissect.volume <4,>=2
34
34
  Requires-Dist: flow.record ~=3.15.0
35
35
  Requires-Dist: structlog
36
36
  Provides-Extra: cb
37
37
  Requires-Dist: dissect.target[full] ; extra == 'cb'
38
38
  Requires-Dist: carbon-black-cloud-sdk ~=1.4.3 ; extra == 'cb'
39
+ Provides-Extra: dev
40
+ Requires-Dist: dissect.target[full,mqtt,yara] ; extra == 'dev'
41
+ Requires-Dist: dissect.btrfs[dev] <2.0.dev,>=1.0.dev ; extra == 'dev'
42
+ Requires-Dist: dissect.cim[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
43
+ Requires-Dist: dissect.clfs[dev] <2.0.dev,>=1.0.dev ; extra == 'dev'
44
+ Requires-Dist: dissect.cstruct <5.0.dev,>=4.0.dev ; extra == 'dev'
45
+ Requires-Dist: dissect.esedb[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
46
+ Requires-Dist: dissect.etl[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
47
+ Requires-Dist: dissect.eventlog[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
48
+ Requires-Dist: dissect.evidence[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
49
+ Requires-Dist: dissect.extfs[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
50
+ Requires-Dist: dissect.fat[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
51
+ Requires-Dist: dissect.ffs[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
52
+ Requires-Dist: dissect.hypervisor[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
53
+ Requires-Dist: dissect.jffs[dev] <2.0.dev,>=1.0.dev ; extra == 'dev'
54
+ Requires-Dist: dissect.ntfs[dev] <4.0.dev,>=3.4.dev ; extra == 'dev'
55
+ Requires-Dist: dissect.regf[dev] <4.0.dev,>=3.3.dev ; extra == 'dev'
56
+ Requires-Dist: dissect.shellitem[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
57
+ Requires-Dist: dissect.sql[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
58
+ Requires-Dist: dissect.squashfs[dev] <2.0.dev,>=1.0.dev ; extra == 'dev'
59
+ Requires-Dist: dissect.thumbcache[dev] <2.0.dev,>=1.0.dev ; extra == 'dev'
60
+ Requires-Dist: dissect.util <4.0.dev,>=3.0.dev ; extra == 'dev'
61
+ Requires-Dist: dissect.vmfs[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
62
+ Requires-Dist: dissect.volume[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
63
+ Requires-Dist: dissect.xfs[dev] <4.0.dev,>=3.0.dev ; extra == 'dev'
39
64
  Provides-Extra: full
40
65
  Requires-Dist: asn1crypto ; extra == 'full'
41
- Requires-Dist: dissect.btrfs <2.0.dev,>=1.0.dev ; extra == 'full'
42
- Requires-Dist: dissect.cim <4.0.dev,>=3.0.dev ; extra == 'full'
43
- Requires-Dist: dissect.clfs <2.0.dev,>=1.0.dev ; extra == 'full'
44
- Requires-Dist: dissect.esedb <4.0.dev,>=3.0.dev ; extra == 'full'
45
- Requires-Dist: dissect.etl <4.0.dev,>=3.0.dev ; extra == 'full'
46
- Requires-Dist: dissect.extfs <4.0.dev,>=3.0.dev ; extra == 'full'
47
- Requires-Dist: dissect.fat <4.0.dev,>=3.0.dev ; extra == 'full'
48
- Requires-Dist: dissect.ffs <4.0.dev,>=3.0.dev ; extra == 'full'
49
- Requires-Dist: dissect.jffs <2.0.dev,>=1.0.dev ; extra == 'full'
50
- Requires-Dist: dissect.shellitem <4.0.dev,>=3.0.dev ; extra == 'full'
51
- Requires-Dist: dissect.squashfs <2.0.dev,>=1.0.dev ; extra == 'full'
52
- Requires-Dist: dissect.sql <4.0.dev,>=3.0.dev ; extra == 'full'
53
- Requires-Dist: dissect.thumbcache <2.0.dev,>=1.0.dev ; extra == 'full'
54
- Requires-Dist: dissect.vmfs <4.0.dev,>=3.0.dev ; extra == 'full'
55
- Requires-Dist: dissect.xfs <4.0.dev,>=3.0.dev ; extra == 'full'
66
+ Requires-Dist: dissect.btrfs <2,>=1 ; extra == 'full'
67
+ Requires-Dist: dissect.cim <4,>=3 ; extra == 'full'
68
+ Requires-Dist: dissect.clfs <2,>=1 ; extra == 'full'
69
+ Requires-Dist: dissect.esedb <4,>=3 ; extra == 'full'
70
+ Requires-Dist: dissect.etl <4,>=3 ; extra == 'full'
71
+ Requires-Dist: dissect.extfs <4,>=3 ; extra == 'full'
72
+ Requires-Dist: dissect.fat <4,>=3 ; extra == 'full'
73
+ Requires-Dist: dissect.ffs <4,>=3 ; extra == 'full'
74
+ Requires-Dist: dissect.jffs <2,>=1 ; extra == 'full'
75
+ Requires-Dist: dissect.shellitem <4,>=3 ; extra == 'full'
76
+ Requires-Dist: dissect.squashfs <2,>=1 ; extra == 'full'
77
+ Requires-Dist: dissect.sql <4,>=3 ; extra == 'full'
78
+ Requires-Dist: dissect.thumbcache <2,>=1 ; extra == 'full'
79
+ Requires-Dist: dissect.vmfs <4,>=3 ; extra == 'full'
80
+ Requires-Dist: dissect.xfs <4,>=3 ; extra == 'full'
56
81
  Requires-Dist: ipython ; extra == 'full'
57
82
  Requires-Dist: fusepy ; extra == 'full'
58
83
  Requires-Dist: pycryptodome ; extra == 'full'
@@ -60,12 +60,12 @@ dissect/target/helpers/mount.py,sha256=JxhUYyEbDnHfzPpfuWy4nV9OwCJPoDSGdHHNiyvd_
60
60
  dissect/target/helpers/mui.py,sha256=i-7XoHbu4WO2fYapK9yGAMW04rFlgRispknc1KQIS5Q,22258
61
61
  dissect/target/helpers/network_managers.py,sha256=uRh_P8ICbKke2N7eFJ6AS2-I5DmIRiaQUlxR7oqxPaU,24975
62
62
  dissect/target/helpers/polypath.py,sha256=h8p7m_OCNiQljGwoZh5Aflr9H2ot6CZr6WKq1OSw58o,2175
63
- dissect/target/helpers/protobuf.py,sha256=NwKrZD4q9v7J8GnZX9gbzMUMV5pR78eAV17jgWOz_EY,1730
63
+ dissect/target/helpers/protobuf.py,sha256=b4DsnqrRLrefcDjx7rQno-_LBcwtJXxuKf5RdOegzfE,1537
64
64
  dissect/target/helpers/record.py,sha256=lWl7k2Mp9Axllm0tXzPGJx2zj2zONsyY_p5g424T0Lc,4826
65
65
  dissect/target/helpers/record_modifier.py,sha256=3I_rC5jqvl0TsW3V8OQ6Dltz_D8J4PU1uhhzbJGKm9c,3245
66
66
  dissect/target/helpers/regutil.py,sha256=kX-sSZbW8Qkg29Dn_9zYbaQrwLumrr4Y8zJ1EhHXIAM,27337
67
67
  dissect/target/helpers/shell_folder_ids.py,sha256=Behhb8oh0kMxrEk6YYKYigCDZe8Hw5QS6iK_d2hTs2Y,24978
68
- dissect/target/helpers/ssh.py,sha256=LPssHXyfL8QYmLi2vpa3wElsGboLG_A1Y8kvOehpUr4,6338
68
+ dissect/target/helpers/ssh.py,sha256=obB7sqUH0IoUo78NAmHM8TX0pgA_4GHICZ3TA3TW_0E,6324
69
69
  dissect/target/helpers/targetd.py,sha256=ELhUulzQ4OgXgHsWhsLgM14vut8Wm6btr7qTynlwKaE,1812
70
70
  dissect/target/helpers/utils.py,sha256=r36Bn0UL0E6Z8ajmQrHzC6RyUxTRdwJ1PNsd904Lmzs,4027
71
71
  dissect/target/helpers/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -117,7 +117,7 @@ dissect/target/plugins/apps/av/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
117
117
  dissect/target/plugins/apps/av/mcafee.py,sha256=YWrsB5kQFtXfhqi6mdMPMVk2qh_KCiOBiaTnbj8mVrM,5440
118
118
  dissect/target/plugins/apps/av/sophos.py,sha256=TuO-ggdD5De0UTouzNF7-1iLULIOvr6FDktocnM0aF0,4164
119
119
  dissect/target/plugins/apps/av/symantec.py,sha256=I1_zZ2ihKptB2JJ7sYZ7df0AgtK3KhWPsbDkc2m_hPA,14171
120
- dissect/target/plugins/apps/av/trendmicro.py,sha256=ZhxL4IkzyHfR2xaNIzk-M-v-ITMuLG_yqq_0djqGMjU,4675
120
+ dissect/target/plugins/apps/av/trendmicro.py,sha256=8F4IWYCXG7HEniGridQ4ax82Mrx_20wV_999-8c9ttQ,4666
121
121
  dissect/target/plugins/apps/browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
122
  dissect/target/plugins/apps/browser/brave.py,sha256=EW1ubL10swHeV9CscfpE-SrNZozul_Ewj48LNRaG5Kg,2865
123
123
  dissect/target/plugins/apps/browser/browser.py,sha256=rBIwcgdl73gm-8APwx2jEUAYXRniXkqcdMr2UYj_tS8,4118
@@ -127,7 +127,7 @@ dissect/target/plugins/apps/browser/edge.py,sha256=woXzZtHPWmfcV8vbxGKHELKru5JRb
127
127
  dissect/target/plugins/apps/browser/firefox.py,sha256=ROrzhI2SV81E63hi5PRtyJveRrBacWNJ9FWZS_ondlk,30929
128
128
  dissect/target/plugins/apps/browser/iexplore.py,sha256=g_xw0toaiyjevxO8g9XPCOqc-CXZp39FVquRhPFGdTE,8801
129
129
  dissect/target/plugins/apps/container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
- dissect/target/plugins/apps/container/docker.py,sha256=67Eih9AfUbqsP-HlnlwoHi4rSAnVCZWM76sEyO_1m18,15316
130
+ dissect/target/plugins/apps/container/docker.py,sha256=KxQRbKGgxkf3YFBMa7fjeJ7qo8qjFys7zEmfQhDTnLw,15305
131
131
  dissect/target/plugins/apps/remoteaccess/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
132
  dissect/target/plugins/apps/remoteaccess/anydesk.py,sha256=lHtgINWXfVpPuCTRyQmT2ZO-1vkoqiXZ7coj8cZ8p4c,3185
133
133
  dissect/target/plugins/apps/remoteaccess/remoteaccess.py,sha256=UQDmDC4Y-KxYl_8kaAh6SG_BLJZ6SeGnxG0gyD8tzaE,833
@@ -240,38 +240,38 @@ dissect/target/plugins/os/unix/linux/suse/__init__.py,sha256=47DEQpj8HBSa-_TImW-
240
240
  dissect/target/plugins/os/unix/linux/suse/_os.py,sha256=eaqgnkbunBJ2Hf_GE96THjfT3ybVIZvtWId-dx3JMV4,575
241
241
  dissect/target/plugins/os/unix/linux/suse/zypper.py,sha256=amepAWivvbHFt2AoJUHC8lIeuD5Iy8MFXTWKqTYAEqE,4142
242
242
  dissect/target/plugins/os/unix/locate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
243
- dissect/target/plugins/os/unix/locate/gnulocate.py,sha256=P-YbMFw901p2EBgTaZH6axShfIRRDrCx3APBy6Ii3lE,2934
243
+ dissect/target/plugins/os/unix/locate/gnulocate.py,sha256=N5IF8fYsrKrWsJw8ZPC_Y4wiQqdchgOvKtv-E5-vLec,2922
244
244
  dissect/target/plugins/os/unix/locate/locate.py,sha256=uXFcWAqoz_3eNWHhsGoEtkkhmT5J3F1GYvr4uQxi308,122
245
- dissect/target/plugins/os/unix/locate/mlocate.py,sha256=DhrFgxDQF-fMZaA0WK8Z-5o9i9iDsuTHW7MHJtWwz6o,4485
246
- dissect/target/plugins/os/unix/locate/plocate.py,sha256=ShU-F9_31rGfMYXqaR_KrHXVxgDDRZMJ_zEMuekw57w,7229
245
+ dissect/target/plugins/os/unix/locate/mlocate.py,sha256=A8U3cqrA8fq8AV-4pkImjwdwQbWY-TspvRQS9bzZRLo,4477
246
+ dissect/target/plugins/os/unix/locate/plocate.py,sha256=PQ-nmpMex6POKEsyqppButAjVxR071urmGcFU1LUQdA,7219
247
247
  dissect/target/plugins/os/unix/log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
248
- dissect/target/plugins/os/unix/log/atop.py,sha256=DdiTf-gVJJvvPbR36khU4388lxQzABaWI-95jLCGgSw,16345
248
+ dissect/target/plugins/os/unix/log/atop.py,sha256=ljvGipVG16qTECnV1kIORykcGH9tTlpDmcMo5CXSPns,16332
249
249
  dissect/target/plugins/os/unix/log/audit.py,sha256=OjorWTmCFvCI5RJq6m6WNW0Lhb-poB2VAggKOGZUHK4,3722
250
250
  dissect/target/plugins/os/unix/log/auth.py,sha256=l7gCuRdvv9gL0U1N0yrR9hVsMnr4t_k4t-n-f6PrOxg,2388
251
- dissect/target/plugins/os/unix/log/journal.py,sha256=eiNNVLmKWFj4dTQX8PNRNgKpVwzQWEHEsKyYfGUAPXQ,17376
252
- dissect/target/plugins/os/unix/log/lastlog.py,sha256=eL_dbB1sPoy0tyavIjT457ZLVfXcCr17GiwDrMEEh8A,2458
251
+ dissect/target/plugins/os/unix/log/journal.py,sha256=auVRfrW4NRU7HguoDLTz4l_IwNdPZLPAqD7jhrOTzH8,17404
252
+ dissect/target/plugins/os/unix/log/lastlog.py,sha256=Wq89wRSFZSBsoKVCxjDofnC4yw9XJ4iOF0XJe9EucCo,2448
253
253
  dissect/target/plugins/os/unix/log/messages.py,sha256=CXA-SkMPLaCgnTQg9nzII-7tO8Il_ENQmuYvDxo33rI,4698
254
- dissect/target/plugins/os/unix/log/utmp.py,sha256=21tvzG977LqzRShV6uAoU-83WDcLUrI_Tv__2ZVi9rw,7756
254
+ dissect/target/plugins/os/unix/log/utmp.py,sha256=1nPHIaBUHt_9z6PDrvyqg4huKLihUaWLrMmgMsbaeIo,7755
255
255
  dissect/target/plugins/os/windows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
256
256
  dissect/target/plugins/os/windows/_os.py,sha256=g5XGtruvyWx4YAhMpGZnAaIFWQqLNQpee_Ot7ROmD8w,12606
257
257
  dissect/target/plugins/os/windows/activitiescache.py,sha256=Q2aILnhJ2rp2AwEbWwyBuSLjMbGqaYJTsavSbfkcFKE,6741
258
- dissect/target/plugins/os/windows/adpolicy.py,sha256=rvsvywChfms7d2kMwXRVHZaf8zJ46WmMwYplGAYEax8,6984
258
+ dissect/target/plugins/os/windows/adpolicy.py,sha256=fULRFO_I_QxAn6G9SCwlLL-TLVliS13JEGnGotf7lSA,6983
259
259
  dissect/target/plugins/os/windows/amcache.py,sha256=ZZNOs3bILTf0AGkDkhoatndl0j39DXkstN7oOyxJECU,27188
260
260
  dissect/target/plugins/os/windows/catroot.py,sha256=wHW_p4M0aFonZJ2xZFIbgLbJopdCIXO9jVrGPHLsMLc,11105
261
261
  dissect/target/plugins/os/windows/cim.py,sha256=jsrpu6TZpBUh7VWI9AV2Ib5bebTwsvqOwRfa5gjJd7c,3056
262
262
  dissect/target/plugins/os/windows/clfs.py,sha256=begVsZ-CY97Ksh6S1g03LjyBgu8ERY2hfNDWYPj0GXI,4872
263
- dissect/target/plugins/os/windows/credhist.py,sha256=FX_pW-tU9esdvDTSx913kf_CpGE_1jbD6bkjDb-cxHk,7069
264
- dissect/target/plugins/os/windows/datetime.py,sha256=tuBOkewmbCW8sFXcYp5p82oM5RCsVwmtC79BDCTLz8k,9472
265
- dissect/target/plugins/os/windows/defender.py,sha256=Vp_IP6YKm4igR765WvXJrHQ3RMu7FJKM3VOoR8AybV8,23737
263
+ dissect/target/plugins/os/windows/credhist.py,sha256=YSjuyd53Augdy_lKKzZHtx5Ozt0HzF6LDYIOb-8P1Pw,7058
264
+ dissect/target/plugins/os/windows/datetime.py,sha256=YKHUZU6lkKJocq15y0yCwvIIOb1Ej-kfvEBmHbrdIGw,9467
265
+ dissect/target/plugins/os/windows/defender.py,sha256=lHHhyi8YqNTmBu3qbH7yskMAYcarYouPxKtBQLtXnnE,23713
266
266
  dissect/target/plugins/os/windows/env.py,sha256=-u9F9xWy6PUbQmu5Tv_MDoVmy6YB-7CbHokIK_T3S44,13891
267
267
  dissect/target/plugins/os/windows/generic.py,sha256=BSvDPfB9faU0uquMj0guw5tnR_97Nn0XAEE4k05BFSQ,22273
268
268
  dissect/target/plugins/os/windows/lnk.py,sha256=On1k0PODYggQM1j514qFepBACCV2Z2u61Q4Ba6e3Y2c,8179
269
269
  dissect/target/plugins/os/windows/locale.py,sha256=yXVdclpUqss9h8Nq7N4kg3OHwWGDfjdfiLiUZR3wqv8,2324
270
- dissect/target/plugins/os/windows/notifications.py,sha256=64xHHueHwtJCc8RTAF70oa0RxvqfCu_DBPWRSZBnYZc,17386
271
- dissect/target/plugins/os/windows/prefetch.py,sha256=bDoJOWRp6vIHe1lf9HXNuNg5iyh5YqVw9s0P562VfKo,10460
272
- dissect/target/plugins/os/windows/recyclebin.py,sha256=7UFjZg1NHWJyfjthhMBpQd3kGG8ZXe7H4Cu9U3QzjOs,4929
270
+ dissect/target/plugins/os/windows/notifications.py,sha256=T1CIvQgpW__qDR0Rq5zpeWmRWwjNDpvdMnvJJ_6tZXs,17378
271
+ dissect/target/plugins/os/windows/prefetch.py,sha256=v4OgSKMwcihz0SOuA0o0Ec8wsAKuiuEmJolqZmHFgJA,10491
272
+ dissect/target/plugins/os/windows/recyclebin.py,sha256=zx58hDCvcrD_eJl9nJmr_i80krSN03ya8nQzWFr2Tw0,4917
273
273
  dissect/target/plugins/os/windows/registry.py,sha256=EfqUkgbzaqTuq1kIPYNG1TfvJxhJE5X-TEjV3K_xsPU,12814
274
- dissect/target/plugins/os/windows/sam.py,sha256=NTL6dez30i_E3R0mNmnYXMYc62DHqICWvpXy9g_2RY0,15478
274
+ dissect/target/plugins/os/windows/sam.py,sha256=NwKzfP_ae8SXgCoj_apa-29ZeFxeQsGidJ6llF1khP8,15468
275
275
  dissect/target/plugins/os/windows/services.py,sha256=MoVPJ1GKpPaJrGd2DYtuHEmKqC2uOKRc5SZKB12goSs,6068
276
276
  dissect/target/plugins/os/windows/sru.py,sha256=sOM7CyMkW8XIXzI75GL69WoqUrSK2X99TFIfdQR2D64,17767
277
277
  dissect/target/plugins/os/windows/startupinfo.py,sha256=kl8Y7M4nVfmJ71I33VCegtbHj-ZOeEsYAdlNbgwtUOA,3406
@@ -281,10 +281,10 @@ dissect/target/plugins/os/windows/thumbcache.py,sha256=23YjOjTNoE7BYITmg8s9Zs8Wi
281
281
  dissect/target/plugins/os/windows/ual.py,sha256=TYF-R46klEa_HHb86UJd6mPrXwHlAMOUTzC0pZ8uiq0,9787
282
282
  dissect/target/plugins/os/windows/wer.py,sha256=ogecvKYxAvDXLptQj4cn0JLn1FxaXjeSuJWs4JgkoZs,8656
283
283
  dissect/target/plugins/os/windows/dpapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
284
- dissect/target/plugins/os/windows/dpapi/blob.py,sha256=oFhksgx2BAaeAbpPwOM-o0Dw5MKaMLGMF6ETdxIS708,5051
284
+ dissect/target/plugins/os/windows/dpapi/blob.py,sha256=j3MMROXroes7pr_VLt8Xv6WEpv19hlgDpOxOJyZMRvo,5044
285
285
  dissect/target/plugins/os/windows/dpapi/crypto.py,sha256=_F1F2j1chQw-KLqfWvgL2mCkF3HSvdVnM78OZ0ph9hc,9337
286
286
  dissect/target/plugins/os/windows/dpapi/dpapi.py,sha256=NrLtx61m8PXsB3CzxUQgc1BKkaAVBOre1oEfGvqgtuw,7130
287
- dissect/target/plugins/os/windows/dpapi/master_key.py,sha256=nq6IpNLxE2UwuCTfc5BdKkn17g6AlVL4rpPUfwWf_8I,6127
287
+ dissect/target/plugins/os/windows/dpapi/master_key.py,sha256=oUuUfvMXmhRrgIs1CXTR6CdETKNYZwoStXSqtDdil78,6111
288
288
  dissect/target/plugins/os/windows/exchange/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
289
  dissect/target/plugins/os/windows/exchange/exchange.py,sha256=ofoapuDQXefIX4sTzwNboyk5RztN2JEyw1OWl5cx-wo,1564
290
290
  dissect/target/plugins/os/windows/log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -297,24 +297,24 @@ dissect/target/plugins/os/windows/log/schedlgu.py,sha256=JaP8H8eTEypWXhx2aFSR_IM
297
297
  dissect/target/plugins/os/windows/regf/7zip.py,sha256=Vc336zhS6R8W98GGlLtPJ_OR0vEP014QnBtYwbx_HUo,3217
298
298
  dissect/target/plugins/os/windows/regf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
299
  dissect/target/plugins/os/windows/regf/appxdebugkeys.py,sha256=X8MYLcD76pIZoIWwS_DgUp6q6pi2WO7jhZeoc4uGLak,3966
300
- dissect/target/plugins/os/windows/regf/auditpol.py,sha256=62WMlZwSzBb-99ujaeGkkOBui5qHOkvMHfACsqCmC0A,5140
301
- dissect/target/plugins/os/windows/regf/bam.py,sha256=iELyDeA-tdT6eXMZ5HHIVSAjH6vDvmS47D2xr4iX7Y8,2084
302
- dissect/target/plugins/os/windows/regf/cit.py,sha256=vErcoGfslyuZsaZiGbSGm6KxnJmUjobMwoy03jb6774,38244
300
+ dissect/target/plugins/os/windows/regf/auditpol.py,sha256=qAVYurAECRbTzopOgempCK2dOpeJ-a-pGNhHYJEtbP4,5149
301
+ dissect/target/plugins/os/windows/regf/bam.py,sha256=zS2vheHp4HEfrAhcIR06GoTq8Ofwhe3zd8uMPj7Y61Q,2076
302
+ dissect/target/plugins/os/windows/regf/cit.py,sha256=d8euaR9gyCZIQG8PwHEQR4_wB8l0ZUUUYYCQbHHfLzA,38238
303
303
  dissect/target/plugins/os/windows/regf/clsid.py,sha256=M121yHQgRDSGtXeShiB-RUuk_toHOFHLYwbHAP9SS8U,3632
304
304
  dissect/target/plugins/os/windows/regf/firewall.py,sha256=-RUFjY4D-ua72vyvOTJyg-MpUbk9Syfo4TfgA7bV7Us,3172
305
305
  dissect/target/plugins/os/windows/regf/mru.py,sha256=HYg4UnbsjvzZKS9qcqxkocUeIGQieMLXPjkjgZ1qbTY,13560
306
306
  dissect/target/plugins/os/windows/regf/muicache.py,sha256=-1IYfNpFjjk4WYyFUBJGLl7ahEGeUKqlaI1QwPNnfjA,3738
307
307
  dissect/target/plugins/os/windows/regf/nethist.py,sha256=QHbG9fmZNmjSVhrgqMvMo12YBaQedzeToS7ZD9eIJ28,3111
308
- dissect/target/plugins/os/windows/regf/recentfilecache.py,sha256=5JheHDmYc7udH-ZF7PwVTm0HfRY43diW0pmyyfHWZK0,1869
308
+ dissect/target/plugins/os/windows/regf/recentfilecache.py,sha256=goS6ajLIh6ZU-Gq4tupoxBoQCfMDp2qJgg-Nn5qFIsY,1850
309
309
  dissect/target/plugins/os/windows/regf/regf.py,sha256=D1GrljF-sV8cWIjWJ3zH7k52i1OWD8poEC_PIeZMEis,3419
310
310
  dissect/target/plugins/os/windows/regf/runkeys.py,sha256=-2HcdnVytzCt1xwgAI8rHDnwk8kwLPWURumvhrGnIHU,4278
311
- dissect/target/plugins/os/windows/regf/shellbags.py,sha256=EKBWBjxvSfxc7WFKmICZs8QUJnjhsCKesjl_NHEnSUo,25621
312
- dissect/target/plugins/os/windows/regf/shimcache.py,sha256=0THEJQtMHACAI70jrThMCrxAVgQv5XxqkRD1MY03VpE,10003
311
+ dissect/target/plugins/os/windows/regf/shellbags.py,sha256=t6874fvnZoQ05H0-G95-a8RpmCWjz0dli6hHGu5jBEQ,25615
312
+ dissect/target/plugins/os/windows/regf/shimcache.py,sha256=no78i0nxbnfgDJ5TpDZNAJggCigD_zLrXNYss7gdg2Q,9994
313
313
  dissect/target/plugins/os/windows/regf/trusteddocs.py,sha256=3yvpBDM-Asg0rvGN2TwALGRm9DYogG6TxRau9D6FBbw,3700
314
314
  dissect/target/plugins/os/windows/regf/usb.py,sha256=hR5fnqy_sint1YyWgm1-AMhGQ4MxJOH_Wz0vbYzr9p4,7213
315
- dissect/target/plugins/os/windows/regf/userassist.py,sha256=36uI_tSGUx-lOUZ1Io_2ofHTLHzriFA3F6XMR61H0wc,5500
315
+ dissect/target/plugins/os/windows/regf/userassist.py,sha256=bSioEQdqUxdGwkdgMUfDIY2_pzrl9PdxPjmzmMaIwHs,5490
316
316
  dissect/target/plugins/os/windows/task_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
317
- dissect/target/plugins/os/windows/task_helpers/tasks_job.py,sha256=-dCkJnyEiWG9nCK378-GswM5EXelrA_g3zDHLhSQMu0,21199
317
+ dissect/target/plugins/os/windows/task_helpers/tasks_job.py,sha256=7w3UGOiTAUQkP3xQ3sj4X3MTgHUJmmfdgiEadWmYquI,21197
318
318
  dissect/target/plugins/os/windows/task_helpers/tasks_records.py,sha256=vpCyKqLQSzI5ymD1h5P6RncLEE47YtmjDFwKA16dVZ4,4046
319
319
  dissect/target/plugins/os/windows/task_helpers/tasks_xml.py,sha256=oOsYse2-BrliVQRXlHD1-89hsmNrJqg42DJy681AW0U,15268
320
320
  dissect/target/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -340,10 +340,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
340
340
  dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
341
341
  dissect/target/volumes/md.py,sha256=j1K1iKmspl0C_OJFc7-Q1BMWN2OCC5EVANIgVlJ_fIE,1673
342
342
  dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
343
- dissect.target-3.18.dev6.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
344
- dissect.target-3.18.dev6.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
345
- dissect.target-3.18.dev6.dist-info/METADATA,sha256=pep2cQIYZZY6yeV07oBPPNq-6e2LnrUig_hkv-5IiEk,11299
346
- dissect.target-3.18.dev6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
347
- dissect.target-3.18.dev6.dist-info/entry_points.txt,sha256=tvFPa-Ap-gakjaPwRc6Fl6mxHzxEZ_arAVU-IUYeo_s,447
348
- dissect.target-3.18.dev6.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
349
- dissect.target-3.18.dev6.dist-info/RECORD,,
343
+ dissect.target-3.18.dev7.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
344
+ dissect.target-3.18.dev7.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
345
+ dissect.target-3.18.dev7.dist-info/METADATA,sha256=QdjX1XeAbDN3B7UZr8WzmJzjVQzvv8GSxqOH-5LgBgg,12722
346
+ dissect.target-3.18.dev7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
347
+ dissect.target-3.18.dev7.dist-info/entry_points.txt,sha256=tvFPa-Ap-gakjaPwRc6Fl6mxHzxEZ_arAVU-IUYeo_s,447
348
+ dissect.target-3.18.dev7.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
349
+ dissect.target-3.18.dev7.dist-info/RECORD,,