dissect.target 3.20.2.dev31__tar.gz → 3.20.2.dev33__tar.gz

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.
Files changed (683) hide show
  1. {dissect_target-3.20.2.dev31/dissect.target.egg-info → dissect_target-3.20.2.dev33}/PKG-INFO +1 -1
  2. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/regutil.py +19 -7
  3. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/utils.py +5 -2
  4. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loader.py +1 -1
  5. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/cb.py +8 -3
  6. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/smb.py +8 -3
  7. dissect_target-3.20.2.dev33/dissect/target/loaders/vmx.py +73 -0
  8. dissect_target-3.20.2.dev33/dissect/target/plugins/apps/productivity/msoffice.py +416 -0
  9. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/resolver.py +3 -3
  10. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/network.py +1 -1
  11. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/registry.py +23 -6
  12. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33/dissect.target.egg-info}/PKG-INFO +1 -1
  13. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect.target.egg-info/SOURCES.txt +3 -0
  14. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_utils.py +1 -1
  15. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_vmwarevm.py +9 -8
  16. dissect_target-3.20.2.dev33/tests/loaders/test_vmx.py +138 -0
  17. dissect_target-3.20.2.dev33/tests/plugins/apps/productivity/test_msoffice.py +135 -0
  18. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/test_resolver.py +13 -8
  19. dissect_target-3.20.2.dev31/dissect/target/loaders/vmx.py +0 -31
  20. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/COPYRIGHT +0 -0
  21. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/LICENSE +0 -0
  22. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/MANIFEST.in +0 -0
  23. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/README.md +0 -0
  24. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/__init__.py +0 -0
  25. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/container.py +0 -0
  26. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/__init__.py +0 -0
  27. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/asdf.py +0 -0
  28. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/ewf.py +0 -0
  29. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/fortifw.py +0 -0
  30. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/hdd.py +0 -0
  31. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/hds.py +0 -0
  32. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/qcow2.py +0 -0
  33. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/raw.py +0 -0
  34. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/split.py +0 -0
  35. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/vdi.py +0 -0
  36. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/vhd.py +0 -0
  37. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/vhdx.py +0 -0
  38. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/containers/vmdk.py +0 -0
  39. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  40. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/exceptions.py +0 -0
  41. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystem.py +0 -0
  42. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/__init__.py +0 -0
  43. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/ad1.py +0 -0
  44. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/btrfs.py +0 -0
  45. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/cb.py +0 -0
  46. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/config.py +0 -0
  47. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/cpio.py +0 -0
  48. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/dir.py +0 -0
  49. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/exfat.py +0 -0
  50. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/extfs.py +0 -0
  51. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/fat.py +0 -0
  52. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/ffs.py +0 -0
  53. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/itunes.py +0 -0
  54. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/jffs.py +0 -0
  55. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/ntfs.py +0 -0
  56. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/overlay.py +0 -0
  57. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/smb.py +0 -0
  58. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/squashfs.py +0 -0
  59. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/tar.py +0 -0
  60. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/vmfs.py +0 -0
  61. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/vmtar.py +0 -0
  62. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/xfs.py +0 -0
  63. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/filesystems/zip.py +0 -0
  64. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/__init__.py +0 -0
  65. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/cache.py +0 -0
  66. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/compat/__init__.py +0 -0
  67. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/compat/path_310.py +0 -0
  68. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/compat/path_311.py +0 -0
  69. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/compat/path_312.py +0 -0
  70. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/compat/path_39.py +0 -0
  71. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/compat/path_common.py +0 -0
  72. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/config.py +0 -0
  73. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/configutil.py +0 -0
  74. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/cyber.py +0 -0
  75. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/data/windowsZones.xml +0 -0
  76. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/descriptor_extensions.py +0 -0
  77. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/docs.py +0 -0
  78. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/fsutil.py +0 -0
  79. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/hashutil.py +0 -0
  80. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/keychain.py +0 -0
  81. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/lazy.py +0 -0
  82. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/loaderutil.py +0 -0
  83. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/localeutil.py +0 -0
  84. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/mount.py +0 -0
  85. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/mui.py +0 -0
  86. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/polypath.py +0 -0
  87. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/protobuf.py +0 -0
  88. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/record.py +0 -0
  89. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/record_modifier.py +0 -0
  90. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/shell_application_ids.py +0 -0
  91. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/helpers/shell_folder_ids.py +0 -0
  92. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/__init__.py +0 -0
  93. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/ab.py +0 -0
  94. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/ad1.py +0 -0
  95. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/asdf.py +0 -0
  96. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/cyber.py +0 -0
  97. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/dir.py +0 -0
  98. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/hyperv.py +0 -0
  99. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/itunes.py +0 -0
  100. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/kape.py +0 -0
  101. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/libvirt.py +0 -0
  102. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/local.py +0 -0
  103. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/log.py +0 -0
  104. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/mqtt.py +0 -0
  105. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/multiraw.py +0 -0
  106. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/ova.py +0 -0
  107. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/overlay.py +0 -0
  108. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/ovf.py +0 -0
  109. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/phobos.py +0 -0
  110. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/profile.py +0 -0
  111. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/proxmox.py +0 -0
  112. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/pvm.py +0 -0
  113. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/pvs.py +0 -0
  114. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/raw.py +0 -0
  115. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/remote.py +0 -0
  116. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/res.py +0 -0
  117. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/tanium.py +0 -0
  118. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/tar.py +0 -0
  119. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/target.py +0 -0
  120. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/utm.py +0 -0
  121. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/vb.py +0 -0
  122. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/vbox.py +0 -0
  123. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/velociraptor.py +0 -0
  124. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/vma.py +0 -0
  125. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/vmwarevm.py +0 -0
  126. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/loaders/xva.py +0 -0
  127. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugin.py +0 -0
  128. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/__init__.py +0 -0
  129. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/__init__.py +0 -0
  130. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/av/__init__.py +0 -0
  131. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  132. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/av/sophos.py +0 -0
  133. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/av/symantec.py +0 -0
  134. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  135. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  136. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/brave.py +0 -0
  137. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/browser.py +0 -0
  138. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/chrome.py +0 -0
  139. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/chromium.py +0 -0
  140. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/edge.py +0 -0
  141. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/firefox.py +0 -0
  142. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  143. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/container/__init__.py +0 -0
  144. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/container/docker.py +0 -0
  145. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/database/__init__.py +0 -0
  146. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/editor/__init__.py +0 -0
  147. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/editor/editor.py +0 -0
  148. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/editor/windowsnotepad.py +0 -0
  149. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/other/__init__.py +0 -0
  150. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/other/env.py +0 -0
  151. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
  152. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
  153. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
  154. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
  155. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/shell/__init__.py +0 -0
  156. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  157. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/shell/wget.py +0 -0
  158. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
  159. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
  160. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  161. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/ssh/putty.py +0 -0
  162. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/ssh/ssh.py +0 -0
  163. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/virtualization/__init__.py +0 -0
  164. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/virtualization/vmware_workstation.py +0 -0
  165. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
  166. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  167. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  168. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
  169. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  170. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
  171. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  172. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  173. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
  174. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  175. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  176. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  177. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/__init__.py +0 -0
  178. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/docker.py +0 -0
  179. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/esxi.py +0 -0
  180. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/hyperv.py +0 -0
  181. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/parallels.py +0 -0
  182. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/proxmox.py +0 -0
  183. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/qemu.py +0 -0
  184. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/virtuozzo.py +0 -0
  185. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  186. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/child/wsl.py +0 -0
  187. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/__init__.py +0 -0
  188. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  189. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  190. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/icat.py +0 -0
  191. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
  192. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
  193. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  194. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  195. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  196. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
  197. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
  198. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  199. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/walkfs.py +0 -0
  200. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/filesystem/yara.py +0 -0
  201. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/__init__.py +0 -0
  202. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/config.py +0 -0
  203. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/example.py +0 -0
  204. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/loaders.py +0 -0
  205. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/osinfo.py +0 -0
  206. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/plugins.py +0 -0
  207. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/scrape.py +0 -0
  208. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/general/users.py +0 -0
  209. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/__init__.py +0 -0
  210. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/default/__init__.py +0 -0
  211. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/default/_os.py +0 -0
  212. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/default/network.py +0 -0
  213. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/__init__.py +0 -0
  214. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/_os.py +0 -0
  215. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/applications.py +0 -0
  216. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/__init__.py +0 -0
  217. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  218. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  219. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  220. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/citrix/history.py +0 -0
  221. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
  222. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
  223. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
  224. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  225. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
  226. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  227. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
  228. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  229. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/osx/network.py +0 -0
  230. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  231. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  232. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/datetime.py +0 -0
  233. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/esxi/__init__.py +0 -0
  234. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/esxi/_os.py +0 -0
  235. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/etc/__init__.py +0 -0
  236. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/etc/etc.py +0 -0
  237. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/generic.py +0 -0
  238. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/history.py +0 -0
  239. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
  240. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
  241. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
  242. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
  243. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  244. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
  245. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  246. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  247. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  248. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/proxmox/__init__.py +0 -0
  249. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/proxmox/_os.py +0 -0
  250. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/proxmox/vm.py +0 -0
  251. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/snap.py +0 -0
  252. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
  253. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  254. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  255. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/fortios/__init__.py +0 -0
  256. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/fortios/_keys.py +0 -0
  257. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/fortios/_os.py +0 -0
  258. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/fortios/generic.py +0 -0
  259. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/fortios/locale.py +0 -0
  260. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  261. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  262. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  263. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/network_managers.py +0 -0
  264. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  265. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  266. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
  267. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
  268. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  269. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/services.py +0 -0
  270. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  271. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
  272. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  273. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  274. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/locale.py +0 -0
  275. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/locate/__init__.py +0 -0
  276. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/locate/gnulocate.py +0 -0
  277. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/locate/locate.py +0 -0
  278. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/locate/mlocate.py +0 -0
  279. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/locate/plocate.py +0 -0
  280. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
  281. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  282. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  283. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  284. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/helpers.py +0 -0
  285. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  286. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  287. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  288. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  289. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
  290. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/shadow.py +0 -0
  291. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/unix/trash.py +0 -0
  292. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/__init__.py +0 -0
  293. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/_os.py +0 -0
  294. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  295. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
  296. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/amcache.py +0 -0
  297. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/catroot.py +0 -0
  298. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/cim.py +0 -0
  299. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/clfs.py +0 -0
  300. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/credential/__init__.py +0 -0
  301. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/credential/credhist.py +0 -0
  302. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/credential/lsa.py +0 -0
  303. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/credential/sam.py +0 -0
  304. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/datetime.py +0 -0
  305. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/defender.py +0 -0
  306. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/defender_helpers/__init__.py +0 -0
  307. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/defender_helpers/defender_patterns.py +0 -0
  308. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/defender_helpers/defender_records.py +0 -0
  309. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
  310. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
  311. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
  312. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
  313. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/keyprovider/__init__.py +0 -0
  314. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/keyprovider/credhist.py +0 -0
  315. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/keyprovider/empty.py +0 -0
  316. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/keyprovider/keychain.py +0 -0
  317. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/keyprovider/keyprovider.py +0 -0
  318. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/keyprovider/lsa.py +0 -0
  319. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
  320. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/env.py +0 -0
  321. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
  322. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  323. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/generic.py +0 -0
  324. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/jumplist.py +0 -0
  325. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/lnk.py +0 -0
  326. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/locale.py +0 -0
  327. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
  328. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  329. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  330. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/evt.py +0 -0
  331. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  332. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/mssql.py +0 -0
  333. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  334. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/log/schedlgu.py +0 -0
  335. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/network.py +0 -0
  336. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/notifications.py +0 -0
  337. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  338. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  339. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
  340. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
  341. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/applications.py +0 -0
  342. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  343. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  344. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  345. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/cam.py +0 -0
  346. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  347. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  348. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  349. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  350. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  351. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  352. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  353. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  354. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  355. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  356. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
  357. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  358. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
  359. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  360. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/services.py +0 -0
  361. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/sru.py +0 -0
  362. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  363. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/syscache.py +0 -0
  364. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/task_helpers/__init__.py +0 -0
  365. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
  366. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
  367. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +0 -0
  368. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/tasks.py +0 -0
  369. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  370. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/ual.py +0 -0
  371. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/wer.py +0 -0
  372. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/plugins/os/windows/wua_history.py +0 -0
  373. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/report.py +0 -0
  374. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/target.py +0 -0
  375. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/__init__.py +0 -0
  376. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/build_pluginlist.py +0 -0
  377. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/dd.py +0 -0
  378. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/diff.py +0 -0
  379. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/dump/__init__.py +0 -0
  380. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/dump/run.py +0 -0
  381. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/dump/state.py +0 -0
  382. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/dump/utils.py +0 -0
  383. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/fs.py +0 -0
  384. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/fsutils.py +0 -0
  385. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/info.py +0 -0
  386. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/logging.py +0 -0
  387. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/mount.py +0 -0
  388. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/query.py +0 -0
  389. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/reg.py +0 -0
  390. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/shell.py +0 -0
  391. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/utils.py +0 -0
  392. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/tools/yara.py +0 -0
  393. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volume.py +0 -0
  394. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/__init__.py +0 -0
  395. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/bde.py +0 -0
  396. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/ddf.py +0 -0
  397. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/disk.py +0 -0
  398. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/luks.py +0 -0
  399. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/lvm.py +0 -0
  400. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/md.py +0 -0
  401. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect/target/volumes/vmfs.py +0 -0
  402. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect.target.egg-info/dependency_links.txt +0 -0
  403. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect.target.egg-info/entry_points.txt +0 -0
  404. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect.target.egg-info/requires.txt +0 -0
  405. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/dissect.target.egg-info/top_level.txt +0 -0
  406. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/pyproject.toml +0 -0
  407. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/setup.cfg +0 -0
  408. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/__init__.py +0 -0
  409. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/_docs/Makefile +0 -0
  410. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/_docs/conf.py +0 -0
  411. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/_docs/index.rst +0 -0
  412. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/_utils.py +0 -0
  413. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/conftest.py +0 -0
  414. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/containers/__init__.py +0 -0
  415. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/containers/test_fortifw.py +0 -0
  416. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/containers/test_split.py +0 -0
  417. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/__init__.py +0 -0
  418. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_btrfs.py +0 -0
  419. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_cb.py +0 -0
  420. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_config.py +0 -0
  421. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_cpio.py +0 -0
  422. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_dir.py +0 -0
  423. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_exfat.py +0 -0
  424. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_extfs.py +0 -0
  425. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_fat.py +0 -0
  426. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_ffs.py +0 -0
  427. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_jffs2.py +0 -0
  428. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_ntfs.py +0 -0
  429. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_overlay.py +0 -0
  430. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_smb.py +0 -0
  431. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_tar.py +0 -0
  432. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_vmtar.py +0 -0
  433. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_xfs.py +0 -0
  434. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/filesystems/test_zip.py +0 -0
  435. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/__init__.py +0 -0
  436. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_cache.py +0 -0
  437. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_config.py +0 -0
  438. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_configutil.py +0 -0
  439. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_docs.py +0 -0
  440. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_fsutil.py +0 -0
  441. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_hashutil.py +0 -0
  442. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_keychain.py +0 -0
  443. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_loaderutil.py +0 -0
  444. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_localeutil.py +0 -0
  445. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_modifier.py +0 -0
  446. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_protobuf.py +0 -0
  447. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_record.py +0 -0
  448. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/helpers/test_regutil.py +0 -0
  449. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/__init__.py +0 -0
  450. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_ab.py +0 -0
  451. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_asdf.py +0 -0
  452. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_cb.py +0 -0
  453. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_dir.py +0 -0
  454. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_hyperv.py +0 -0
  455. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_itunes.py +0 -0
  456. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_kape.py +0 -0
  457. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_libvirt.py +0 -0
  458. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_local.py +0 -0
  459. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_log.py +0 -0
  460. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_mqtt.py +0 -0
  461. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_multiraw.py +0 -0
  462. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_ova.py +0 -0
  463. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_overlay.py +0 -0
  464. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_ovf.py +0 -0
  465. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_phobos.py +0 -0
  466. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_pvm.py +0 -0
  467. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_pvs.py +0 -0
  468. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_remote.py +0 -0
  469. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_smb.py +0 -0
  470. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_tanium.py +0 -0
  471. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_tar.py +0 -0
  472. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_utm.py +0 -0
  473. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_vbox.py +0 -0
  474. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/loaders/test_velociraptor.py +0 -0
  475. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/__init__.py +0 -0
  476. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/__init__.py +0 -0
  477. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/av/__init__.py +0 -0
  478. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/av/test_mcafee.py +0 -0
  479. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/av/test_sophos.py +0 -0
  480. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/av/test_symantec.py +0 -0
  481. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  482. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/browser/__init__.py +0 -0
  483. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/browser/test_brave.py +0 -0
  484. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/browser/test_chrome.py +0 -0
  485. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/browser/test_chromium.py +0 -0
  486. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/browser/test_edge.py +0 -0
  487. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/browser/test_firefox.py +0 -0
  488. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/browser/test_iexplore.py +0 -0
  489. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/container/__init__.py +0 -0
  490. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/container/test_docker.py +0 -0
  491. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/editor/__init__.py +0 -0
  492. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/editor/test_windowsnotepad.py +0 -0
  493. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/other/__init__.py +0 -0
  494. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/other/test_envfile.py +0 -0
  495. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/remoteaccess/__init__.py +0 -0
  496. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
  497. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
  498. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/shell/__init__.py +0 -0
  499. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/shell/test_powershell.py +0 -0
  500. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/shell/test_wget.py +0 -0
  501. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/ssh/__init__.py +0 -0
  502. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  503. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  504. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/ssh/test_putty.py +0 -0
  505. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/virtualization/__init__.py +0 -0
  506. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/virtualization/test_vmware_workstation.py +0 -0
  507. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/vpn/__init__.py +0 -0
  508. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  509. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  510. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webhosting/__init__.py +0 -0
  511. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  512. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webserver/__init__.py +0 -0
  513. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webserver/test_apache.py +0 -0
  514. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  515. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webserver/test_citrix.py +0 -0
  516. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webserver/test_iis.py +0 -0
  517. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  518. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/apps/webserver/test_webserver.py +0 -0
  519. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/__init__.py +0 -0
  520. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/test_docker.py +0 -0
  521. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/test_hyperv.py +0 -0
  522. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/test_parallels.py +0 -0
  523. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/test_qemu.py +0 -0
  524. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/test_virtuozzo.py +0 -0
  525. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/test_vmware_workstation.py +0 -0
  526. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/child/test_wsl.py +0 -0
  527. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/__init__.py +0 -0
  528. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/ntfs/__init__.py +0 -0
  529. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
  530. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  531. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  532. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  533. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/test_icat.py +0 -0
  534. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/test_walkfs.py +0 -0
  535. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/test_yara.py +0 -0
  536. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/unix/__init__.py +0 -0
  537. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/unix/test_capability.py +0 -0
  538. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  539. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/general/__init__.py +0 -0
  540. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/general/test_config.py +0 -0
  541. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/general/test_default.py +0 -0
  542. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/general/test_network.py +0 -0
  543. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/general/test_plugins.py +0 -0
  544. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/general/test_scrape.py +0 -0
  545. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/general/test_users.py +0 -0
  546. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/__init__.py +0 -0
  547. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/__init__.py +0 -0
  548. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/__init__.py +0 -0
  549. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  550. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  551. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/citrix/test_history.py +0 -0
  552. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/osx/__init__.py +0 -0
  553. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  554. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/osx/test_network.py +0 -0
  555. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  556. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/esxi/__init__.py +0 -0
  557. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/esxi/test__os.py +0 -0
  558. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/__init__.py +0 -0
  559. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/android/__init__.py +0 -0
  560. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  561. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/debian/__init__.py +0 -0
  562. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/debian/proxmox/__init__.py +0 -0
  563. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/debian/proxmox/test__os.py +0 -0
  564. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  565. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  566. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/debian/test_snap.py +0 -0
  567. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/fortios/__init__.py +0 -0
  568. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/fortios/test__os.py +0 -0
  569. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/fortios/test_keys.py +0 -0
  570. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/redhat/__init__.py +0 -0
  571. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  572. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/suse/__init__.py +0 -0
  573. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  574. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test__os.py +0 -0
  575. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  576. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  577. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  578. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  579. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  580. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_network.py +0 -0
  581. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  582. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  583. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_services.py +0 -0
  584. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  585. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/locate/__init__.py +0 -0
  586. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/locate/test_gnulocate.py +0 -0
  587. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/locate/test_mlocate.py +0 -0
  588. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/locate/test_plocate.py +0 -0
  589. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/__init__.py +0 -0
  590. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_atop.py +0 -0
  591. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_audit.py +0 -0
  592. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_auth.py +0 -0
  593. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_helpers.py +0 -0
  594. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_journal.py +0 -0
  595. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  596. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_messages.py +0 -0
  597. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  598. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test__os.py +0 -0
  599. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_applications.py +0 -0
  600. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_generic.py +0 -0
  601. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_history.py +0 -0
  602. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_ips.py +0 -0
  603. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_locale.py +0 -0
  604. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  605. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_shadow.py +0 -0
  606. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_trash.py +0 -0
  607. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_users.py +0 -0
  608. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/unix/test_version.py +0 -0
  609. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/__init__.py +0 -0
  610. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/credential/__init__.py +0 -0
  611. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/credential/test_credhist.py +0 -0
  612. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/credential/test_lsa.py +0 -0
  613. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/credential/test_sam.py +0 -0
  614. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/log/test_amcache.py +0 -0
  615. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/log/test_etl.py +0 -0
  616. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/log/test_evt.py +0 -0
  617. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/log/test_evtx.py +0 -0
  618. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/log/test_mssql.py +0 -0
  619. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/log/test_schedlgu.py +0 -0
  620. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/__init__.py +0 -0
  621. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_applications.py +0 -0
  622. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  623. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_cam.py +0 -0
  624. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  625. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  626. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  627. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_shellbags.py +0 -0
  628. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  629. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_usb.py +0 -0
  630. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  631. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test__os.py +0 -0
  632. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  633. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_catroot.py +0 -0
  634. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_clfs.py +0 -0
  635. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_datetime.py +0 -0
  636. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_defender.py +0 -0
  637. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_dpapi.py +0 -0
  638. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_env.py +0 -0
  639. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_generic.py +0 -0
  640. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_jumplist.py +0 -0
  641. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_lnk.py +0 -0
  642. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_locale.py +0 -0
  643. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_mru.py +0 -0
  644. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_network.py +0 -0
  645. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_notifications.py +0 -0
  646. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_prefetch.py +0 -0
  647. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  648. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_registry.py +0 -0
  649. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_shimcache.py +0 -0
  650. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_sru.py +0 -0
  651. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_syscache.py +0 -0
  652. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_tasks.py +0 -0
  653. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  654. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_ual.py +0 -0
  655. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_wer.py +0 -0
  656. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/plugins/os/windows/test_wua_history.py +0 -0
  657. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_container.py +0 -0
  658. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_exceptions.py +0 -0
  659. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_filesystem.py +0 -0
  660. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_plugin.py +0 -0
  661. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_registration.py +0 -0
  662. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_report.py +0 -0
  663. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_target.py +0 -0
  664. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_tests.py +0 -0
  665. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/test_volume.py +0 -0
  666. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/__init__.py +0 -0
  667. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/conftest.py +0 -0
  668. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_build_pluginlist.py +0 -0
  669. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_diff.py +0 -0
  670. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_dump.py +0 -0
  671. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_fs.py +0 -0
  672. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_fsutils.py +0 -0
  673. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_info.py +0 -0
  674. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_mount.py +0 -0
  675. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_query.py +0 -0
  676. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_reg.py +0 -0
  677. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_shell.py +0 -0
  678. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_utils.py +0 -0
  679. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/tools/test_yara.py +0 -0
  680. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/volumes/__init__.py +0 -0
  681. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/volumes/test_bde.py +0 -0
  682. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tests/volumes/test_md.py +0 -0
  683. {dissect_target-3.20.2.dev31 → dissect_target-3.20.2.dev33}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dissect.target
