dissect.target 3.20.2.dev61__tar.gz → 3.20.2.dev63__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 (708) hide show
  1. {dissect_target-3.20.2.dev61/dissect.target.egg-info → dissect_target-3.20.2.dev63}/PKG-INFO +2 -1
  2. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/cache.py +1 -1
  3. dissect_target-3.20.2.dev63/dissect/target/helpers/scrape.py +221 -0
  4. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/evt.py +6 -6
  5. dissect_target-3.20.2.dev63/dissect/target/plugins/scrape/qfind.py +167 -0
  6. dissect_target-3.20.2.dev63/dissect/target/plugins/scrape/scrape.py +202 -0
  7. dissect_target-3.20.2.dev63/dissect/target/tools/qfind.py +63 -0
  8. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/shell.py +54 -3
  9. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volume.py +14 -15
  10. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volumes/bde.py +5 -2
  11. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volumes/ddf.py +8 -10
  12. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volumes/disk.py +4 -2
  13. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volumes/luks.py +8 -5
  14. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volumes/lvm.py +10 -12
  15. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volumes/md.py +12 -11
  16. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/volumes/vmfs.py +5 -2
  17. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63/dissect.target.egg-info}/PKG-INFO +2 -1
  18. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect.target.egg-info/SOURCES.txt +10 -2
  19. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect.target.egg-info/entry_points.txt +1 -0
  20. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect.target.egg-info/requires.txt +1 -0
  21. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/pyproject.toml +2 -0
  22. {dissect_target-3.20.2.dev61/tests/plugins/general → dissect_target-3.20.2.dev63/tests/helpers}/test_scrape.py +58 -19
  23. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/log/test_evt.py +1 -1
  24. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/log/test_evtx.py +1 -1
  25. dissect_target-3.20.2.dev63/tests/plugins/scrape/test_qfind.py +93 -0
  26. dissect_target-3.20.2.dev63/tests/plugins/scrape/test_scrape.py +136 -0
  27. dissect_target-3.20.2.dev63/tests/tools/__init__.py +0 -0
  28. dissect_target-3.20.2.dev63/tests/tools/test_qfind.py +39 -0
  29. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_shell.py +61 -0
  30. dissect_target-3.20.2.dev63/tests/volumes/__init__.py +0 -0
  31. dissect_target-3.20.2.dev61/dissect/target/plugins/general/scrape.py +0 -181
  32. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/COPYRIGHT +0 -0
  33. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/LICENSE +0 -0
  34. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/MANIFEST.in +0 -0
  35. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/README.md +0 -0
  36. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/__init__.py +0 -0
  37. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/container.py +0 -0
  38. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/__init__.py +0 -0
  39. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/asdf.py +0 -0
  40. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/ewf.py +0 -0
  41. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/fortifw.py +0 -0
  42. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/hdd.py +0 -0
  43. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/hds.py +0 -0
  44. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/qcow2.py +0 -0
  45. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/raw.py +0 -0
  46. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/split.py +0 -0
  47. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/vdi.py +0 -0
  48. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/vhd.py +0 -0
  49. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/vhdx.py +0 -0
  50. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/containers/vmdk.py +0 -0
  51. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  52. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/exceptions.py +0 -0
  53. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystem.py +0 -0
  54. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/__init__.py +0 -0
  55. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/ad1.py +0 -0
  56. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/btrfs.py +0 -0
  57. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/cb.py +0 -0
  58. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/config.py +0 -0
  59. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/cpio.py +0 -0
  60. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/dir.py +0 -0
  61. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/exfat.py +0 -0
  62. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/extfs.py +0 -0
  63. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/fat.py +0 -0
  64. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/ffs.py +0 -0
  65. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/itunes.py +0 -0
  66. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/jffs.py +0 -0
  67. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/ntfs.py +0 -0
  68. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/overlay.py +0 -0
  69. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/smb.py +0 -0
  70. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/squashfs.py +0 -0
  71. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/tar.py +0 -0
  72. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/vmfs.py +0 -0
  73. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/vmtar.py +0 -0
  74. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/xfs.py +0 -0
  75. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/filesystems/zip.py +0 -0
  76. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/__init__.py +0 -0
  77. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/compat/__init__.py +0 -0
  78. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/compat/path_310.py +0 -0
  79. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/compat/path_311.py +0 -0
  80. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/compat/path_312.py +0 -0
  81. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/compat/path_313.py +0 -0
  82. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/compat/path_39.py +0 -0
  83. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/compat/path_common.py +0 -0
  84. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/config.py +0 -0
  85. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/configutil.py +0 -0
  86. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/cyber.py +0 -0
  87. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/data/windowsZones.xml +0 -0
  88. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/descriptor_extensions.py +0 -0
  89. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/docs.py +0 -0
  90. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/fsutil.py +0 -0
  91. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/hashutil.py +0 -0
  92. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/keychain.py +0 -0
  93. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/lazy.py +0 -0
  94. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/loaderutil.py +0 -0
  95. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/localeutil.py +0 -0
  96. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/mount.py +0 -0
  97. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/mui.py +0 -0
  98. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/nfs/__init__.py +0 -0
  99. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/nfs/client.py +0 -0
  100. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/nfs/demo.py +0 -0
  101. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/nfs/nfs3.py +0 -0
  102. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/nfs/serializer.py +0 -0
  103. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/polypath.py +0 -0
  104. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/protobuf.py +0 -0
  105. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/record.py +0 -0
  106. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/record_modifier.py +0 -0
  107. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/regutil.py +0 -0
  108. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/shell_application_ids.py +0 -0
  109. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/shell_folder_ids.py +0 -0
  110. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/sunrpc/__init__.py +0 -0
  111. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/sunrpc/client.py +0 -0
  112. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/sunrpc/serializer.py +0 -0
  113. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/sunrpc/sunrpc.py +0 -0
  114. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/helpers/utils.py +0 -0
  115. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loader.py +0 -0
  116. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/__init__.py +0 -0
  117. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/ab.py +0 -0
  118. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/ad1.py +0 -0
  119. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/asdf.py +0 -0
  120. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/cb.py +0 -0
  121. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/cyber.py +0 -0
  122. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/dir.py +0 -0
  123. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/hyperv.py +0 -0
  124. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/itunes.py +0 -0
  125. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/kape.py +0 -0
  126. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/libvirt.py +0 -0
  127. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/local.py +0 -0
  128. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/log.py +0 -0
  129. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/mqtt.py +0 -0
  130. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/multiraw.py +0 -0
  131. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/ova.py +0 -0
  132. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/overlay.py +0 -0
  133. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/ovf.py +0 -0
  134. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/phobos.py +0 -0
  135. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/profile.py +0 -0
  136. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/proxmox.py +0 -0
  137. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/pvm.py +0 -0
  138. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/pvs.py +0 -0
  139. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/raw.py +0 -0
  140. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/remote.py +0 -0
  141. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/res.py +0 -0
  142. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/smb.py +0 -0
  143. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/tanium.py +0 -0
  144. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/tar.py +0 -0
  145. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/target.py +0 -0
  146. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/utm.py +0 -0
  147. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/vb.py +0 -0
  148. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/vbox.py +0 -0
  149. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/velociraptor.py +0 -0
  150. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/vma.py +0 -0
  151. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/vmwarevm.py +0 -0
  152. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/vmx.py +0 -0
  153. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/loaders/xva.py +0 -0
  154. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugin.py +0 -0
  155. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/__init__.py +0 -0
  156. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/__init__.py +0 -0
  157. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/av/__init__.py +0 -0
  158. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  159. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/av/sophos.py +0 -0
  160. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/av/symantec.py +0 -0
  161. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  162. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  163. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/brave.py +0 -0
  164. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/browser.py +0 -0
  165. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/chrome.py +0 -0
  166. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/chromium.py +0 -0
  167. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/edge.py +0 -0
  168. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/firefox.py +0 -0
  169. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  170. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/container/__init__.py +0 -0
  171. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/container/docker.py +0 -0
  172. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/database/__init__.py +0 -0
  173. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/editor/__init__.py +0 -0
  174. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/editor/editor.py +0 -0
  175. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/editor/windowsnotepad.py +0 -0
  176. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/other/__init__.py +0 -0
  177. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/other/env.py +0 -0
  178. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/productivity/__init__.py +0 -0
  179. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/productivity/msoffice.py +0 -0
  180. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/productivity/sevenzip.py +0 -0
  181. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/productivity/winrar.py +0 -0
  182. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
  183. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
  184. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
  185. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
  186. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/shell/__init__.py +0 -0
  187. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  188. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/shell/wget.py +0 -0
  189. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
  190. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
  191. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  192. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/ssh/putty.py +0 -0
  193. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/ssh/ssh.py +0 -0
  194. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/virtualization/__init__.py +0 -0
  195. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/virtualization/vmware_workstation.py +0 -0
  196. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
  197. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  198. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  199. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
  200. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  201. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
  202. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  203. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  204. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
  205. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  206. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  207. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  208. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/__init__.py +0 -0
  209. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/docker.py +0 -0
  210. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/esxi.py +0 -0
  211. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/hyperv.py +0 -0
  212. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/parallels.py +0 -0
  213. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/proxmox.py +0 -0
  214. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/qemu.py +0 -0
  215. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/virtuozzo.py +0 -0
  216. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  217. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/child/wsl.py +0 -0
  218. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/__init__.py +0 -0
  219. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  220. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  221. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/icat.py +0 -0
  222. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
  223. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
  224. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  225. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  226. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  227. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/resolver.py +0 -0
  228. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
  229. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
  230. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  231. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/walkfs.py +0 -0
  232. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/filesystem/yara.py +0 -0
  233. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/general/__init__.py +0 -0
  234. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/general/config.py +0 -0
  235. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/general/example.py +0 -0
  236. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/general/loaders.py +0 -0
  237. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/general/osinfo.py +0 -0
  238. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/general/plugins.py +0 -0
  239. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/general/users.py +0 -0
  240. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/__init__.py +0 -0
  241. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/default/__init__.py +0 -0
  242. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/default/_os.py +0 -0
  243. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/default/network.py +0 -0
  244. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/__init__.py +0 -0
  245. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/_os.py +0 -0
  246. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/applications.py +0 -0
  247. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/__init__.py +0 -0
  248. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  249. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  250. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  251. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/citrix/history.py +0 -0
  252. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
  253. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
  254. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
  255. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  256. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
  257. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  258. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
  259. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  260. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/osx/network.py +0 -0
  261. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  262. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  263. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/datetime.py +0 -0
  264. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/esxi/__init__.py +0 -0
  265. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/esxi/_os.py +0 -0
  266. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/etc/__init__.py +0 -0
  267. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/etc/etc.py +0 -0
  268. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/generic.py +0 -0
  269. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/history.py +0 -0
  270. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
  271. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
  272. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
  273. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
  274. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  275. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
  276. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  277. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  278. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  279. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/proxmox/__init__.py +0 -0
  280. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/proxmox/_os.py +0 -0
  281. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/proxmox/vm.py +0 -0
  282. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/snap.py +0 -0
  283. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
  284. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  285. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  286. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/fortios/__init__.py +0 -0
  287. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/fortios/_keys.py +0 -0
  288. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/fortios/_os.py +0 -0
  289. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/fortios/generic.py +0 -0
  290. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/fortios/locale.py +0 -0
  291. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  292. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  293. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  294. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/network.py +0 -0
  295. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/network_managers.py +0 -0
  296. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  297. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  298. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
  299. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
  300. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  301. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/services.py +0 -0
  302. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  303. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
  304. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  305. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  306. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/locale.py +0 -0
  307. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/locate/__init__.py +0 -0
  308. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/locate/gnulocate.py +0 -0
  309. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/locate/locate.py +0 -0
  310. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/locate/mlocate.py +0 -0
  311. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/locate/plocate.py +0 -0
  312. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
  313. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  314. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  315. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  316. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/helpers.py +0 -0
  317. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  318. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  319. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  320. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  321. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
  322. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/shadow.py +0 -0
  323. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/unix/trash.py +0 -0
  324. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/__init__.py +0 -0
  325. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/_os.py +0 -0
  326. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  327. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
  328. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/amcache.py +0 -0
  329. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/catroot.py +0 -0
  330. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/cim.py +0 -0
  331. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/clfs.py +0 -0
  332. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/credential/__init__.py +0 -0
  333. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/credential/credhist.py +0 -0
  334. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/credential/lsa.py +0 -0
  335. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/credential/sam.py +0 -0
  336. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/datetime.py +0 -0
  337. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/defender/__init__.py +0 -0
  338. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/defender/_plugin.py +0 -0
  339. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/defender/mplog.py +0 -0
  340. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/defender/quarantine.py +0 -0
  341. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
  342. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
  343. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
  344. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
  345. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/keyprovider/__init__.py +0 -0
  346. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/keyprovider/credhist.py +0 -0
  347. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/keyprovider/empty.py +0 -0
  348. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/keyprovider/keychain.py +0 -0
  349. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/keyprovider/keyprovider.py +0 -0
  350. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/keyprovider/lsa.py +0 -0
  351. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
  352. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/env.py +0 -0
  353. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
  354. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  355. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/generic.py +0 -0
  356. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/jumplist.py +0 -0
  357. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/lnk.py +0 -0
  358. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/locale.py +0 -0
  359. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
  360. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  361. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  362. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  363. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/mssql.py +0 -0
  364. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  365. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/log/schedlgu.py +0 -0
  366. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/network.py +0 -0
  367. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/notifications.py +0 -0
  368. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  369. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  370. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
  371. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/applications.py +0 -0
  372. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  373. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  374. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  375. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/cam.py +0 -0
  376. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  377. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  378. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  379. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  380. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  381. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  382. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  383. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  384. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  385. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  386. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
  387. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  388. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
  389. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  390. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/registry.py +0 -0
  391. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/services.py +0 -0
  392. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/sru.py +0 -0
  393. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  394. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/syscache.py +0 -0
  395. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/tasks/__init__.py +0 -0
  396. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/tasks/_plugin.py +0 -0
  397. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/tasks/job.py +0 -0
  398. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/tasks/records.py +0 -0
  399. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/tasks/xml.py +0 -0
  400. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  401. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/ual.py +0 -0
  402. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/wer.py +0 -0
  403. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/plugins/os/windows/wua_history.py +0 -0
  404. {dissect_target-3.20.2.dev61/dissect/target/tools → dissect_target-3.20.2.dev63/dissect/target/plugins/scrape}/__init__.py +0 -0
  405. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/target.py +0 -0
  406. {dissect_target-3.20.2.dev61/dissect/target/tools/dump → dissect_target-3.20.2.dev63/dissect/target/tools}/__init__.py +0 -0
  407. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/build_pluginlist.py +0 -0
  408. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/dd.py +0 -0
  409. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/diff.py +0 -0
  410. {dissect_target-3.20.2.dev61/dissect/target/volumes → dissect_target-3.20.2.dev63/dissect/target/tools/dump}/__init__.py +0 -0
  411. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/dump/run.py +0 -0
  412. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/dump/state.py +0 -0
  413. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/dump/utils.py +0 -0
  414. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/fs.py +0 -0
  415. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/fsutils.py +0 -0
  416. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/info.py +0 -0
  417. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/logging.py +0 -0
  418. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/mount.py +0 -0
  419. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/query.py +0 -0
  420. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/reg.py +0 -0
  421. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/report.py +0 -0
  422. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/utils.py +0 -0
  423. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect/target/tools/yara.py +0 -0
  424. {dissect_target-3.20.2.dev61/tests → dissect_target-3.20.2.dev63/dissect/target/volumes}/__init__.py +0 -0
  425. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect.target.egg-info/dependency_links.txt +0 -0
  426. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/dissect.target.egg-info/top_level.txt +0 -0
  427. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/setup.cfg +0 -0
  428. {dissect_target-3.20.2.dev61/tests/containers → dissect_target-3.20.2.dev63/tests}/__init__.py +0 -0
  429. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/_docs/Makefile +0 -0
  430. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/_docs/conf.py +0 -0
  431. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/_docs/index.rst +0 -0
  432. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/_utils.py +0 -0
  433. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/conftest.py +0 -0
  434. {dissect_target-3.20.2.dev61/tests/filesystems → dissect_target-3.20.2.dev63/tests/containers}/__init__.py +0 -0
  435. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/containers/test_fortifw.py +0 -0
  436. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/containers/test_split.py +0 -0
  437. {dissect_target-3.20.2.dev61/tests/helpers → dissect_target-3.20.2.dev63/tests/filesystems}/__init__.py +0 -0
  438. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_btrfs.py +0 -0
  439. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_cb.py +0 -0
  440. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_config.py +0 -0
  441. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_cpio.py +0 -0
  442. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_dir.py +0 -0
  443. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_exfat.py +0 -0
  444. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_extfs.py +0 -0
  445. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_fat.py +0 -0
  446. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_ffs.py +0 -0
  447. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_jffs2.py +0 -0
  448. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_ntfs.py +0 -0
  449. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_overlay.py +0 -0
  450. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_smb.py +0 -0
  451. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_tar.py +0 -0
  452. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_vmtar.py +0 -0
  453. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_xfs.py +0 -0
  454. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/filesystems/test_zip.py +0 -0
  455. {dissect_target-3.20.2.dev61/tests/loaders → dissect_target-3.20.2.dev63/tests/helpers}/__init__.py +0 -0
  456. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/sunrpc/test_client.py +0 -0
  457. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_cache.py +0 -0
  458. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_config.py +0 -0
  459. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_configutil.py +0 -0
  460. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_docs.py +0 -0
  461. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_fsutil.py +0 -0
  462. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_hashutil.py +0 -0
  463. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_keychain.py +0 -0
  464. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_loaderutil.py +0 -0
  465. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_localeutil.py +0 -0
  466. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_modifier.py +0 -0
  467. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_protobuf.py +0 -0
  468. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_record.py +0 -0
  469. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_regutil.py +0 -0
  470. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/helpers/test_utils.py +0 -0
  471. {dissect_target-3.20.2.dev61/tests/plugins → dissect_target-3.20.2.dev63/tests/loaders}/__init__.py +0 -0
  472. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_ab.py +0 -0
  473. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_asdf.py +0 -0
  474. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_cb.py +0 -0
  475. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_dir.py +0 -0
  476. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_hyperv.py +0 -0
  477. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_itunes.py +0 -0
  478. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_kape.py +0 -0
  479. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_libvirt.py +0 -0
  480. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_local.py +0 -0
  481. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_log.py +0 -0
  482. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_mqtt.py +0 -0
  483. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_multiraw.py +0 -0
  484. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_ova.py +0 -0
  485. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_overlay.py +0 -0
  486. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_ovf.py +0 -0
  487. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_phobos.py +0 -0
  488. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_pvm.py +0 -0
  489. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_pvs.py +0 -0
  490. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_remote.py +0 -0
  491. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_smb.py +0 -0
  492. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_tanium.py +0 -0
  493. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_tar.py +0 -0
  494. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_utm.py +0 -0
  495. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_vbox.py +0 -0
  496. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_velociraptor.py +0 -0
  497. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_vmwarevm.py +0 -0
  498. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/loaders/test_vmx.py +0 -0
  499. {dissect_target-3.20.2.dev61/tests/plugins/apps → dissect_target-3.20.2.dev63/tests/plugins}/__init__.py +0 -0
  500. {dissect_target-3.20.2.dev61/tests/plugins/apps/av → dissect_target-3.20.2.dev63/tests/plugins/apps}/__init__.py +0 -0
  501. {dissect_target-3.20.2.dev61/tests/plugins/apps/browser → dissect_target-3.20.2.dev63/tests/plugins/apps/av}/__init__.py +0 -0
  502. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/av/test_mcafee.py +0 -0
  503. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/av/test_sophos.py +0 -0
  504. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/av/test_symantec.py +0 -0
  505. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  506. {dissect_target-3.20.2.dev61/tests/plugins/apps/container → dissect_target-3.20.2.dev63/tests/plugins/apps/browser}/__init__.py +0 -0
  507. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/browser/test_brave.py +0 -0
  508. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/browser/test_chrome.py +0 -0
  509. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/browser/test_chromium.py +0 -0
  510. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/browser/test_edge.py +0 -0
  511. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/browser/test_firefox.py +0 -0
  512. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/browser/test_iexplore.py +0 -0
  513. {dissect_target-3.20.2.dev61/tests/plugins/apps/editor → dissect_target-3.20.2.dev63/tests/plugins/apps/container}/__init__.py +0 -0
  514. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/container/test_docker.py +0 -0
  515. {dissect_target-3.20.2.dev61/tests/plugins/apps/other → dissect_target-3.20.2.dev63/tests/plugins/apps/editor}/__init__.py +0 -0
  516. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/editor/test_windowsnotepad.py +0 -0
  517. {dissect_target-3.20.2.dev61/tests/plugins/apps/productivity → dissect_target-3.20.2.dev63/tests/plugins/apps/other}/__init__.py +0 -0
  518. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/other/test_envfile.py +0 -0
  519. {dissect_target-3.20.2.dev61/tests/plugins/apps/remoteaccess → dissect_target-3.20.2.dev63/tests/plugins/apps/productivity}/__init__.py +0 -0
  520. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/productivity/test_msoffice.py +0 -0
  521. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/productivity/test_sevenzip.py +0 -0
  522. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/productivity/test_winrar.py +0 -0
  523. {dissect_target-3.20.2.dev61/tests/plugins/apps/shell → dissect_target-3.20.2.dev63/tests/plugins/apps/remoteaccess}/__init__.py +0 -0
  524. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
  525. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
  526. {dissect_target-3.20.2.dev61/tests/plugins/apps/ssh → dissect_target-3.20.2.dev63/tests/plugins/apps/shell}/__init__.py +0 -0
  527. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/shell/test_powershell.py +0 -0
  528. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/shell/test_wget.py +0 -0
  529. {dissect_target-3.20.2.dev61/tests/plugins/apps/virtualization → dissect_target-3.20.2.dev63/tests/plugins/apps/ssh}/__init__.py +0 -0
  530. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  531. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  532. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/ssh/test_putty.py +0 -0
  533. {dissect_target-3.20.2.dev61/tests/plugins/apps/vpn → dissect_target-3.20.2.dev63/tests/plugins/apps/virtualization}/__init__.py +0 -0
  534. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/virtualization/test_vmware_workstation.py +0 -0
  535. {dissect_target-3.20.2.dev61/tests/plugins/apps/webhosting → dissect_target-3.20.2.dev63/tests/plugins/apps/vpn}/__init__.py +0 -0
  536. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  537. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  538. {dissect_target-3.20.2.dev61/tests/plugins/apps/webserver → dissect_target-3.20.2.dev63/tests/plugins/apps/webhosting}/__init__.py +0 -0
  539. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  540. {dissect_target-3.20.2.dev61/tests/plugins/child → dissect_target-3.20.2.dev63/tests/plugins/apps/webserver}/__init__.py +0 -0
  541. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/webserver/test_apache.py +0 -0
  542. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  543. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/webserver/test_citrix.py +0 -0
  544. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/webserver/test_iis.py +0 -0
  545. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  546. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/apps/webserver/test_webserver.py +0 -0
  547. {dissect_target-3.20.2.dev61/tests/plugins/filesystem → dissect_target-3.20.2.dev63/tests/plugins/child}/__init__.py +0 -0
  548. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/child/test_docker.py +0 -0
  549. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/child/test_hyperv.py +0 -0
  550. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/child/test_parallels.py +0 -0
  551. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/child/test_qemu.py +0 -0
  552. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/child/test_virtuozzo.py +0 -0
  553. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/child/test_vmware_workstation.py +0 -0
  554. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/child/test_wsl.py +0 -0
  555. {dissect_target-3.20.2.dev61/tests/plugins/filesystem/ntfs → dissect_target-3.20.2.dev63/tests/plugins/filesystem}/__init__.py +0 -0
  556. {dissect_target-3.20.2.dev61/tests/plugins/filesystem/unix → dissect_target-3.20.2.dev63/tests/plugins/filesystem/ntfs}/__init__.py +0 -0
  557. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
  558. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  559. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  560. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  561. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/test_icat.py +0 -0
  562. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/test_resolver.py +0 -0
  563. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/test_walkfs.py +0 -0
  564. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/test_yara.py +0 -0
  565. {dissect_target-3.20.2.dev61/tests/plugins/general → dissect_target-3.20.2.dev63/tests/plugins/filesystem/unix}/__init__.py +0 -0
  566. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/unix/test_capability.py +0 -0
  567. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  568. {dissect_target-3.20.2.dev61/tests/plugins/os → dissect_target-3.20.2.dev63/tests/plugins/general}/__init__.py +0 -0
  569. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/general/test_config.py +0 -0
  570. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/general/test_default.py +0 -0
  571. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/general/test_network.py +0 -0
  572. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/general/test_plugins.py +0 -0
  573. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/general/test_users.py +0 -0
  574. {dissect_target-3.20.2.dev61/tests/plugins/os/unix → dissect_target-3.20.2.dev63/tests/plugins/os}/__init__.py +0 -0
  575. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/bsd → dissect_target-3.20.2.dev63/tests/plugins/os/unix}/__init__.py +0 -0
  576. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/bsd/citrix → dissect_target-3.20.2.dev63/tests/plugins/os/unix/bsd}/__init__.py +0 -0
  577. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/bsd/osx → dissect_target-3.20.2.dev63/tests/plugins/os/unix/bsd/citrix}/__init__.py +0 -0
  578. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  579. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/bsd/citrix/test_history.py +0 -0
  580. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/esxi → dissect_target-3.20.2.dev63/tests/plugins/os/unix/bsd/osx}/__init__.py +0 -0
  581. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  582. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/bsd/osx/test_network.py +0 -0
  583. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  584. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/linux → dissect_target-3.20.2.dev63/tests/plugins/os/unix/esxi}/__init__.py +0 -0
  585. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/esxi/test__os.py +0 -0
  586. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/linux/android → dissect_target-3.20.2.dev63/tests/plugins/os/unix/linux}/__init__.py +0 -0
  587. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/linux/debian → dissect_target-3.20.2.dev63/tests/plugins/os/unix/linux/android}/__init__.py +0 -0
  588. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  589. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/linux/debian/proxmox → dissect_target-3.20.2.dev63/tests/plugins/os/unix/linux/debian}/__init__.py +0 -0
  590. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/linux/fortios → dissect_target-3.20.2.dev63/tests/plugins/os/unix/linux/debian/proxmox}/__init__.py +0 -0
  591. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/debian/proxmox/test__os.py +0 -0
  592. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  593. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  594. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/debian/test_snap.py +0 -0
  595. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/linux/redhat → dissect_target-3.20.2.dev63/tests/plugins/os/unix/linux/fortios}/__init__.py +0 -0
  596. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/fortios/test__os.py +0 -0
  597. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/fortios/test_keys.py +0 -0
  598. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/linux/suse → dissect_target-3.20.2.dev63/tests/plugins/os/unix/linux/redhat}/__init__.py +0 -0
  599. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  600. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/locate → dissect_target-3.20.2.dev63/tests/plugins/os/unix/linux/suse}/__init__.py +0 -0
  601. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  602. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test__os.py +0 -0
  603. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  604. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  605. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  606. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  607. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  608. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_network.py +0 -0
  609. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  610. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  611. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_services.py +0 -0
  612. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  613. {dissect_target-3.20.2.dev61/tests/plugins/os/unix/log → dissect_target-3.20.2.dev63/tests/plugins/os/unix/locate}/__init__.py +0 -0
  614. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/locate/test_gnulocate.py +0 -0
  615. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/locate/test_mlocate.py +0 -0
  616. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/locate/test_plocate.py +0 -0
  617. {dissect_target-3.20.2.dev61/tests/plugins/os/windows → dissect_target-3.20.2.dev63/tests/plugins/os/unix/log}/__init__.py +0 -0
  618. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_atop.py +0 -0
  619. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_audit.py +0 -0
  620. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_auth.py +0 -0
  621. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_helpers.py +0 -0
  622. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_journal.py +0 -0
  623. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  624. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_messages.py +0 -0
  625. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  626. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test__os.py +0 -0
  627. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_applications.py +0 -0
  628. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_cronjobs.py +0 -0
  629. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_generic.py +0 -0
  630. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_history.py +0 -0
  631. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_ips.py +0 -0
  632. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_locale.py +0 -0
  633. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  634. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_shadow.py +0 -0
  635. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_trash.py +0 -0
  636. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_users.py +0 -0
  637. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/unix/test_version.py +0 -0
  638. {dissect_target-3.20.2.dev61/tests/plugins/os/windows/credential → dissect_target-3.20.2.dev63/tests/plugins/os/windows}/__init__.py +0 -0
  639. {dissect_target-3.20.2.dev61/tests/plugins/os/windows/regf → dissect_target-3.20.2.dev63/tests/plugins/os/windows/credential}/__init__.py +0 -0
  640. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/credential/test_credhist.py +0 -0
  641. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/credential/test_lsa.py +0 -0
  642. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/credential/test_sam.py +0 -0
  643. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/log/test_amcache.py +0 -0
  644. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/log/test_etl.py +0 -0
  645. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/log/test_mssql.py +0 -0
  646. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/log/test_schedlgu.py +0 -0
  647. {dissect_target-3.20.2.dev61/tests/tools → dissect_target-3.20.2.dev63/tests/plugins/os/windows/regf}/__init__.py +0 -0
  648. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_applications.py +0 -0
  649. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  650. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_cam.py +0 -0
  651. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  652. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  653. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  654. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_shellbags.py +0 -0
  655. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  656. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_usb.py +0 -0
  657. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  658. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test__os.py +0 -0
  659. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  660. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_catroot.py +0 -0
  661. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_clfs.py +0 -0
  662. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_datetime.py +0 -0
  663. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_defender.py +0 -0
  664. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_dpapi.py +0 -0
  665. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_env.py +0 -0
  666. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_generic.py +0 -0
  667. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_jumplist.py +0 -0
  668. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_lnk.py +0 -0
  669. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_locale.py +0 -0
  670. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_mru.py +0 -0
  671. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_network.py +0 -0
  672. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_notifications.py +0 -0
  673. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_prefetch.py +0 -0
  674. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  675. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_registry.py +0 -0
  676. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_shimcache.py +0 -0
  677. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_sru.py +0 -0
  678. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_syscache.py +0 -0
  679. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_tasks.py +0 -0
  680. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  681. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_ual.py +0 -0
  682. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_wer.py +0 -0
  683. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/plugins/os/windows/test_wua_history.py +0 -0
  684. {dissect_target-3.20.2.dev61/tests/volumes → dissect_target-3.20.2.dev63/tests/plugins/scrape}/__init__.py +0 -0
  685. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_container.py +0 -0
  686. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_exceptions.py +0 -0
  687. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_filesystem.py +0 -0
  688. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_loader.py +0 -0
  689. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_plugin.py +0 -0
  690. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_target.py +0 -0
  691. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_tests.py +0 -0
  692. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/test_volume.py +0 -0
  693. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/conftest.py +0 -0
  694. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_build_pluginlist.py +0 -0
  695. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_diff.py +0 -0
  696. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_dump.py +0 -0
  697. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_fs.py +0 -0
  698. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_fsutils.py +0 -0
  699. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_info.py +0 -0
  700. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_mount.py +0 -0
  701. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_query.py +0 -0
  702. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_reg.py +0 -0
  703. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_report.py +0 -0
  704. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_utils.py +0 -0
  705. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/tools/test_yara.py +0 -0
  706. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/volumes/test_bde.py +0 -0
  707. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tests/volumes/test_md.py +0 -0
  708. {dissect_target-3.20.2.dev61 → dissect_target-3.20.2.dev63}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dissect.target
3
- Version: 3.20.2.dev61
3
+ Version: 3.20.2.dev63
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
@@ -86,6 +86,7 @@ Requires-Dist: dissect.util<4.0.dev,>=3.0.dev; extra == "dev"
86
86
  Requires-Dist: dissect.vmfs[dev]<4.0.dev,>=3.0.dev; extra == "dev"
87
87
  Requires-Dist: dissect.volume[dev]<4.0.dev,>=3.0.dev; extra == "dev"
88
88
  Requires-Dist: dissect.xfs[dev]<4.0.dev,>=3.0.dev; extra == "dev"
89
+ Requires-Dist: pexpect; extra == "dev"
89
90
  Provides-Extra: yara
90
91
  Requires-Dist: dissect.target[full]; extra == "yara"
91
92
  Requires-Dist: yara-python; extra == "yara"
@@ -95,7 +95,7 @@ class Cache:
95
95
  target = args[0].target
96
96
 
97
97
  output = getattr(self.wrapper, "__output__", None)
98
- if output not in ("record", "yield"):
98
+ if output not in ("record", "yield", "none"):
99
99
  # Cache property and default outputs on the target object itself
100
100
  func_cache = target._cache.setdefault(self.fname, {})
101
101
  key = (args[1:], frozenset(sorted(kwargs.items())))