3
- Version: 3.20.2.dev31
3
+ Version: 3.20.2.dev33
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
@@ -10,7 +10,7 @@ from enum import IntEnum
10
10
  from functools import cached_property
11
11
  from io import BytesIO
12
12
  from pathlib import Path
13
- from typing import BinaryIO, Iterator, Optional, TextIO, Union
13
+ from typing import BinaryIO, Iterator, NewType, Optional, TextIO, Union
14
14
 
15
15
  from dissect.regf import c_regf, regf
16
16
 
@@ -26,7 +26,7 @@ GLOB_MAGIC_REGEX = re.compile(r"[*?[]")
26
26
  KeyType = Union[regf.IndexLeaf, regf.FastLeaf, regf.HashLeaf, regf.IndexRoot, regf.NamedKey]
27
27
  """The possible key types that can be returned from the registry."""
28
28
 
29
- ValueType = Union[int, str, bytes, list[str]]
29
+ ValueType = Union[int, str, bytes, list[str], None]
30
30
  """The possible value types that can be returned from the registry."""
31
31
 
32
32
 
@@ -161,15 +161,27 @@ class RegistryKey:
161
161
  """Returns a list of subkeys from this key."""
162
162
  raise NotImplementedError()
163
163
 
164
- def value(self, value: str) -> RegistryValue:
164
+ Marker = NewType("Marker", object)
165
+ __marker = Marker(object())
166
+
167
+ def value(self, value: str, default: ValueType | Marker = __marker) -> RegistryValue:
165
168
  """Returns a specific value from this key.
166
169
 
167
170
  Args:
168
171
  value: The name of the value to retrieve.
172
+ default: An optional argument that specifies the default return value in case the value cannot be found.
169
173
 
170
174
  Raises:
171
- RegistryValueNotFoundError: If this key has no value with the requested name.
175
+ RegistryValueNotFoundError: If this key has no value with the requested name and default is not defined.
172
176
  """