@@ -0,0 +1,221 @@
1
+ from __future__ import annotations
2
+
3
+ import io
4
+ import logging
5
+ import re
6
+ import string
7
+ from typing import TYPE_CHECKING, BinaryIO, Callable, Union
8
+
9
+ from dissect.target.helpers.record import TargetRecordDescriptor
10
+
11
+ if TYPE_CHECKING:
12
+ from collections.abc import Iterator
13
+
14
+
15
+ Needle = Union[bytes, re.Pattern]
16
+
17
+
18
+ def find_needles(
19
+ fh: BinaryIO,
20
+ needles: Needle | list[Needle],
21
+ *,
22
+ start: int | None = None,
23
+ end: int | None = None,
24
+ lock_seek: bool = True,
25
+ block_size: int = io.DEFAULT_BUFFER_SIZE,
26
+ progress: Callable[[int], None] | None = None,
27
+ ) -> Iterator[tuple[bytes, int]]:
28
+ """Yields needles and their offsets found in provided byte stream.
29
+
30
+ Args:
31
+ fh: The byte stream to search for needles.
32
+ needles: The list of bytes needles to search for.
33
+ start: The offset to start searching from.
34
+ end: The offset to stop searching at.
35
+ lock_seek: Whether the file position is maintained by the scraper or the consumer.
36
+ Setting this to ``False`` will allow the consumer to seek the file pointer, i.e. to skip forward.
37
+ block_size: The block size to use for reading from the byte stream.
38
+ progress: A function to call with the current offset.
39
+ """
40
+
41
+ if not isinstance(needles, list):
42
+ needles = [needles]
43
+
44
+ if not needles:
45
+ raise ValueError("At least one needle value must be provided")
46
+
47
+ if start is not None and end is not None and start >= end:
48
+ raise ValueError("Start offset must be less than end offset")
49
+
50
+ max_needle_len = max(len(n.pattern if isinstance(n, re.Pattern) else n) for n in needles)
51
+ overlap_len = max_needle_len
52
+
53
+ offset = fh.tell() if start is None else start
54
+ current_block = b""
55
+
56
+ while offset < end if end is not None else True:
57
+ if lock_seek:
58
+ fh.seek(offset)
59
+ else:
60
+ offset = fh.tell()
61
+
62
+ read_size = min(block_size, end - offset) if end is not None else block_size
63
+ if not (next_block := fh.read(read_size)):
64
+ break
65
+
66
+ if progress:
67
+ progress(offset)
68
+
69
+ overlap = current_block[-overlap_len:] if overlap_len > 0 else b""
70
+ current_block = overlap + next_block
71
+ current_block_offset = offset - len(overlap)
72
+
73
+ # Look for a needle in a current block
74
+ last_needle_pos = -1
75
+ last_needle_end = 0
76
+ while True:
77
+ needle_positions = [
78
+ (pos, needle)
79
+ for needle in needles
80
+ if (
81
+ pos := (match.start(0) if (match := needle.search(current_block, last_needle_pos + 1)) else -1)
82
+ if isinstance(needle, re.Pattern)
83
+ else current_block.find(needle, last_needle_pos + 1)
84
+ )
85
+ > -1
86
+ ]
87
+
88
+ if not needle_positions:
89
+ break
90
+
91
+ closest_needle_pos, closest_needle = min(needle_positions)
92
+ yield closest_needle, current_block_offset + closest_needle_pos
93
+
94
+ last_needle_pos = closest_needle_pos
95
+ last_needle_end = last_needle_pos + 1
96
+
97
+ # The size of the data from the current block that will be prepended to the next block
98
+ overlap_len = min(len(current_block) - last_needle_end, max_needle_len)
99
+
100
+ offset += block_size
101
+
102
+
103
+ def _read_plain_chunk(fh: BinaryIO, needle: Needle, offset: int, chunk_size: int) -> bytes:
104
+ """Read chunk from a byte stream for provided needle, offset and chunk size."""
105
+ fh.seek(offset)
106
+ return fh.read(chunk_size)
107
+
108
+
109
+ def find_needle_chunks(
110
+ fh: BinaryIO,
111
+ needle_chunk_size_map: dict[Needle, int],
112
+ chunk_reader: Callable[[BinaryIO, Needle, int, int], bytes] | None = None,
113
+ lock_seek: bool = True,
114
+ block_size: int = io.DEFAULT_BUFFER_SIZE,
115
+ ) -> Iterator[tuple[bytes, int, bytes]]:
116
+ """Yields tuples with an offset, a needle and a byte chunk found in provided byte stream.
117
+
118
+ Args:
119
+ fh: The byte stream to search for needles.
120
+ needle_chunk_size_map: A dictionary with needle bytes as keys and chunk sizes as values.
121
+ chunk_reader: A function to read a chunk from a byte stream for provided needle, offset and chunk size.
122
+ lock_seek: Whether the file position is maintained by the scraper or the consumer.
123
+ Setting this to ``False`` wil allow the consumer to seek the file pointer, i.e. to skip forward.
124
+ block_size: The block size to use for reading from the byte stream.
125
+ """
126
+ chunk_reader = chunk_reader or _read_plain_chunk
127
+
128
+ needles = list(needle_chunk_size_map.keys())
129
+ for needle, offset in find_needles(fh, needles, lock_seek=lock_seek, block_size=block_size):
130
+ yield (needle, offset, chunk_reader(fh, needle, offset, needle_chunk_size_map[needle]))
131
+
132
+
133
+ def scrape_chunks(
134
+ fh: BinaryIO,
135
+ needle_chunk_size_map: dict[Needle, int],
136
+ chunk_parser: Callable[[Needle, bytes], Iterator[TargetRecordDescriptor]],
137
+ chunk_reader: Callable[[BinaryIO, Needle, int, int], bytes] | None = None,
138
+ block_size: int = io.DEFAULT_BUFFER_SIZE,
139
+ log: logging.Logger | None = None,
140
+ ) -> Iterator[TargetRecordDescriptor]:
141
+ """Yields records scraped from chunks found in a provided byte stream.
142
+
143
+ Args:
144
+ fh: The byte stream to search for needles.
145
+ needle_chunk_size_map: A dictionary with needle bytes as keys and chunk sizes as values.
146
+ chunk_parser: A function to parse a chunk and yield records.
147
+ chunk_reader: A function to read a chunk from a byte stream for provided needle, offset and chunk size.
148
+ block_size: The block size to use for reading from the byte stream.
149
+ log: A logger to use for logging.
150
+ """
151
+
152
+ chunk_count = 0
153
+ record_count = 0
154
+
155
+ chunk_stream = find_needle_chunks(
156
+ fh,
157
+ needle_chunk_size_map,
158
+ block_size=block_size,
159
+ chunk_reader=chunk_reader or _read_plain_chunk,
160
+ )
161
+
162
+ for needle, _, chunk in chunk_stream:
163
+ try:
164
+ for record in chunk_parser(needle, chunk):
165
+ yield record
166
+ record_count += 1
167
+ chunk_count += 1
168
+ except Exception as e:
169
+ if log:
170
+ log.warning("Chunk parsing failed with %r", e)
171
+
172
+ if log:
173
+ log.debug("Scraped %d chunks with %d records", chunk_count, record_count)
174
+
175
+
176
+ def recover_string(buf: bytes, encoding: str, *, reverse: bool = False, ascii: bool = True) -> str:
177
+ """Recover the longest possible string from a byte buffer, forward or reverse.
178
+
179
+ Args:
180
+ buf: The byte buffer to recover a string from.
181
+ encoding: The encoding to use for decoding the buffer.
182
+ reverse: Whether to recover the string from the end of the buffer.
183
+ ascii: Whether to recover only ASCII characters.
184
+ """
185
+ if reverse:
186
+ decoded = ""
187
+ error_count = 0
188
+ max_error_count = 8 # Arbitrary limit
189
+
190
+ for i in range(1, len(buf) + 1):
191
+ try:
192
+ decoded = buf[-i:].decode(encoding)
193
+ error_count = 0
194
+ except UnicodeDecodeError:
195
+ error_count += 1
196
+
197
+ if error_count > max_error_count:
198
+ break
199
+
200
+ decoded = decoded.split("\x00")[-1]
201
+
202
+ if ascii:
203
+ for i in range(1, len(decoded) + 1):
204
+ if decoded[-i] not in string.printable:
205
+ decoded = decoded[-i + 1 :]
206
+ break
207
+ else:
208
+ try:
209
+ decoded = buf.decode(encoding)
210
+ except UnicodeDecodeError as e:
211
+ decoded = buf[: e.start].decode(encoding)
212
+
213
+ decoded = decoded.split("\x00")[0]
214
+
215
+ if ascii:
216
+ for i in range(len(decoded)):
217
+ if decoded[i] not in string.printable:
218
+ decoded = decoded[:i]
219
+ break
220
+
221
+ return decoded
@@ -8,7 +8,6 @@ from typing import Any, BinaryIO, Iterator
8
8
  from dissect.eventlog import evt