177
+ try:
178
+ return self._value(value)
179
+ except RegistryValueNotFoundError:
180
+ if default is self.__marker:
181
+ raise
182
+ return VirtualValue(self.hive, value, default)
183
+
184
+ def _value(self, value: str) -> RegistryValue:
173
185
  raise NotImplementedError()
174
186
 
175
187
  def values(self) -> list[RegistryValue]:
@@ -400,7 +412,7 @@ class VirtualKey(RegistryKey):
400
412
 
401
413
  return res.values()
402
414
 
403
- def value(self, value: str) -> RegistryValue:
415
+ def _value(self, value: str) -> RegistryValue:
404
416
  try:
405
417
  return self._values[value.lower()]
406
418
  except KeyError:
@@ -588,7 +600,7 @@ class KeyCollection(RegistryKey):
588
600
 
589
601
  return ret.values()
590
602
 
591
- def value(self, value: str) -> ValueCollection:
603
+ def _value(self, value: str) -> ValueCollection:
592
604
  ret = ValueCollection()
593
605
  for key in self:
594
606
  try:
@@ -698,7 +710,7 @@ class RegfKey(RegistryKey):
698
710
  def subkeys(self) -> list[RegistryKey]:
699
711
  return [RegfKey(self.hive, k) for k in self.key.subkeys()]