9
9
  from flow.record import Record
10
10
 
11
- from dissect.target import plugin
12
11
  from dissect.target.exceptions import (
13
12
  FilesystemError,
14
13
  PluginError,
@@ -17,6 +16,7 @@ from dissect.target.exceptions import (
17
16
  UnsupportedPluginError,
18
17
  )
19
18
  from dissect.target.helpers.record import TargetRecordDescriptor
19
+ from dissect.target.plugin import Plugin, arg, export
20
20
 
21
21
  re_illegal_characters = re.compile(r"[\(\): \.\-#]")
22
22
 
@@ -110,7 +110,7 @@ class WindowsEventlogsMixin:
110
110
  raise UnsupportedPluginError(f'Event log directory "{self.LOGS_DIR_PATH}" not found')
111
111
 
112
112
 
113
- class EvtPlugin(WindowsEventlogsMixin, plugin.Plugin):
113
+ class EvtPlugin(WindowsEventlogsMixin, Plugin):
114
114
  """Windows ``.evt`` event log plugin."""
115
115
 
116
116
  LOGS_DIR_PATH = "sysvol/windows/system32/config"
@@ -118,9 +118,9 @@ class EvtPlugin(WindowsEventlogsMixin, plugin.Plugin):
118
118
  NEEDLE = b"LfLe"
119
119
  CHUNK_SIZE = 0x10000
120
120
 
121
- @plugin.arg("--logs-dir", help="logs directory to scan")
122
- @plugin.arg("--log-file-glob", default=EVT_GLOB, help="glob pattern to match a log file name")
123
- @plugin.export(record=EvtRecordDescriptor)
121
+ @arg("--logs-dir", help="logs directory to scan")
122
+ @arg("--log-file-glob", default=EVT_GLOB, help="glob pattern to match a log file name")
123
+ @export(record=EvtRecordDescriptor)
124
124
  def evt(self, log_file_glob: str = EVT_GLOB, logs_dir: str | None = None) -> Iterator[EvtRecordDescriptor]:
125
125
  """Parse Windows Eventlog files (``*.evt``).
126
126
 
@@ -174,7 +174,7 @@ class EvtPlugin(WindowsEventlogsMixin, plugin.Plugin):
174
174
  _target=self.target,
175
175
  )
176
176
 
177
- @plugin.export(record=EvtRecordDescriptor)
177
+ @export(record=EvtRecordDescriptor)
178
178
  def scraped_evt(self) -> Iterator[EvtRecordDescriptor]:
179
179
  """Yields EVT log file records scraped from target disks"""
180
180
  yield from self.target.scrape.scrape_chunks_from_disks(
@@ -0,0 +1,167 @@
1
+ from __future__ import annotations
2
+
3
+ import codecs
4
+ import re
5
+ import string
6
+ import sys
7
+ from pathlib import Path
8
+ from typing import Callable
9
+
10
+ from dissect.cstruct import utils
11
+
12
+ from dissect.target.container import Container
13
+ from dissect.target.helpers.scrape import recover_string
14
+ from dissect.target.plugin import Plugin, arg, export
15
+ from dissect.target.target import Target
16
+ from dissect.target.volume import Volume
17
+
18
+
19
+ class QFindPlugin(Plugin):
20
+ """Basically ``grep -a "malware"`` on steroids."""
21
+
22
+ def check_compatible(self) -> None:
23
+ pass
24
+
25
+ @arg("-n", "--needles", type=str, nargs="*", metavar="NEEDLES", help="needles to search for")
26
+ @arg("-nf", "--needle-file", type=Path, help="file containing the needles to search for")
27
+ @arg("-e", "--encoding", type=str, help="encode text needles with these comma separated encodings")
28
+ @arg("--no-hex-decode", action="store_true", help="do not automatically add decoded hex needles (only in raw mode)")
29
+ @arg("-R", "--raw", action="store_true", help="show raw hex dumps instead of post-processed string output")
30
+ @arg("-i", "--ignore-case", action="store_true", help="case insensitive search")
31
+ @arg("--allow-non-ascii", action="store_true", help="allow non-ASCII characters in the output")
32
+ @arg("-u", "--unique", action="store_true", help="only show unique string hits (does not apply to raw output)")
33
+ @arg("-W", "--window", type=int, default=256, help="maximum window size in bytes for context around each hit")
34
+ @export(output="none")
35
+ def qfind(
36
+ self,
37
+ needles: list[str] | None = None,
38
+ needle_file: Path | None = None,
39
+ encoding: str = "",
40
+ no_hex_decode: bool = False,
41
+ raw: bool = False,
42
+ ignore_case: bool = False,
43
+ allow_non_ascii: bool = False,
44
+ unique: bool = False,
45
+ window: int = 256,
46
+ ) -> None:
47
+ """Find a needle in a haystack.
48
+
49
+ Example:
50
+ .. code-block::
51
+
52
+ # find all instances of "malware" in the target
53
+ target-qfind <TARGET> --needles malware
54
+
55
+ # find all instances of "malware" in the target, ignoring case
56
+ target-qfind <TARGET> --needles MaLwArE --ignore-case
57
+
58
+ # find all instances of "malware" in the target and show raw hex dumps
59
+ target-qfind <TARGET> --needles malware --raw
60
+
61
+ # find all instances of "malware" in the target, in UTF-8 and UTF-16-LE (UTF-8 is default)
62
+ target-qfind <TARGET> --needles malware --encoding utf-16-le
63
+
64
+ # use target-query instead of target-qfind
65
+ target-query <TARGET> -f qfind --needles malware
66
+ """
67
+ all_needles = set(needles or [])
68
+ if needle_file and needle_file.exists():
69
+ with needle_file.open("r") as fh:
70
+ for line in fh:
71
+ if (line := line.strip()) and not line.startswith("#"):
72
+ all_needles.add(line)
73
+
74
+ encodings = set()
75
+ for codec in (encoding or "").split(","):
76
+ codec = codec.strip()
77
+
78
+ try:
79
+ codecs.lookup(codec.strip())
80
+ except LookupError:
81
+ self.target.log.warning("Unknown encoding: %s", codec)
82
+ else:
83
+ encodings.add(codec)
84
+
85
+ needle_lookup = {}
86
+ for needle in all_needles:
87
+ encoded_needle = needle.encode("utf-8")
88
+ needle_lookup[encoded_needle] = (needle, "utf-8")
89
+
90
+ if not no_hex_decode and len(needle) % 2 == 0 and all(c in string.hexdigits for c in needle):
91
+ encoded_needle = bytes.fromhex(needle)
92
+ needle_lookup[encoded_needle] = (needle, "hex")
93
+
94
+ for codec in encodings:
95
+ try:
96
+ encoded_needle = needle.encode(codec)
97
+ except UnicodeEncodeError:
98
+ self.target.log.warning("Cannot encode needle with %s: %s", codec, needle)
99
+ else:
100
+ needle_lookup[encoded_needle] = (needle, codec)
101
+
102
+ if not needle_lookup:
103
+ self.target.log.error("No needles to search for")
104
+ return
105
+
106
+ if ignore_case:
107
+ tmp = {}
108
+ for encoded_needle, _ in needle_lookup.items():
109
+ tmp[re.compile(re.escape(encoded_needle), re.IGNORECASE)] = _
110
+ needle_lookup = tmp
111
+
112
+ seen = set()
113
+ for _, stream, needle, offset in self.target.scrape.find(
114
+ list(needle_lookup.keys()), progress=progress(self.target)
115
+ ):
116
+ original_needle, codec = needle_lookup[needle]
117
+ needle_len = len(needle.pattern if isinstance(needle, re.Pattern) else needle)
118
+ before_offset = max(0, offset - window)
119
+ stream.seek(before_offset)
120
+ buf = stream.read((offset - before_offset) + max(window, needle_len))
121
+
122
+ header = f"\r[{offset:#08x} @ {original_needle} ({codec})]"
123
+
124
+ if raw:
125
+ print(header)
126
+ palette = [(offset - before_offset, utils.COLOR_NORMAL), (needle_len, utils.COLOR_BG_RED)]
127
+ utils.hexdump(buf, palette, offset=before_offset)
128
+ else:
129
+ codec = "utf-8" if codec == "hex" else codec
130
+ before_part = recover_string(
131
+ buf[: offset - before_offset], codec, reverse=True, ascii=not allow_non_ascii
132
+ )
133
+ after_part = recover_string(buf[offset - before_offset :], codec, ascii=not allow_non_ascii)
134
+ hit = (
135
+ before_part
136
+ + utils.COLOR_BG_RED
137
+ + after_part[:needle_len]
138
+ + utils.COLOR_NORMAL
139
+ + after_part[needle_len:]
140
+ )
141
+
142
+ if unique:
143
+ if hit in seen:
144
+ continue
145
+ seen.add(hit)
146
+
147
+ print(header)
148
+ print(hit)
149
+
150
+
151
+ def progress(target: Target) -> Callable[[Container | Volume, int, int], None]:
152
+ """Progress handler of the qfind plugin."""
153
+ current_disk = None
154
+
155
+ def update(disk: Container | Volume, offset: int, size: int) -> None:
156
+ nonlocal current_disk
157
+ if current_disk is None:
158
+ sys.stderr.write(f"{target}\n")
159
+
160
+ if current_disk != disk:
161
+ sys.stderr.write(f"[Current disk: {disk}]\n")
162
+ current_disk = disk
163
+
164
+ sys.stderr.write(f"\r{offset / float(size) * 100:0.2f}%")
165
+ sys.stderr.flush()
166
+
167
+ return update
@@ -0,0 +1,202 @@
1
+ from __future__ import annotations
2
+
3
+ import io
4
+ from collections import defaultdict
5
+ from typing import TYPE_CHECKING, BinaryIO, Callable
6
+
7
+ from dissect.util.stream import MappingStream
8
+
9
+ from dissect.target.container import Container
10
+ from dissect.target.helpers.record import TargetRecordDescriptor
11
+ from dissect.target.helpers.scrape import Needle, find_needles, scrape_chunks
12
+ from dissect.target.plugin import Plugin, internal
13
+ from dissect.target.volume import EncryptedVolumeSystem, LogicalVolumeSystem, Volume
14
+
15
+ if TYPE_CHECKING:
16
+ from collections.abc import Iterator
17
+
18
+
19
+ class ScrapePlugin(Plugin):
20
+ __namespace__ = "scrape"
21
+
22
+ def check_compatible(self) -> None:
23
+ pass
24
+
25
+ def create_streams(
26
+ self, *, encrypted: bool = True, lvm: bool = True, all: bool = False
27
+ ) -> Iterator[tuple[Container | Volume, MappingStream]]:
28
+ """Yields streams for all disks and volumes of a target.
29
+
30
+ At the basis, each disk of a target is represented as a stream of itself. If the target has volumes, these are
31
+ checked to be either encrypted or LVM volumes (if the respective flags are set). If so, that volume is replaced
32
+ in the disk stream with a stream of the volume itself, or removed.
33
+
34
+ In the case of encrypted volumes, the encrypted volume is replaced with the decrypted volume. This is done
35
+ transparently on the disk stream level, so the consumer does not need to worry about the decryption process.
36
+
37
+ In the case of LVM volumes (including any sort of RAID), the base volumes are removed from the disk stream,
38
+ and a new stream will be yielded for each logical volume. This ensures that no unnecessary scraping is
39
+ performed on base volumes of a logical volume, but only on the reconstructed logical volume.
40
+
41
+ Args:
42
+ encrypted: Whether to replace encrypted volumes for their decrypted counterpart.
43
+ lvm: Whether to skip base volumes of LVM volumes and yield the logical volume itself.
44
+ all: Whether to yield all disks and volumes, regardless of their type.
45
+
46
+ Yields:
47
+ A tuple containing the disk (or volume, in the case of an LVM volume) and a stream of that disk.
48
+ """
49
+ # Create a map of disk regions we want to scrape
50
+ scrape_map = defaultdict(dict)
51
+
52
+ # Start off by making a very simple `disk: {(offset, size): volume}` map for every volume
53
+ # Spaces in between volumes are also added as disk regions
54
+ offset = 0
55
+ for disk in self.target.disks:
56
+ for volume in disk.vs.volumes if disk.vs else []:
57
+ if offset != volume.offset:
58
+ # There's data between the volumes, so add that from the disk
59
+ scrape_map[disk][(offset, volume.offset - offset)] = (disk, offset)
60
+ offset = volume.offset
61
+
62
+ # Add the volume to the stream
63
+ scrape_map[disk][(volume.offset, volume.size)] = (volume, 0)
64
+ offset += volume.size
65
+
66
+ # There's data after the volumes until the end of the disk
67
+ # Coincidentally this also takes care of disks with no volumes
68
+ if offset != disk.size:
69
+ scrape_map[disk][(offset, disk.size - offset)] = (disk, offset)
70
+
71
+ # Iterate over all volumes and add the decrypted variant of encrypted volumes
72
+ for volume in self.target.volumes:
73
+ if encrypted and isinstance(volume.vs, EncryptedVolumeSystem):
74
+ if not all:
75
+ # Decrypted volumes have the encrypted volume as the disk
76
+ source_volume: Volume = volume.disk
77
+ source_disk = source_volume.disk
78
+
79
+ # Replace the encrypted volume region with the decrypted volume region
80
+ scrape_map[source_disk][(source_volume.offset, source_volume.size)] = (volume, 0)
81
+ else:
82
+ # Add the encrypted volume separately to the map
83
+ scrape_map[volume][(0, volume.size)] = (volume, 0)
84
+
85
+ if lvm and isinstance(volume.vs, LogicalVolumeSystem):
86
+ if not all:
87
+ # Remove the base volumes from the map
88
+ for source_volume in volume.disk:
89
+ source_disk = source_volume.disk
90
+ del scrape_map[source_disk][(source_volume.offset, source_volume.size)]
91
+
92
+ # Add the logical volumes to the map
93
+ scrape_map[volume][(0, volume.size)] = (volume, 0)
94
+
95
+ for disk, volumes in scrape_map.items():
96
+ # If we ended up removing all regions from the disk, skip it
97
+ # I.e. when a disk is fully occupied by an LVM volume
98
+ if not volumes:
99
+ continue
100
+
101
+ size = 0
102
+ stream = MappingStream()
103
+ for (map_offset, map_size), (source, source_offset) in volumes.items():
104
+ stream.add(map_offset, map_size, source, source_offset)
105
+ size = max(size, map_offset + map_size)
106
+ stream.size = size
107
+
108
+ yield disk, stream
109
+
110
+ @internal
111
+ def find(
112
+ self,
113
+ needles: Needle | list[Needle],
114
+ lock_seek: bool = True,
115
+ block_size: int = io.DEFAULT_BUFFER_SIZE,
116
+ progress: Callable[[Container | Volume, int, int], None] | None = None,
117
+ ) -> Iterator[tuple[Container | Volume, MappingStream, Needle, int]]:
118
+ """Yields needles and their offsets found in all disks and volumes of a target.
119
+
120
+ Args:
121
+ needles: The needle or list of needles to search for.
122
+ lock_seek: Whether the file position is maintained by the scraper or the consumer.
123
+ Setting this to ``False`` wil allow the consumer to seek the file pointer, i.e. to skip forward.
124
+ block_size: The block size to use for reading from the byte stream.
125
+ progress: A function to call with the current disk, offset and size of the stream.
126
+ """
127
+ for disk, stream in self.create_streams():
128
+ for needle, offset in find_needles(
129
+ stream,
130
+ needles,
131
+ lock_seek=lock_seek,
132
+ block_size=block_size,
133
+ progress=(lambda current: progress(disk, current, stream.size)) if progress else None,
134
+ ):
135
+ yield disk, stream, needle, offset
136
+
137
+ @internal
138
+ def scrape_chunks_from_disks(
139
+ self,
140
+ chunk_parser: Callable[[Needle, bytes], Iterator[TargetRecordDescriptor]],
141
+ needle_chunk_size_map: dict[Needle, int] | None = None,
142
+ needle: Needle | None = None,
143
+ chunk_size: int | None = None,
144
+ chunk_reader: Callable[[BinaryIO, Needle, int, int], bytes] | None = None,
145
+ block_size: int = io.DEFAULT_BUFFER_SIZE,
146
+ ) -> Iterator[TargetRecordDescriptor]:
147
+ """Yields records scraped from chunks found in ``target.disks``.
148
+
149
+ Args:
150
+ chunk_parser: A function to parse a chunk and yield records.
151
+ needle_chunk_size_map: A dictionary with needle as keys and chunk sizes as values.
152
+ needle: A single needle to search for.
153
+ chunk_size: The size of the chunks to scrape, when providing a single needle.
154
+ chunk_reader: A function to read a chunk from a byte stream for provided needle, offset and chunk size.
155
+ block_size: The block size to use for reading from the byte stream.
156
+ """
157
+
158
+ if needle_chunk_size_map and (needle or chunk_size):
159
+ raise ValueError("Either `needle_chunk_size_map` or both `needle` and `chunk_size` must be provided")
160
+
161
+ if (needle and not chunk_size) or (not needle and chunk_size):
162
+ raise ValueError("Both `needle` and `chunk_size` must be provided")
163
+ else:
164
+ needle_chunk_size_map = {needle: chunk_size}
165
+
166
+ for disk in self.target.disks:
167
+ disk.seek(0)
168
+ yield from scrape_chunks(
169
+ disk,
170
+ needle_chunk_size_map=needle_chunk_size_map,
171
+ chunk_parser=chunk_parser,
172
+ chunk_reader=chunk_reader,
173
+ block_size=block_size,
174
+ )
175
+
176
+ @internal
177
+ def scrape_needles_from_disks(
178
+ self,
179
+ needle: Needle | None = None,
180
+ needles: list[Needle] | None = None,
181
+ block_size: int = io.DEFAULT_BUFFER_SIZE,
182
+ ) -> Iterator[tuple[BinaryIO, bytes, int]]:
183
+ """Yields ``(bytestream, needle, offset)`` tuples, scraped from ``target.disks``.
184
+
185
+ Args:
186
+ needles: A list of byte needles to search for.
187
+ needle: A single byte needle to search for.
188
+ block_size: The block size to use for reading from the byte stream.
189
+ """
190
+
191
+ if needle and needles:
192
+ raise ValueError("Either `needles` values or a single `needle` value must be provided")
193
+ elif not needle and not needles:
194
+ raise ValueError("At least one needle value must be provided")
195
+
196
+ if needle:
197
+ needles = [needle]
198
+
199
+ for disk in self.target.disks:
200
+ disk.seek(0)
201
+ for needle, offset in find_needles(disk, needles=needles, block_size=block_size):
202
+ yield disk, needle, offset