700
712
 
701
- def value(self, value: str) -> RegistryValue:
713
+ def _value(self, value: str) -> RegistryValue:
702
714
  try:
703
715
  return RegfValue(self.hive, self.key.value(value))
704
716
  except regf.RegistryValueNotFoundError as e:
@@ -29,8 +29,8 @@ def findall(buf: bytes, needle: bytes) -> Iterator[int]:
29
29
  T = TypeVar("T")
30
30
 
31
31
 
32
- def to_list(value: T | list[T]) -> list[T]:
33
- """Convert a single value or a list of values to a list.
32
+ def to_list(value: T | list[T] | None) -> list[T]:
33
+ """Convert a single value or a list of values to a list. A value of ``None`` is converted to an empty list.
34
34
 
35
35
  Args:
36
36
  value: The value to convert.
@@ -38,8 +38,11 @@ def to_list(value: T | list[T]) -> list[T]:
38
38
  Returns:
39
39
  A list of values.
40
40
  """
41
+ if value is None:
42
+ return []
41
43
  if not isinstance(value, list):
42
44
  return [value]
45
+
43
46
  return value
44
47
 
45
48
 
@@ -61,7 +61,7 @@ class Loader:
61
61
  def __init__(self, path: Path, **kwargs):
62
62
  self.path = path
63
63
 
64
- def __repr__(self):
64
+ def __repr__(self) -> str:
65
65
  return f"{self.__class__.__name__}('{self.path}')"
66
66
 
67
67
  @staticmethod
@@ -25,7 +25,12 @@ from dissect.target.exceptions import (
25
25
  )
26
26
  from dissect.target.filesystems.cb import CbFilesystem
27
27
  from dissect.target.helpers.fsutil import TargetPath
28
- from dissect.target.helpers.regutil import RegistryHive, RegistryKey, RegistryValue
28
+ from dissect.target.helpers.regutil import (
29
+ RegistryHive,
30
+ RegistryKey,
31
+ RegistryValue,
32
+ ValueType,
33
+ )
29
34
  from dissect.target.loader import Loader
30
35
  from dissect.target.plugins.os.windows.registry import RegistryPlugin
31
36
 
@@ -161,7 +166,7 @@ class CbRegistryKey(RegistryKey):
161
166
  def subkeys(self) -> list[CbRegistryKey]:
162
167
  return list(map(self.subkey, self.data["sub_keys"]))
163
168
 
164
- def value(self, value: str) -> str:
169
+ def _value(self, value: str) -> CbRegistryValue:
165
170
  reg_value = value.lower()
166
171
  for val in self.values():
167
172
  if val.name.lower() == reg_value:
@@ -197,7 +202,7 @@ class CbRegistryValue(RegistryValue):
197
202
  return self._name
198
203
 
199
204
  @property
200
- def value(self) -> str:
205
+ def value(self) -> ValueType:
201
206
  return self._value
202
207
 
203
208
  @property
@@ -22,7 +22,12 @@ from dissect.target.exceptions import (
22
22
  )
23
23
  from dissect.target.filesystems.smb import SmbFilesystem
24
24
  from dissect.target.helpers.fsutil import TargetPath
25
- from dissect.target.helpers.regutil import RegistryHive, RegistryKey, RegistryValue
25
+ from dissect.target.helpers.regutil import (
26
+ RegistryHive,
27
+ RegistryKey,
28
+ RegistryValue,
29
+ ValueType,
30
+ )
26
31
  from dissect.target.loader import Loader
27
32
  from dissect.target.plugins.os.windows._os import WindowsPlugin
28
33
  from dissect.target.plugins.os.windows.registry import RegistryPlugin
@@ -308,7 +313,7 @@ class SmbRegistryKey(RegistryKey):
308
313
 
309
314
  return subkeys
310
315
 
311
- def value(self, value: str) -> str:
316
+ def _value(self, value: str) -> SmbRegistryValue:
312
317
  reg_value = value.lower()
313
318
  for val in self.values():
314
319
  if val.name.lower() == reg_value:
@@ -351,7 +356,7 @@ class SmbRegistryValue(RegistryValue):
351
356
  return self._name
352
357
 
353
358
  @property
354
- def value(self) -> str:
359
+ def value(self) -> ValueType:
355
360
  return self._value
356
361
 
357
362
  @property
@@ -0,0 +1,73 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from dissect.hypervisor import vmx
6
+
7
+ from dissect.target.containers.vmdk import VmdkContainer
8
+ from dissect.target.loader import Loader
9
+
10
+ if TYPE_CHECKING:
11
+ from pathlib import Path
12
+
13
+ from dissect.target.target import Target
14
+
15
+
16
+ class VmxLoader(Loader):
17
+ """Load VMware virtual machine configuration (VMX) files.
18
+
19
+ References:
20
+ - https://docs.vmware.com/en/VMware-Workstation-Pro/17/com.vmware.ws.using.doc/GUID-A968EF50-BA25-450A-9D1F-F8A9DEE640E7.html # noqa
21
+ """
22
+
23
+ def __init__(self, path: Path, **kwargs):
24
+ super().__init__(path.resolve())
25
+ self.vmx = vmx.VMX.parse(self.path.read_text())
26
+
27
+ @staticmethod
28
+ def detect(path: Path) -> bool:
29
+ return path.suffix.lower() in (".vmx", ".vmtx")
30
+
31
+ def map(self, target: Target) -> None:
32
+ for disk in self.vmx.disks():
33
+ path = self.path.parent.joinpath(disk)
34
+
35
+ if not path.is_file():
36
+ base, sep, snapshot_id = path.stem.rpartition("-")
37
+ if sep and len(snapshot_id) == 6 and snapshot_id.isdigit():
38
+ # Probably a snapshot, try to load the parent disk
39
+ target.log.info(
40
+ "Disk not found but seems to be a snapshot, trying previous snapshots: %s", path.name
41
+ )
42
+
43
+ snapshot_num = int(snapshot_id)
44
+ missing = [path.name]
45
+ for i in range(snapshot_num - 1, -1, -1):
46
+ snapshot_disk = (
47
+ path.with_name(f"{base}{path.suffix}")
48
+ if i == 0
49
+ else path.with_name(f"{base}-{i:06d}{path.suffix}")
50
+ )
51
+ target.log.debug("Trying to load snapshot: %s", snapshot_disk.name)
52
+
53
+ if snapshot_disk.is_file():
54
+ target.log.warning(
55
+ "Missing disk(s) but continuing with found snapshot: %s (missing %s)",
56
+ snapshot_disk.name,
57
+ ", ".join(missing),
58
+ )
59
+ path = snapshot_disk
60
+ break
61
+
62
+ missing.append(snapshot_disk.name)
63
+ else:
64
+ target.log.error("Failed to find previous snapshot for disk: %s", path.name)
65
+ continue
66
+ else:
67
+ target.log.error("Disk not found: %s", path.name)
68
+ continue
69
+
70
+ try:
71
+ target.disks.add(VmdkContainer(path))
72
+ except Exception:
73
+ target.log.exception("Failed to load VMDK: %s", disk)
@@ -0,0 +1,416 @@
1
+ from __future__ import annotations
2
+
3
+ import itertools
4
+ from enum import Enum
5
+ from functools import lru_cache
6
+ from pathlib import Path
7
+ from typing import Iterable, Iterator, Literal, NamedTuple
8
+ from xml.etree.ElementTree import Element
9
+
10
+ from defusedxml import ElementTree
11
+ from flow.record.fieldtypes import windows_path
12
+
13
+ from dissect.target.exceptions import RegistryError, UnsupportedPluginError
14
+ from dissect.target.helpers import fsutil
15
+ from dissect.target.helpers.record import TargetRecordDescriptor
16
+ from dissect.target.helpers.regutil import KeyCollection
17
+ from dissect.target.helpers.utils import to_list
18
+ from dissect.target.plugin import Plugin, export
19
+ from dissect.target.target import Target
20
+
21
+ OfficeStartupItem = TargetRecordDescriptor(
22
+ "productivity/msoffice/startup_item",
23
+ [("path", "path"), ("datetime", "creation_time"), ("datetime", "modification_time")],
24
+ )
25
+
26
+ # Web add-in
27
+ OfficeWebAddinRecord = TargetRecordDescriptor(
28
+ "productivity/msoffice/web_addin",
29
+ [
30
+ ("path", "manifest"),
31
+ ("datetime", "modification_time"),
32
+ ("string", "name"),
33
+ ("string", "version"),
34
+ ("string", "provider_name"),
35
+ ("string[]", "source_locations"),
36
+ ],
37
+ )
38
+
39
+ # COM and VSTO add-ins
40
+ OfficeNativeAddinRecord = TargetRecordDescriptor(
41
+ "productivity/msoffice/native_addin",
42
+ [
43
+ ("path", "manifest"),
44
+ ("datetime", "modification_time"),
45
+ ("string", "name"),
46
+ ("string", "type"),
47
+ ("path[]", "codebases"),
48
+ ("boolean", "loaded"),
49
+ ("string", "load_behavior"),
50
+ ],
51
+ )
52
+
53
+
54
+ class ClickOnceDeploymentManifestParser:
55
+ """Parser to extact information out ClickOnce deployment manifest files.
56
+
57
+ Currently only extracts codebase information. Also handles nested manifests.
58
+ Can be extended to a .NET assembly parser in the future.
59
+ """
60
+
61
+ XML_NAMESPACE = {"": "urn:schemas-microsoft-com:asm.v2"}
62
+
63
+ class Assembly(NamedTuple):
64
+ installed: bool
65
+ codebase: Path
66
+
67
+ def __init__(self, root_manifest_path: Path, target: Target, user_sid: str):
68
+ self.root_manifest_path = root_manifest_path
69
+ self._target = target
70
+ self._user_sid = user_sid
71
+ self._visited_manifests: set[Path] = set()
72
+ self._codebases: set[Path] = set()
73
+
74
+ def find_codebases(self, manifest_path: str) -> set[Path]:
75
+ """Dig for executables given a manifest"""
76
+
77
+ assemblies = self._parse_manifest(manifest_path)
78
+ # Ignore pre-installed assemblies
79
+ return {assembly.codebase for assembly in assemblies if assembly.installed}
80
+
81
+ def _parse_manifest(self, manifest_path: Path) -> set[Assembly]:
82
+ # See https://learn.microsoft.com/en-us/visualstudio/deployment/clickonce-deployment-manifest?view=vs-2022
83
+
84
+ if manifest_path in self._visited_manifests:
85
+ return self._codebases # Prevent cycles
86
+
87
+ self._visited_manifests.add(manifest_path)
88
+ try:
89
+ manifest_tree: Element = ElementTree.fromstring(manifest_path.read_text("utf-8-sig"))
90
+ except Exception as e:
91
+ self._target.log.warning("Error parsing manifest %s", manifest_path)
92
+ self._target.log.debug("", exc_info=e)
93
+ return set()
94
+
95
+ dependent_assemblies: set[self.Assembly] = set()
96
+ dependent_assembly_elements = manifest_tree.findall(".//dependentAssembly", self.XML_NAMESPACE)
97
+ for dependent_assembly_element in dependent_assembly_elements:
98
+ dependent_assemblies |= self._parse_dependent_assembly(dependent_assembly_element, manifest_path.parent)
99
+
100
+ return dependent_assemblies
101
+
102
+ def _parse_dependent_assembly(self, dependent_assembly: Element, cwd: Path) -> set[Assembly]:
103
+ # See https://learn.microsoft.com/en-us/visualstudio/deployment/dependency-element-clickonce-deployment?view=vs-2022#dependentassembly # noqa: E501
104
+
105
+ if not (codebase_str_path := dependent_assembly.get("codebase")):
106
+ return set()
107
+
108
+ codebase_str_path = fsutil.abspath(codebase_str_path, str(cwd), alt_separator=self._target.fs.alt_separator)
109
+ codebase_path: Path = self._target.fs.path(codebase_str_path)
110
+ if not codebase_path.exists():
111
+ return set() # Ignore files which are not actually installed, for example due to language settings
112
+
113
+ installed = dependent_assembly.get("dependencyType") == "install"
114
+ if codebase_path.name.endswith(".manifest") and installed:
115
+ return self._parse_manifest(codebase_path) # Yes, a codebase can point to another manifest
116
+
117
+ return {self.Assembly(installed, codebase_path)}
118
+
119
+
120
+ class LoadBehavior(Enum):
121
+ Manual = 1
122
+ Autostart = 2
123
+ OnDemand = 3
124
+ FistTime = 4
125
+
126
+
127
+ class NativePluginStatus(NamedTuple):
128
+ loaded: bool
129
+ load_behavior: LoadBehavior
130
+
131
+
132
+ class MSOffice(Plugin):
133
+ """Microsoft Office productivity suite plugin."""
134
+
135
+ __namespace__ = "msoffice"
136
+
137
+ HIVES = ["HKLM", "HKCU"]
138
+ OFFICE_KEY = "Software\\Microsoft\\Office"
139
+ OFFICE_COMPONENTS = ["Access", "Excel", "Outlook", "PowerPoint", "Word", "OneNote"]
140
+ ADD_IN_KEY = "Addins"
141
+ OFFICE_DEFAULT_USER_STARTUP = [
142
+ "%APPDATA%/Microsoft/Templates",
143
+ "%APPDATA%/Microsoft/Word/Startup",
144
+ "%APPDATA%/Microsoft/Excel/XLSTART",
145
+ "%APPDATA%/Microsoft/Outlook/Startup",
146
+ "%APPDATA%/Microsoft/PowerPoint/Startup",
147
+ ]
148
+
149
+ OFFICE_DEFAULT_ROOT = "C:/Program Files/Microsoft Office/root/Office16/"
150
+
151
+ # Office is fixed at version 16.0 since Microsoft Office 2016 (released in 2015)
152
+ # Powerpoint and Outlook do not have a alternate startup folder
153
+ OFFICE_STARTUP_OPTIONS = [
154
+ ("Software\\Microsoft\\Office\\16.0\\Word\\Options", "STARTUP-PATH"),
155
+ ("Software\\Microsoft\\Office\\16.0\\Word\\Options", "UserTemplates"),
156
+ ("Software\\Microsoft\\Office\\16.0\\Excel\\Options", "AltStartup"),
157
+ ]
158
+
159
+ CLASSES_ROOTS = [
160
+ "HKCR",
161
+ # Click To Run Application Virtualization:
162
+ "HKLM\\SOFTWARE\\Microsoft\\Office\\ClickToRun\\REGISTRY\\MACHINE\\Software\\Classes",
163
+ # For 32-bit software running under 64-bit Windows:
164
+ "HKLM\\SOFTWARE\\Wow6432Node\\Classes",
165
+ ]
166
+
167
+ def __init__(self, target: Target):
168
+ super().__init__(target)
169
+ self._office_install_root = lru_cache(32)(self._office_install_root)
170
+
171
+ def check_compatible(self) -> None:
172
+ if not self.target.has_function("registry") or not list(self.target.registry.keys(f"HKLM\\{self.OFFICE_KEY}")):
173
+ raise UnsupportedPluginError("Registry key not found: %s", self.OFFICE_KEY)
174
+
175
+ @export(record=OfficeWebAddinRecord)
176
+ def web(self) -> Iterator[OfficeWebAddinRecord]:
177
+ """Returns all available Web add-ins cached in the WEF (Web Extension Framework) folder.
178
+
179
+ Office Web Add-ins are web-based applications that extend the functionality of Office applications like Word, Excel, and Outlook.
180
+ These add-ins can interact with the content in Office documents and provide additional features and capabilities.
181
+ The WEF folder contains cached data and manifests for Office Web Add-ins.
182
+ The manifest includes information about the add-ins, such as their source locations, display names, and other metadata.
183
+
184
+ References:
185
+ - https://learn.microsoft.com/en-us/office/dev/add-ins/overview/office-add-ins
186
+
187
+ Yields a ``OfficeWebAddinRecord`` with fields:
188
+
189
+ .. code-block:: text
190
+
191
+ manifest (path): The full path to the manifest in the WEF folder.
192
+ modification_time (datetime): The modification time of the manifest.
193
+ name (string): The display name of the add-in.
194
+ version (string): The version of the add-in.
195
+ provider_name (string): The provider name of the add-in.
196
+ source_locations (string[]): URLs referencing the web assets of the add-in (such as javascript and html files).
197
+ """ # noqa: E501
198
+
199
+ for manifest_file in self._wef_cache_folders():
200
+ try:
201
+ yield self._parse_web_addin_manifest(manifest_file)
202
+ except Exception as e:
203
+ self.target.log.warning("Error parsing web-addin manifest %s", manifest_file)
204
+ self.target.log.debug("", exc_info=e)
205
+
206
+ @export(record=OfficeNativeAddinRecord)
207
+ def native(self) -> Iterator[OfficeNativeAddinRecord]:
208
+ """Returns all native (COM / VSTO) add-ins by parsing the registry and manifest files.
209
+
210
+ COM (Component Object Model) is a binary-interface standard developed by Microsoft that enables software components to communicate with each other.
211
+ COM plugins for Microsoft Office applications, such as Word, Excel, and Outlook, are typically used to extend the functionality of these programs by integrating custom features.
212
+ COM plugins interact directly with Office applications through COM interfaces, offering a low-level approach to automation.
213
+
214
+ VSTO is a set of tools provided by Microsoft to create Office add-ins using the .NET Framework.
215
+ VSTO plugins are more modern than COM plugins and leverage managed code. They are typically developed in C# or VB.NET using Visual Studio.
216
+
217
+ Both COM and VSTO add-ins are registered in the Windows registry, where they are associated with specific Office applications and configured to load automatically or on demand.
218
+
219
+ References:
220
+ - https://learn.microsoft.com/en-us/office/dev/add-ins/overview/office-add-ins
221
+ - https://learn.microsoft.com/en-us/visualstudio/vsto/registry-entries-for-vsto-add-ins
222
+
223
+ Yields a ``OfficeNativeAddinRecord`` with fields:
224
+
225
+ .. code-block:: text
226
+
227
+ manifest (path): The full path to the manifest of a VSTO plugin. ``None`` for COM plugins.
228
+ modification_time (datetime): The modification time of the registry key of the plugin.
229
+ name (string): The name of the add-in.
230
+ type (string): The type of the add-in, either "com" or "vsto".
231
+ codebases (path[]): The full paths to the executables associated with the add-in.
232
+ loaded (boolean): Whether the add-in is currently loaded.
233
+ load_behavior (string): The load behavior of the add-in, e.g., "Autostart", "Manual", "OnDemand", "FirstTime".
234
+ """ # noqa: E501
235
+
236
+ addin_path_tuples = itertools.product(self.HIVES, [self.OFFICE_KEY], self.OFFICE_COMPONENTS, [self.ADD_IN_KEY])
237
+ addin_paths = ["\\".join(addin_path_tuple) for addin_path_tuple in addin_path_tuples]
238
+ for addin_key in self.target.registry.keys(addin_paths):
239
+ for addin in addin_key.subkeys():
240
+ key_owner = self.target.registry.get_user(addin)
241
+ sid = key_owner.sid if key_owner else None
242
+
243
+ if manifest_path_str := addin.value("Manifest", None).value:
244
+ addin_type = "vsto"
245
+ executables = self._parse_vsto_manifest(manifest_path_str, sid)
246
+ else:
247
+ addin_type = "com"
248
+ dll_str = self._lookup_com_executable(addin.name)
249
+ executables = to_list(self.target.resolve(dll_str, sid))
250
+
251
+ native_plugin_status = self._parse_plugin_status(addin)
252
+ yield OfficeNativeAddinRecord(
253
+ name=addin.value("FriendlyName", None).value,
254
+ modification_time=addin.timestamp,
255
+ loaded=native_plugin_status.loaded if native_plugin_status else None,
256
+ load_behavior=native_plugin_status.load_behavior.name if native_plugin_status else None,
257
+ type=addin_type,
258
+ manifest=windows_path(manifest_path_str) if manifest_path_str else None,
259
+ codebases=executables,
260
+ )
261
+
262
+ @export(record=OfficeStartupItem)
263
+ def startup(self) -> Iterable[OfficeStartupItem]:
264
+ """Returns all startup items found in Microsoft Office startup folders.
265
+
266
+ Office startup folders are specific directories where Microsoft Office looks add-ins, macros, templates, or custom scripts.
267
+ These are used to automatically load when the corresponding Office application starts up.
268
+ These folders allow users and administrators to automate launching add-ins, executing scripts, or applying custom settings.
269
+
270
+ References:
271
+ - https://pentestlab.blog/2019/12/11/persistence-office-application-startup/
272
+
273
+ Yields a ``OfficeStartupItem`` with fields:
274
+
275
+ .. code-block:: text
276
+
277
+ path (path): The full path to the startup item.
278
+ creation_time (datetime): The creation time of the startup item.
279
+ modification_time (datetime): The modification time of the startup item.
280
+ """ # noqa: E501
281
+
282
+ # Get items from default machine-scoped startup folder
283
+ for machine_startup_folder in self._machine_startup_folders():
284
+ yield from self._walk_startup_folder(machine_startup_folder)
285
+
286
+ # Get items from default user-scoped startup folder
287
+ for user in self.target.user_details.all_with_home():
288
+ for user_startup_folder in self.OFFICE_DEFAULT_USER_STARTUP:
289
+ yield from self._walk_startup_folder(user_startup_folder, user.user.sid)
290
+
291
+ # Get items from alternate machine or user scoped startup folder
292
+ for hive in self.HIVES:
293
+ for options_key, startup_value in self.OFFICE_STARTUP_OPTIONS:
294
+ alt_startup_folders = self.target.registry.values(f"{hive}\\{options_key}", startup_value)
295
+ for alt_startup_folder in alt_startup_folders:
296
+ user = self.target.registry.get_user(alt_startup_folder)
297
+ user_sid = user.sid if user else None
298
+ yield from self._walk_startup_folder(alt_startup_folder.value, user_sid)
299
+
300
+ def _wef_cache_folders(self) -> Iterable[Path]:
301
+ """List cache folders which contain office web-addin data."""
302
+
303
+ WEB_ADDIN_MANIFEST_GLOB = "AppData/Local/Microsoft/Office/16.0/Wef/**/Manifests/**/*"
304
+ for user_details in self.target.user_details.all_with_home():
305
+ for manifest_path in user_details.home_path.glob(WEB_ADDIN_MANIFEST_GLOB):
306
+ if manifest_path.is_file() and manifest_path.suffix != ".metadata":
307
+ yield manifest_path
308
+
309
+ def _walk_startup_folder(self, startup_folder: str, user_sid: str | None = None) -> Iterable[OfficeStartupItem]:
310
+ """Resolve the given path and return all statup items"""
311
+
312
+ resolved_startup_folder_str = self.target.resolve(startup_folder, user_sid)
313
+ resolved_startup_folder: Path = self.target.fs.path(resolved_startup_folder_str)
314
+ if not resolved_startup_folder.is_dir():
315
+ return
316
+
317
+ for current_path, _, plugin_files in resolved_startup_folder.walk():
318
+ for plugin_file in plugin_files:
319
+ item_startup = current_path / plugin_file
320
+ stats = item_startup.stat()
321
+ yield OfficeStartupItem(
322
+ path=item_startup, creation_time=stats.st_birthtime, modification_time=stats.st_mtime
323
+ )
324
+
325
+ def _lookup_com_executable(self, prog_id: str) -> str | None:
326
+ """Lookup the com executable given a prog id using the registry."""
327
+
328
+ for classes_root in self.CLASSES_ROOTS:
329
+ try:
330
+ cls_id = self.target.registry.value(f"{classes_root}\\{prog_id}\\CLSID", "(Default)").value
331
+ inproc_key = f"{classes_root}\\CLSID\\{cls_id}\\InprocServer32"
332
+ return self.target.registry.value(inproc_key, "(Default)").value
333
+ except RegistryError:
334
+ pass
335
+
336
+ def _parse_vsto_manifest(self, manifest_path_str: str, user_sid: str) -> set[str]:
337
+ """Parse a vsto manifest.
338
+
339
+ Non-local manifests, i.e. not ending with suffix "vstolocal" are listed but skipped.
340
+ """
341
+
342
+ if not manifest_path_str.endswith("vstolocal"):
343
+ self.target.log.warning("Parsing of remote vsto manifest %s is not supported")
344
+ return set(manifest_path_str)
345
+
346
+ manifest_path: Path = self.target.resolve(manifest_path_str.removesuffix("|vstolocal"), user_sid)
347
+ manifest_parser = ClickOnceDeploymentManifestParser(manifest_path, self.target, user_sid)
348
+ return manifest_parser.find_codebases(manifest_path)
349
+
350
+ def _parse_web_addin_manifest(self, manifest_path: Path) -> OfficeWebAddinRecord:
351
+ """Parses a web addin manifest."""
352
+
353
+ ns = {"": "http://schemas.microsoft.com/office/appforoffice/1.1"}
354
+
355
+ manifest_tree: Element = ElementTree.fromstring(manifest_path.read_text("utf-8-sig"))
356
+
357
+ source_location_elements = manifest_tree.findall(".//SourceLocation", ns)
358
+ source_locations = [source_location.get("DefaultValue") for source_location in source_location_elements]
359
+
360
+ display_name_element = manifest_tree.find(".//DisplayName", ns)
361
+ display_name = display_name_element.get("DefaultValue") if display_name_element is not None else None
362
+
363
+ return OfficeWebAddinRecord(
364
+ name=display_name,
365
+ manifest=manifest_path,
366
+ version=manifest_tree.findtext(".//Version", namespaces=ns),
367
+ provider_name=manifest_tree.findtext(".//ProviderName", namespaces=ns),
368
+ source_locations=filter(None, source_locations),
369
+ modification_time=manifest_path.stat().st_mtime,
370
+ )
371
+
372
+ def _office_install_root(self, component: Literal["Word", "Excel"]) -> str:
373
+ """Return the installation root for a office component"""
374
+
375
+ # Typically, all components share the same root.
376
+ # Curiously enough, the "Common" component has no InstallRoot defined.
377
+ key = f"HKLM\\{self.OFFICE_KEY}\\16.0\\{component}\\InstallRoot"
378
+ try:
379
+ return self.target.registry.value(key, "Path").value
380
+ except RegistryError:
381
+ return self.OFFICE_DEFAULT_ROOT
382
+
383
+ def _machine_startup_folders(self) -> Iterable[str]:
384
+ """Return machine-scoped office startup folders"""
385
+
386
+ yield fsutil.join(self._office_install_root("Word"), "STARTUP", alt_separator="\\")
387
+ yield fsutil.join(self._office_install_root("Excel"), "XLSTART", alt_separator="\\")
388
+ yield fsutil.join(self._office_install_root("Word"), "Templates", alt_separator="\\")
389
+ yield fsutil.join(self._office_install_root("Word"), "Document Themes", alt_separator="\\")
390
+
391
+ def _parse_plugin_status(self, addin: KeyCollection) -> NativePluginStatus | None:
392
+ """Parse the registry value which controls if the add-in autostarts.
393
+
394
+ See https://learn.microsoft.com/en-us/visualstudio/vsto/registry-entries-for-vsto-add-ins?view=vs-2022#LoadBehavior # noqa: E501
395
+ """
396
+
397
+ load_behavior = addin.value("LoadBehavior", None).value
398
+
399
+ if load_behavior is None:
400
+ return None
401
+ elif load_behavior == 0:
402
+ return NativePluginStatus(loaded=False, load_behavior=LoadBehavior.Manual)
403
+ elif load_behavior == 1:
404
+ return NativePluginStatus(loaded=True, load_behavior=LoadBehavior.Manual)
405
+ elif load_behavior == 2:
406
+ return NativePluginStatus(loaded=False, load_behavior=LoadBehavior.Autostart)
407
+ elif load_behavior == 3:
408
+ return NativePluginStatus(loaded=True, load_behavior=LoadBehavior.Autostart)
409
+ elif load_behavior == 8:
410
+ return NativePluginStatus(loaded=False, load_behavior=LoadBehavior.OnDemand)
411
+ elif load_behavior == 9:
412
+ return NativePluginStatus(loaded=True, load_behavior=LoadBehavior.OnDemand)
413
+ elif load_behavior == 16:
414
+ return NativePluginStatus(loaded=False, load_behavior=LoadBehavior.FistTime)
415
+
416
+ return None