dissect.target 3.16.dev21__tar.gz → 3.16.dev23__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (556) hide show
  1. {dissect.target-3.16.dev21/dissect.target.egg-info → dissect.target-3.16.dev23}/PKG-INFO +1 -1
  2. dissect.target-3.16.dev23/dissect/target/helpers/protobuf.py +60 -0
  3. dissect.target-3.16.dev23/dissect/target/plugins/apps/browser/brave.py +68 -0
  4. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/browser/chromium.py +10 -4
  5. dissect.target-3.16.dev23/dissect/target/plugins/apps/container/docker.py +409 -0
  6. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/target.py +3 -3
  7. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23/dissect.target.egg-info}/PKG-INFO +1 -1
  8. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect.target.egg-info/SOURCES.txt +4 -0
  9. dissect.target-3.16.dev23/tests/helpers/test_protobuf.py +52 -0
  10. dissect.target-3.16.dev23/tests/plugins/apps/browser/test_brave.py +47 -0
  11. dissect.target-3.16.dev23/tests/plugins/apps/container/test_docker.py +156 -0
  12. dissect.target-3.16.dev21/dissect/target/plugins/apps/container/docker.py +0 -175
  13. dissect.target-3.16.dev21/tests/plugins/apps/container/test_docker.py +0 -71
  14. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/COPYRIGHT +0 -0
  15. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/LICENSE +0 -0
  16. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/MANIFEST.in +0 -0
  17. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/README.md +0 -0
  18. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/__init__.py +0 -0
  19. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/container.py +0 -0
  20. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/__init__.py +0 -0
  21. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/asdf.py +0 -0
  22. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/ewf.py +0 -0
  23. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/hdd.py +0 -0
  24. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/hds.py +0 -0
  25. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/qcow2.py +0 -0
  26. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/raw.py +0 -0
  27. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/split.py +0 -0
  28. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/vdi.py +0 -0
  29. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/vhd.py +0 -0
  30. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/vhdx.py +0 -0
  31. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/containers/vmdk.py +0 -0
  32. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  33. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/exceptions.py +0 -0
  34. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystem.py +0 -0
  35. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/__init__.py +0 -0
  36. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/ad1.py +0 -0
  37. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/btrfs.py +0 -0
  38. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/cb.py +0 -0
  39. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/config.py +0 -0
  40. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/dir.py +0 -0
  41. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/exfat.py +0 -0
  42. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/extfs.py +0 -0
  43. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/fat.py +0 -0
  44. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/ffs.py +0 -0
  45. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/itunes.py +0 -0
  46. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/jffs.py +0 -0
  47. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/ntfs.py +0 -0
  48. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/smb.py +0 -0
  49. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/squashfs.py +0 -0
  50. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/tar.py +0 -0
  51. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/vmfs.py +0 -0
  52. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/xfs.py +0 -0
  53. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/filesystems/zip.py +0 -0
  54. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/__init__.py +0 -0
  55. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/cache.py +0 -0
  56. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/compat/__init__.py +0 -0
  57. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/compat/path_310.py +0 -0
  58. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/compat/path_311.py +0 -0
  59. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/compat/path_312.py +0 -0
  60. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/compat/path_39.py +0 -0
  61. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/compat/path_common.py +0 -0
  62. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/config.py +0 -0
  63. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/configutil.py +0 -0
  64. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/cyber.py +0 -0
  65. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/data/windowsZones.xml +0 -0
  66. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/descriptor_extensions.py +0 -0
  67. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/docs.py +0 -0
  68. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/fsutil.py +0 -0
  69. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/hashutil.py +0 -0
  70. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/keychain.py +0 -0
  71. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/lazy.py +0 -0
  72. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/loaderutil.py +0 -0
  73. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/localeutil.py +0 -0
  74. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/mount.py +0 -0
  75. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/mui.py +0 -0
  76. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/network_managers.py +0 -0
  77. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/polypath.py +0 -0
  78. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/record.py +0 -0
  79. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/record_modifier.py +0 -0
  80. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/regutil.py +0 -0
  81. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/shell_folder_ids.py +0 -0
  82. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/ssh.py +0 -0
  83. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/targetd.py +0 -0
  84. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/helpers/utils.py +0 -0
  85. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loader.py +0 -0
  86. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/__init__.py +0 -0
  87. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/ad1.py +0 -0
  88. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/asdf.py +0 -0
  89. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/cb.py +0 -0
  90. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/cyber.py +0 -0
  91. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/dir.py +0 -0
  92. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/hyperv.py +0 -0
  93. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/itunes.py +0 -0
  94. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/kape.py +0 -0
  95. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/local.py +0 -0
  96. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/log.py +0 -0
  97. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/multiraw.py +0 -0
  98. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/ova.py +0 -0
  99. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/ovf.py +0 -0
  100. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/phobos.py +0 -0
  101. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/profile.py +0 -0
  102. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/pvm.py +0 -0
  103. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/pvs.py +0 -0
  104. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/raw.py +0 -0
  105. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/remote.py +0 -0
  106. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/res.py +0 -0
  107. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/smb.py +0 -0
  108. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/tanium.py +0 -0
  109. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/tar.py +0 -0
  110. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/target.py +0 -0
  111. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/targetd.py +0 -0
  112. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/utm.py +0 -0
  113. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/vb.py +0 -0
  114. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/vbox.py +0 -0
  115. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/velociraptor.py +0 -0
  116. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/vma.py +0 -0
  117. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/vmwarevm.py +0 -0
  118. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/vmx.py +0 -0
  119. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/loaders/xva.py +0 -0
  120. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugin.py +0 -0
  121. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/__init__.py +0 -0
  122. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/__init__.py +0 -0
  123. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/av/__init__.py +0 -0
  124. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  125. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/av/sophos.py +0 -0
  126. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/av/symantec.py +0 -0
  127. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  128. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  129. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/browser/browser.py +0 -0
  130. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/browser/chrome.py +0 -0
  131. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/browser/edge.py +0 -0
  132. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/browser/firefox.py +0 -0
  133. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  134. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/container/__init__.py +0 -0
  135. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
  136. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
  137. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
  138. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
  139. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/shell/__init__.py +0 -0
  140. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  141. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
  142. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
  143. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  144. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/ssh/putty.py +0 -0
  145. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/ssh/ssh.py +0 -0
  146. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
  147. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  148. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  149. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
  150. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  151. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
  152. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  153. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  154. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
  155. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  156. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  157. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  158. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/child/__init__.py +0 -0
  159. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/child/esxi.py +0 -0
  160. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/child/hyperv.py +0 -0
  161. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/child/virtuozzo.py +0 -0
  162. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  163. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/child/wsl.py +0 -0
  164. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/__init__.py +0 -0
  165. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  166. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  167. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/icat.py +0 -0
  168. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
  169. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
  170. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  171. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  172. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  173. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/resolver.py +0 -0
  174. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
  175. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
  176. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  177. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/walkfs.py +0 -0
  178. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/filesystem/yara.py +0 -0
  179. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/__init__.py +0 -0
  180. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/config.py +0 -0
  181. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/default.py +0 -0
  182. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/example.py +0 -0
  183. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/loaders.py +0 -0
  184. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/osinfo.py +0 -0
  185. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/plugins.py +0 -0
  186. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/scrape.py +0 -0
  187. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/general/users.py +0 -0
  188. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/__init__.py +0 -0
  189. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/__init__.py +0 -0
  190. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/_os.py +0 -0
  191. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  192. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  193. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  194. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/citrix/history.py +0 -0
  195. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
  196. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
  197. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
  198. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  199. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
  200. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  201. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
  202. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  203. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  204. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  205. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/datetime.py +0 -0
  206. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/esxi/__init__.py +0 -0
  207. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/esxi/_os.py +0 -0
  208. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/etc.py +0 -0
  209. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/generic.py +0 -0
  210. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/history.py +0 -0
  211. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
  212. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
  213. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
  214. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
  215. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  216. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
  217. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  218. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  219. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  220. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
  221. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  222. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  223. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/fortios/__init__.py +0 -0
  224. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/fortios/_os.py +0 -0
  225. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/fortios/generic.py +0 -0
  226. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/fortios/locale.py +0 -0
  227. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  228. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  229. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  230. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  231. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  232. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
  233. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
  234. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  235. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/services.py +0 -0
  236. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  237. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
  238. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  239. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  240. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/locale.py +0 -0
  241. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
  242. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  243. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  244. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  245. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  246. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  247. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  248. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  249. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
  250. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/unix/shadow.py +0 -0
  251. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/__init__.py +0 -0
  252. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/_os.py +0 -0
  253. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  254. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
  255. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/amcache.py +0 -0
  256. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/catroot.py +0 -0
  257. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/cim.py +0 -0
  258. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/clfs.py +0 -0
  259. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/datetime.py +0 -0
  260. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/defender.py +0 -0
  261. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
  262. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
  263. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
  264. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
  265. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
  266. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/env.py +0 -0
  267. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
  268. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  269. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/generic.py +0 -0
  270. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/lnk.py +0 -0
  271. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/locale.py +0 -0
  272. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
  273. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  274. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  275. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/log/evt.py +0 -0
  276. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  277. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  278. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/log/schedlgu.py +0 -0
  279. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/notifications.py +0 -0
  280. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  281. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  282. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
  283. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
  284. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  285. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  286. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  287. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  288. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  289. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  290. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  291. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  292. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  293. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  294. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  295. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  296. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  297. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
  298. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  299. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
  300. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  301. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/registry.py +0 -0
  302. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/sam.py +0 -0
  303. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/services.py +0 -0
  304. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/sru.py +0 -0
  305. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  306. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/syscache.py +0 -0
  307. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/task_helpers/__init__.py +0 -0
  308. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
  309. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
  310. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +0 -0
  311. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/tasks.py +0 -0
  312. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  313. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/ual.py +0 -0
  314. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/plugins/os/windows/wer.py +0 -0
  315. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/report.py +0 -0
  316. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/__init__.py +0 -0
  317. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/build_pluginlist.py +0 -0
  318. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/dd.py +0 -0
  319. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/dump/__init__.py +0 -0
  320. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/dump/run.py +0 -0
  321. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/dump/state.py +0 -0
  322. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/dump/utils.py +0 -0
  323. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/fs.py +0 -0
  324. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/info.py +0 -0
  325. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/logging.py +0 -0
  326. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/mount.py +0 -0
  327. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/query.py +0 -0
  328. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/reg.py +0 -0
  329. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/shell.py +0 -0
  330. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/tools/utils.py +0 -0
  331. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volume.py +0 -0
  332. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/__init__.py +0 -0
  333. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/bde.py +0 -0
  334. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/ddf.py +0 -0
  335. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/disk.py +0 -0
  336. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/luks.py +0 -0
  337. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/lvm.py +0 -0
  338. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/md.py +0 -0
  339. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect/target/volumes/vmfs.py +0 -0
  340. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect.target.egg-info/dependency_links.txt +0 -0
  341. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect.target.egg-info/entry_points.txt +0 -0
  342. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect.target.egg-info/requires.txt +0 -0
  343. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/dissect.target.egg-info/top_level.txt +0 -0
  344. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/pyproject.toml +0 -0
  345. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/setup.cfg +0 -0
  346. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/__init__.py +0 -0
  347. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/_docs/Makefile +0 -0
  348. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/_docs/conf.py +0 -0
  349. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/_docs/index.rst +0 -0
  350. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/_utils.py +0 -0
  351. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/conftest.py +0 -0
  352. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/containers/__init__.py +0 -0
  353. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/containers/test_split.py +0 -0
  354. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/__init__.py +0 -0
  355. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_cb.py +0 -0
  356. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_config.py +0 -0
  357. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_dir.py +0 -0
  358. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_exfat.py +0 -0
  359. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_fat.py +0 -0
  360. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_ntfs.py +0 -0
  361. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_smb.py +0 -0
  362. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_tar.py +0 -0
  363. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/filesystems/test_zip.py +0 -0
  364. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/__init__.py +0 -0
  365. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_cache.py +0 -0
  366. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_config.py +0 -0
  367. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_configutil.py +0 -0
  368. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_docs.py +0 -0
  369. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_fsutil.py +0 -0
  370. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_hashutil.py +0 -0
  371. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_keychain.py +0 -0
  372. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_loaderutil.py +0 -0
  373. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_localeutil.py +0 -0
  374. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_modifier.py +0 -0
  375. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_record.py +0 -0
  376. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_regutil.py +0 -0
  377. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/helpers/test_utils.py +0 -0
  378. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/__init__.py +0 -0
  379. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_asdf.py +0 -0
  380. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_cb.py +0 -0
  381. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_dir.py +0 -0
  382. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_hyperv.py +0 -0
  383. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_kape.py +0 -0
  384. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_local.py +0 -0
  385. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_log.py +0 -0
  386. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_multiraw.py +0 -0
  387. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_ova.py +0 -0
  388. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_ovf.py +0 -0
  389. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_phobos.py +0 -0
  390. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_pvm.py +0 -0
  391. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_pvs.py +0 -0
  392. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_remote.py +0 -0
  393. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_smb.py +0 -0
  394. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_tanium.py +0 -0
  395. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_tar.py +0 -0
  396. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_utm.py +0 -0
  397. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_vbox.py +0 -0
  398. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_velociraptor.py +0 -0
  399. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/loaders/test_vmwarevm.py +0 -0
  400. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/__init__.py +0 -0
  401. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/__init__.py +0 -0
  402. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/av/__init__.py +0 -0
  403. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/av/test_mcafee.py +0 -0
  404. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/av/test_sophos.py +0 -0
  405. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/av/test_symantec.py +0 -0
  406. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  407. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/browser/__init__.py +0 -0
  408. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/browser/test_chrome.py +0 -0
  409. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/browser/test_chromium.py +0 -0
  410. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/browser/test_edge.py +0 -0
  411. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/browser/test_firefox.py +0 -0
  412. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/browser/test_iexplore.py +0 -0
  413. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/container/__init__.py +0 -0
  414. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/remoteaccess/__init__.py +0 -0
  415. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
  416. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
  417. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/shell/__init__.py +0 -0
  418. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/shell/test_powershell.py +0 -0
  419. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/ssh/__init__.py +0 -0
  420. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  421. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  422. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/ssh/test_putty.py +0 -0
  423. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/vpn/__init__.py +0 -0
  424. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  425. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  426. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webhosting/__init__.py +0 -0
  427. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  428. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webserver/__init__.py +0 -0
  429. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webserver/test_apache.py +0 -0
  430. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  431. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webserver/test_citrix.py +0 -0
  432. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webserver/test_iis.py +0 -0
  433. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  434. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/apps/webserver/test_webserver.py +0 -0
  435. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/child/__init__.py +0 -0
  436. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/child/test_hyperv.py +0 -0
  437. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/child/test_virtuozzo.py +0 -0
  438. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/child/test_wsl.py +0 -0
  439. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/__init__.py +0 -0
  440. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/ntfs/__init__.py +0 -0
  441. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
  442. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  443. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  444. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  445. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/test_icat.py +0 -0
  446. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/test_resolver.py +0 -0
  447. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/test_walkfs.py +0 -0
  448. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/test_yara.py +0 -0
  449. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/unix/__init__.py +0 -0
  450. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/unix/test_capability.py +0 -0
  451. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  452. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/general/__init__.py +0 -0
  453. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/general/test_config.py +0 -0
  454. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/general/test_default.py +0 -0
  455. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/general/test_plugins.py +0 -0
  456. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/general/test_scrape.py +0 -0
  457. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/general/test_users.py +0 -0
  458. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/__init__.py +0 -0
  459. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/__init__.py +0 -0
  460. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/bsd/__init__.py +0 -0
  461. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  462. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  463. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/bsd/citrix/test_history.py +0 -0
  464. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/bsd/osx/__init__.py +0 -0
  465. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  466. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  467. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/__init__.py +0 -0
  468. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/android/__init__.py +0 -0
  469. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  470. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/debian/__init__.py +0 -0
  471. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  472. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  473. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/redhat/__init__.py +0 -0
  474. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  475. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/suse/__init__.py +0 -0
  476. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  477. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  478. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  479. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  480. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  481. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  482. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  483. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  484. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_services.py +0 -0
  485. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  486. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/log/__init__.py +0 -0
  487. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/log/test_atop.py +0 -0
  488. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/log/test_audit.py +0 -0
  489. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/log/test_auth.py +0 -0
  490. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  491. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/log/test_messages.py +0 -0
  492. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  493. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test__os.py +0 -0
  494. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_generic.py +0 -0
  495. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_history.py +0 -0
  496. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_ips.py +0 -0
  497. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_journal.py +0 -0
  498. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_locale.py +0 -0
  499. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  500. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_shadow.py +0 -0
  501. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_users.py +0 -0
  502. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/unix/test_version.py +0 -0
  503. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/__init__.py +0 -0
  504. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/log/test_etl.py +0 -0
  505. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/log/test_evt.py +0 -0
  506. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/log/test_evtx.py +0 -0
  507. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/log/test_schedlgu.py +0 -0
  508. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/regf/__init__.py +0 -0
  509. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  510. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  511. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  512. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  513. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  514. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  515. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test__os.py +0 -0
  516. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  517. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_amcache.py +0 -0
  518. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_clfs.py +0 -0
  519. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_datetime.py +0 -0
  520. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_defender.py +0 -0
  521. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_dpapi.py +0 -0
  522. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_env.py +0 -0
  523. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_generic.py +0 -0
  524. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_lnk.py +0 -0
  525. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_locale.py +0 -0
  526. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_mru.py +0 -0
  527. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_notifications.py +0 -0
  528. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_prefetch.py +0 -0
  529. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  530. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_registry.py +0 -0
  531. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_sam.py +0 -0
  532. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_shimcache.py +0 -0
  533. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_sru.py +0 -0
  534. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_syscache.py +0 -0
  535. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_tasks.py +0 -0
  536. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  537. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_ual.py +0 -0
  538. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/plugins/os/windows/test_wer.py +0 -0
  539. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/test_container.py +0 -0
  540. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/test_filesystem.py +0 -0
  541. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/test_plugin.py +0 -0
  542. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/test_registration.py +0 -0
  543. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/test_report.py +0 -0
  544. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/test_target.py +0 -0
  545. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/test_volume.py +0 -0
  546. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/tools/__init__.py +0 -0
  547. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/tools/test_dump.py +0 -0
  548. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/tools/test_fs.py +0 -0
  549. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/tools/test_mount.py +0 -0
  550. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/tools/test_query.py +0 -0
  551. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/tools/test_shell.py +0 -0
  552. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/tools/test_utils.py +0 -0
  553. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/volumes/__init__.py +0 -0
  554. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/volumes/test_bde.py +0 -0
  555. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tests/volumes/test_md.py +0 -0
  556. {dissect.target-3.16.dev21 → dissect.target-3.16.dev23}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.16.dev21
3
+ Version: 3.16.dev23
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
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, BinaryIO
4
+
5
+ from dissect.cstruct.types.base import BaseType
6
+ from dissect.cstruct.types.bytesinteger import BytesInteger
7
+
8
+
9
+ class ProtobufVarint(BytesInteger):
10
+ """Implements a protobuf integer type for dissect.cstruct that can span a variable amount of bytes.
11
+
12
+ Mainly follows the cstruct BytesInteger implementation with minor tweaks
13
+ to support protobuf's msb varint implementation.
14
+
15
+ Resources:
16
+ - https://protobuf.dev/programming-guides/encoding/
17
+ - https://github.com/protocolbuffers/protobuf/blob/main/python/google/protobuf/internal/decoder.py
18
+ """
19
+
20
+ def _read(self, stream: BinaryIO, context: dict[str, Any] = None) -> int:
21
+ return decode_varint(stream)
22
+
23
+ def _write(self, stream: BinaryIO, data: int) -> int:
24
+ return stream.write(encode_varint(data))
25
+
26
+ _read_array = BaseType._read_array
27
+
28
+ _write_array = BaseType._write_array
29
+
30
+
31
+ def decode_varint(stream: BinaryIO) -> int:
32
+ """Reads a varint from the provided buffer stream.
33
+
34
+ If we have not reached the end of a varint, the msb will be 1.
35
+ We read every byte from our current position until the msb is 0.
36
+ """
37
+ result = 0
38
+ i = 0
39
+ while True:
40
+ byte = stream.read(1)
41
+ result |= (byte[0] & 0x7F) << (i * 7)
42
+ i += 1
43
+ if byte[0] & 0x80 == 0:
44
+ break
45
+
46
+ return result
47
+
48
+
49
+ def encode_varint(number: int) -> bytes:
50
+ """Encode a decoded protobuf varint to its original bytes."""
51
+ buf = []
52
+ while True:
53
+ towrite = number & 0x7F
54
+ number >>= 7
55
+ if number:
56
+ buf.append(towrite | 0x80)
57
+ else:
58
+ buf.append(towrite)
59
+ break
60
+ return bytes(buf)
@@ -0,0 +1,68 @@
1
+ from typing import Iterator
2
+
3
+ from dissect.target.helpers.descriptor_extensions import UserRecordDescriptorExtension
4
+ from dissect.target.helpers.record import create_extended_descriptor
5
+ from dissect.target.plugin import export
6
+ from dissect.target.plugins.apps.browser.browser import (
7
+ GENERIC_COOKIE_FIELDS,
8
+ GENERIC_DOWNLOAD_RECORD_FIELDS,
9
+ GENERIC_EXTENSION_RECORD_FIELDS,
10
+ GENERIC_HISTORY_RECORD_FIELDS,
11
+ BrowserPlugin,
12
+ )
13
+ from dissect.target.plugins.apps.browser.chromium import (
14
+ CHROMIUM_DOWNLOAD_RECORD_FIELDS,
15
+ ChromiumMixin,
16
+ )
17
+
18
+
19
+ class BravePlugin(ChromiumMixin, BrowserPlugin):
20
+ """Brave browser plugin."""
21
+
22
+ __namespace__ = "brave"
23
+
24
+ DIRS = [
25
+ # Windows
26
+ "AppData/Local/BraveSoftware/Brave-Browser/User Data/Default",
27
+ "AppData/Roaming/BraveSoftware/Brave-Browser/User Data/Default",
28
+ # Linux
29
+ ".config/BraveSoftware/Default",
30
+ # Macos
31
+ "Library/Application Support/BraveSoftware/Default",
32
+ ]
33
+
34
+ BrowserHistoryRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
35
+ "browser/brave/history", GENERIC_HISTORY_RECORD_FIELDS
36
+ )
37
+
38
+ BrowserCookieRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
39
+ "browser/brave/cookie", GENERIC_COOKIE_FIELDS
40
+ )
41
+
42
+ BrowserDownloadRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
43
+ "browser/brave/download", GENERIC_DOWNLOAD_RECORD_FIELDS + CHROMIUM_DOWNLOAD_RECORD_FIELDS
44
+ )
45
+
46
+ BrowserExtensionRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
47
+ "browser/brave/extension", GENERIC_EXTENSION_RECORD_FIELDS
48
+ )
49
+
50
+ @export(record=BrowserHistoryRecord)
51
+ def history(self) -> Iterator[BrowserHistoryRecord]:
52
+ """Return browser history records for Brave."""
53
+ yield from super().history("brave")
54
+
55
+ @export(record=BrowserCookieRecord)
56
+ def cookies(self) -> Iterator[BrowserCookieRecord]:
57
+ """Return browser cookie records for Brave."""
58
+ yield from super().cookies("brave")
59
+
60
+ @export(record=BrowserDownloadRecord)
61
+ def downloads(self) -> Iterator[BrowserDownloadRecord]:
62
+ """Return browser download records for Brave."""
63
+ yield from super().downloads("brave")
64
+
65
+ @export(record=BrowserExtensionRecord)
66
+ def extensions(self) -> Iterator[BrowserExtensionRecord]:
67
+ """Return browser extension records for Brave."""
68
+ yield from super().extensions("brave")
@@ -1,3 +1,4 @@
1
+ import itertools
1
2
  import json
2
3
  from collections import defaultdict
3
4
  from typing import Iterator, Optional
@@ -9,7 +10,7 @@ from dissect.util.ts import webkittimestamp
9
10
 
10
11
  from dissect.target.exceptions import FileNotFoundError, UnsupportedPluginError
11
12
  from dissect.target.helpers.descriptor_extensions import UserRecordDescriptorExtension
12
- from dissect.target.helpers.fsutil import TargetPath
13
+ from dissect.target.helpers.fsutil import TargetPath, join
13
14
  from dissect.target.helpers.record import create_extended_descriptor
14
15
  from dissect.target.plugin import export
15
16
  from dissect.target.plugins.apps.browser.browser import (
@@ -69,11 +70,12 @@ class ChromiumMixin:
69
70
  users_dirs.append((user_details.user, cur_dir))
70
71
  return users_dirs
71
72
 
72
- def _iter_db(self, filename: str) -> Iterator[SQLite3]:
73
+ def _iter_db(self, filename: str, subdirs: Optional[list[str]] = None) -> Iterator[SQLite3]:
73
74
  """Generate a connection to a sqlite database file.
74
75
 
75
76
  Args:
76
77
  filename: The filename as string of the database where the data is stored.
78
+ subdirs: Subdirectories to also try for every configured directory.
77
79
 
78
80
  Yields:
79
81
  opened db_file (SQLite3)
@@ -83,7 +85,11 @@ class ChromiumMixin:
83
85
  SQLError: If the history file could not be opened.
84
86
  """
85
87
 
86
- for user, cur_dir in self._build_userdirs(self.DIRS):
88
+ dirs = self.DIRS
89
+ if subdirs:
90
+ dirs.extend([join(dir, subdir) for dir, subdir in itertools.product(self.DIRS, subdirs)])
91
+
92
+ for user, cur_dir in self._build_userdirs(dirs):
87
93
  db_file = cur_dir.joinpath(filename)
88
94
  try:
89
95
  yield user, db_file, sqlite3.SQLite3(db_file.open())
@@ -198,7 +204,7 @@ class ChromiumMixin:
198
204
  is_http_only (bool): Cookie http only flag.
199
205
  same_site (bool): Cookie same site flag.
200
206
  """
201
- for user, db_file, db in self._iter_db("Cookies"):
207
+ for user, db_file, db in self._iter_db("Cookies", subdirs=["Network"]):
202
208
  try:
203
209
  for cookie in db.table("cookies").rows():
204
210
  yield self.BrowserCookieRecord(
@@ -0,0 +1,409 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import logging
5
+ import re
6
+ from pathlib import Path
7
+ from typing import Iterator, Optional
8
+
9
+ from dissect.cstruct import cstruct
10
+ from dissect.util import ts
11
+
12
+ from dissect.target.exceptions import UnsupportedPluginError
13
+ from dissect.target.helpers.fsutil import open_decompress
14
+ from dissect.target.helpers.protobuf import ProtobufVarint
15
+ from dissect.target.helpers.record import TargetRecordDescriptor
16
+ from dissect.target.plugin import Plugin, arg, export
17
+ from dissect.target.target import Target
18
+
19
+ log = logging.getLogger(__name__)
20
+
21
+ DockerContainerRecord = TargetRecordDescriptor(
22
+ "apps/containers/docker/container",
23
+ [
24
+ ("string", "container_id"),
25
+ ("string", "image"),
26
+ ("string", "command"),
27
+ ("datetime", "created"),
28
+ ("string", "running"),
29
+ ("varint", "pid"),
30
+ ("datetime", "started"),
31
+ ("datetime", "finished"),
32
+ ("string", "ports"),
33
+ ("string", "names"),
34
+ ("stringlist", "volumes"),
35
+ ("string", "source"),
36
+ ],
37
+ )
38
+
39
+ DockerImageRecord = TargetRecordDescriptor(
40
+ "apps/containers/docker/image",
41
+ [
42
+ ("string", "name"),
43
+ ("string", "tag"),
44
+ ("string", "image_id"),
45
+ ("string", "hash"),
46
+ ("datetime", "created"),
47
+ ],
48
+ )
49
+
50
+ DockerLogRecord = TargetRecordDescriptor(
51
+ "apps/containers/docker/log",
52
+ [
53
+ ("datetime", "ts"),
54
+ ("string", "container"),
55
+ ("string", "stream"),
56
+ ("string", "message"),
57
+ ],
58
+ )
59
+
60
+ # Resources:
61
+ # - https://github.com/moby/moby/pull/37092
62
+ # - https://github.com/cpuguy83/docker/blob/master/daemon/logger/local/doc.go
63
+ # - https://github.com/moby/moby/blob/master/api/types/plugins/logdriver/entry.proto
64
+ local_def = """
65
+ struct entry {
66
+ uint32 header;
67
+
68
+ // source
69
+ uint8 s_type; // 0x0a
70
+ varint s_len; // 0x06
71
+ char source[s_len]; // stdout or stderr
72
+
73
+ // timestamp
74
+ uint8 t_type; // 0x10
75
+ varint ts; // timestamp in ums
76
+
77
+ // message
78
+ uint8 m_type; // 0x1a
79
+ varint m_len; // message length
80
+ char message[m_len];
81
+
82
+ // partial_log_metadata not implemented
83
+
84
+ uint32 footer;
85
+ };
86
+ """
87
+
88
+ c_local = cstruct(endian=">")
89
+ c_local.addtype("varint", ProtobufVarint(c_local, "varint", size=None, signed=False, alignment=1))
90
+ c_local.load(local_def, compiled=False)
91
+
92
+ RE_DOCKER_NS = re.compile(r"\.(?P<nanoseconds>\d{7,})(?P<postfix>Z|\+\d{2}:\d{2})")
93
+ RE_ANSI_ESCAPE = re.compile(r"\x1b(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
94
+
95
+ ASCII_MAP = {
96
+ "\x08": "[BS]",
97
+ "\x09": "[TAB]",
98
+ "\x0A": "", # \n
99
+ "\x0D": "", # \r
100
+ }
101
+
102
+
103
+ class DockerPlugin(Plugin):
104
+ """Parse Docker Daemon artefacts.
105
+
106
+ References:
107
+ - https://didactic-security.com/resources/docker-forensics.pdf
108
+ - https://didactic-security.com/resources/docker-forensics-cheatsheet.pdf
109
+ - https://github.com/google/docker-explorer
110
+ """
111
+
112
+ __namespace__ = "docker"
113
+
114
+ def __init__(self, target: Target):
115
+ super().__init__(target)
116
+ self.installs = set(find_installs(target))
117
+
118
+ def check_compatible(self) -> None:
119
+ if not self.installs:
120
+ raise UnsupportedPluginError("No Docker install(s) found")
121
+
122
+ @export(record=DockerImageRecord)
123
+ def images(self) -> Iterator[DockerImageRecord]:
124
+ """Returns any pulled docker images on the target system."""
125
+
126
+ for data_root in self.installs:
127
+ images_path = data_root.joinpath("image/overlay2/repositories.json")
128
+
129
+ if images_path.exists():
130
+ repositories = json.loads(images_path.read_text()).get("Repositories")
131
+ else:
132
+ self.target.log.debug("No docker images found, file %s does not exist.", images_path)
133
+ continue
134
+
135
+ for name, tags in repositories.items():
136
+ for tag, hash in tags.items():
137
+ image_metadata_path = data_root.joinpath(
138
+ "image/overlay2/imagedb/content/sha256/", hash.split(":")[-1]
139
+ )
140
+ created = None
141
+
142
+ if image_metadata_path.exists():
143
+ image_metadata = json.loads(image_metadata_path.read_text())
144
+ created = convert_timestamp(image_metadata.get("created"))
145
+
146
+ yield DockerImageRecord(
147
+ name=name,
148
+ tag=tag,
149
+ image_id=hash_to_image_id(hash),
150
+ created=created,
151
+ hash=hash,
152
+ _target=self.target,
153
+ )
154
+
155
+ @export(record=DockerContainerRecord)
156
+ def containers(self) -> Iterator[DockerContainerRecord]:
157
+ """Returns any docker containers present on the target system."""
158
+
159
+ for data_root in self.installs:
160
+ for config_path in data_root.joinpath("containers").glob("**/config.v2.json"):
161
+ config = json.loads(config_path.read_text())
162
+ running = config.get("State").get("Running")
163
+ if running:
164
+ ports = config.get("NetworkSettings").get("Ports", {})
165
+ pid = config.get("Pid")
166
+ else:
167
+ ports = config.get("Config").get("ExposedPorts", {})
168
+ pid = None
169
+ volumes = []
170
+ if mount_points := config.get("MountPoints"):
171
+ for mp in mount_points:
172
+ mount_point = mount_points[mp]
173
+ volumes.append(f"{mount_point.get('Source')}:{mount_point.get('Destination')}")
174
+ yield DockerContainerRecord(
175
+ container_id=config.get("ID"),
176
+ image=config.get("Config").get("Image"),
177
+ command=config.get("Config").get("Cmd"),
178
+ created=convert_timestamp(config.get("Created")),
179
+ running=running,
180
+ pid=pid,
181
+ started=convert_timestamp(config.get("State").get("StartedAt")),
182
+ finished=convert_timestamp(config.get("State").get("FinishedAt")),
183
+ ports=convert_ports(ports),
184
+ names=config.get("Name").replace("/", "", 1),
185
+ volumes=volumes,
186
+ source=config_path,
187
+ _target=self.target,
188
+ )
189
+
190
+ @export(record=DockerLogRecord)
191
+ @arg(
192
+ "--raw-messages",
193
+ action="store_true",
194
+ help="preserve ANSI escape sequences and trailing newlines from log messages",
195
+ )
196
+ @arg(
197
+ "--remove-backspaces",
198
+ action="store_true",
199
+ help="alter messages by removing ASCII backspaces and the corresponding characters",
200
+ )
201
+ def logs(self, raw_messages: bool = False, remove_backspaces: bool = False) -> Iterator[DockerLogRecord]:
202
+ """Returns log files (stdout/stderr) from Docker containers.
203
+
204
+ The default Docker Daemon log driver is ``json-file``, which
205
+ performs no log rotation. Another log driver is ``local`` and
206
+ performs log rotation and compresses log files more efficiently.
207
+
208
+ Eventually ``local`` will likely replace ``json-file`` as the
209
+ default log driver.
210
+
211
+ Resources:
212
+ - https://docs.docker.com/config/containers/logging/configure/
213
+ - https://docs.docker.com/config/containers/logging/json-file/
214
+ - https://docs.docker.com/config/containers/logging/local/
215
+ """
216
+
217
+ for data_root in self.installs:
218
+ containers_path = data_root.joinpath("containers")
219
+
220
+ for log_file in containers_path.glob(("**/*.log*")):
221
+ container = log_file.parent
222
+
223
+ # json log driver
224
+ if "-json.log" in log_file.name:
225
+ for log_entry in self._parse_json_log(log_file):
226
+ yield DockerLogRecord(
227
+ ts=log_entry.get("time"),
228
+ container=container.name, # container hash
229
+ stream=log_entry.get("stream"),
230
+ message=log_entry.get("log")
231
+ if raw_messages
232
+ else strip_log(log_entry.get("log"), remove_backspaces),
233
+ _target=self.target,
234
+ )
235
+
236
+ # local log driver
237
+ else:
238
+ for log_entry in self._parse_local_log(log_file):
239
+ yield DockerLogRecord(
240
+ ts=ts.from_unix_us(log_entry.ts // 1000),
241
+ container=container.parent.name, # container hash
242
+ stream=log_entry.source,
243
+ message=log_entry.message
244
+ if raw_messages
245
+ else strip_log(log_entry.message, remove_backspaces),
246
+ _target=self.target,
247
+ )
248
+
249
+ def _parse_local_log(self, path: Path) -> Iterator[c_local.entry]:
250
+ fh = open_decompress(path, "rb") # can be a .gz file
251
+
252
+ while True:
253
+ try:
254
+ entry = c_local.entry(fh)
255
+ if entry.header != entry.footer:
256
+ self.target.log.warning(
257
+ "Could not reliably parse log entry at offset %i in file %s."
258
+ "Entry could be parsed incorrectly. Please report this "
259
+ "issue as Docker's protobuf could have changed.",
260
+ fh.tell(),
261
+ path,
262
+ )
263
+ yield entry
264
+ except EOFError:
265
+ break
266
+
267
+ def _parse_json_log(self, path: Path) -> Iterator[dict]:
268
+ for line in open_decompress(path, "rt"):
269
+ try:
270
+ entry = json.loads(line)
271
+ except json.JSONDecodeError as e:
272
+ self.target.log.warning("Could not decode JSON line in file %s", path)
273
+ self.target.log.debug("", exc_info=e)
274
+ continue
275
+ yield entry
276
+
277
+
278
+ def get_data_path(path: Path) -> Optional[str]:
279
+ """Returns the configured Docker daemon data-root path."""
280
+ try:
281
+ config = json.loads(path.open("rt").read())
282
+ except json.JSONDecodeError as e:
283
+ log.warning("Could not read JSON file '%s'", path)
284
+ log.debug(exc_info=e)
285
+
286
+ return config.get("data-root")
287
+
288
+
289
+ def find_installs(target: Target) -> Iterator[Path]:
290
+ """Attempt to find additional configured and existing Docker daemon data-root folders.
291
+
292
+ References:
293
+ - https://docs.docker.com/config/daemon/
294
+ """
295
+
296
+ default_config_paths = [
297
+ # Linux
298
+ "/etc/docker/daemon.json",
299
+ "/var/snap/docker/current/config/daemon.json",
300
+ # Windows
301
+ "sysvol/ProgramData/docker/config/daemon.json",
302
+ ]
303
+
304
+ user_config_paths = [
305
+ # Docker Desktop (macOS/Windows/Linux)
306
+ ".docker/daemon.json",
307
+ ]
308
+
309
+ if (default_root := target.fs.path("/var/lib/docker")).exists():
310
+ yield default_root
311
+
312
+ for path in default_config_paths:
313
+ if (config_file := target.fs.path(path)).exists():
314
+ if (data_root_path := target.fs.path(get_data_path(config_file))).exists():
315
+ yield data_root_path
316
+
317
+ for path in user_config_paths:
318
+ for user_details in target.user_details.all_with_home():
319
+ if (config_file := user_details.home_path.joinpath(path)).exists():
320
+ if (data_root_path := target.fs.path(get_data_path(config_file))).exists():
321
+ yield data_root_path
322
+
323
+
324
+ def convert_timestamp(timestamp: str) -> str:
325
+ """Docker sometimes uses (unpadded) 9 digit nanosecond precision
326
+ in their timestamp logs, eg. "2022-12-19T13:37:00.123456789Z".
327
+
328
+ Python has no native %n nanosecond strptime directive, so we
329
+ strip the last three digits from the timestamp to force
330
+ compatbility with the 6 digit %f microsecond directive.
331
+ """
332
+
333
+ timestamp_nanoseconds_plus_postfix = timestamp[19:]
334
+ match = RE_DOCKER_NS.match(timestamp_nanoseconds_plus_postfix)
335
+
336
+ # Timestamp does not have nanoseconds if there is no match.
337
+ if not match:
338
+ return timestamp
339
+
340
+ # Take the first six digits and reconstruct the timestamp.
341
+ match = match.groupdict()
342
+ microseconds = match["nanoseconds"][:6]
343
+ return f"{timestamp[:19]}.{microseconds}{match['postfix']}"
344
+
345
+
346
+ def convert_ports(ports: dict[str, list | dict]) -> dict:
347
+ """Depending on the state of the container (turned on or off) we
348
+ can salvage forwarded ports for the container in different
349
+ parts of the config.v2.json file.
350
+
351
+ This function attempts to be agnostic and deals with
352
+ "Ports" lists and "ExposedPorts" dicts.
353
+
354
+ NOTE: This function makes a couple of assumptions and ignores
355
+ ipv6 assignments. Feel free to improve this helper function.
356
+ """
357
+
358
+ fports = {}
359
+ for key, value in ports.items():
360
+ if isinstance(value, list):
361
+ # NOTE: We ignore IPv6 assignments here.
362
+ fports[key] = f"{value[0]['HostIp']}:{value[0]['HostPort']}"
363
+ elif isinstance(value, dict):
364
+ # NOTE: We make the assumption the default broadcast ip 0.0.0.0 was used.
365
+ fports[key] = f"0.0.0.0:{key.split('/')[0]}"
366
+
367
+ return fports
368
+
369
+
370
+ def hash_to_image_id(hash: str) -> str:
371
+ """Convert the hash to an abbrevated docker image id."""
372
+ return hash.split(":")[-1][:12]
373
+
374
+
375
+ def strip_log(input: str | bytes, exc_backspace: bool = False) -> str:
376
+ """Remove ANSI escape sequences from a given input string.
377
+
378
+ Also translates ASCII codes such as backspaces to readable format.
379
+
380
+ Resources:
381
+ - https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797#general-ascii-codes
382
+ """
383
+
384
+ if isinstance(input, bytes):
385
+ input = input.decode("utf-8", errors="backslashreplace")
386
+
387
+ out = RE_ANSI_ESCAPE.sub("", input)
388
+
389
+ if exc_backspace:
390
+ out = _replace_backspace(out)
391
+
392
+ for hex, name in ASCII_MAP.items():
393
+ out = out.replace(hex, name)
394
+
395
+ return out
396
+
397
+
398
+ def _replace_backspace(input: str) -> str:
399
+ """Remove ANSI backspace characters (``\x08``) and 'replay' their effect on the rest of the string.
400
+
401
+ For example, with the input ``123\x084``, the output would be ``124``.
402
+ """
403
+ out = ""
404
+ for char in input:
405
+ if char == "\x08":
406
+ out = out[:-1]
407
+ else:
408
+ out += char
409
+ return out
@@ -87,8 +87,8 @@ class Target:
87
87
 
88
88
  try:
89
89
  self._config = config.load(self.path)
90
- except Exception:
91
- self.log.exception("Error loading config file")
90
+ except Exception as e:
91
+ self.log.debug("Error loading config file", exc_info=e)
92
92
  self._config = config.load(None) # This loads an empty config.
93
93
 
94
94
  # Fill the disks and/or volumes and/or filesystems and apply() will
@@ -372,7 +372,7 @@ class Target:
372
372
  recursive: Whether to check the child ``Target`` for more ``Targets``.
373
373
 
374
374
  Returns:
375
- An interator of ``Targets``.
375
+ An iterator of ``Targets``.
376
376
  """
377
377
  for child in self.list_children():
378
378
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.16.dev21
3
+ Version: 3.16.dev23
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
@@ -68,6 +68,7 @@ dissect/target/helpers/mount.py
68
68
  dissect/target/helpers/mui.py
69
69
  dissect/target/helpers/network_managers.py
70
70
  dissect/target/helpers/polypath.py
71
+ dissect/target/helpers/protobuf.py
71
72
  dissect/target/helpers/record.py
72
73
  dissect/target/helpers/record_modifier.py
73
74
  dissect/target/helpers/regutil.py
@@ -124,6 +125,7 @@ dissect/target/plugins/apps/av/sophos.py
124
125
  dissect/target/plugins/apps/av/symantec.py
125
126
  dissect/target/plugins/apps/av/trendmicro.py
126
127
  dissect/target/plugins/apps/browser/__init__.py
128
+ dissect/target/plugins/apps/browser/brave.py
127
129
  dissect/target/plugins/apps/browser/browser.py
128
130
  dissect/target/plugins/apps/browser/chrome.py
129
131
  dissect/target/plugins/apps/browser/chromium.py
@@ -371,6 +373,7 @@ tests/helpers/test_keychain.py
371
373
  tests/helpers/test_loaderutil.py
372
374
  tests/helpers/test_localeutil.py
373
375
  tests/helpers/test_modifier.py
376
+ tests/helpers/test_protobuf.py
374
377
  tests/helpers/test_record.py
375
378
  tests/helpers/test_regutil.py
376
379
  tests/helpers/test_utils.py
@@ -404,6 +407,7 @@ tests/plugins/apps/av/test_sophos.py
404
407
  tests/plugins/apps/av/test_symantec.py
405
408
  tests/plugins/apps/av/test_trendmicro.py
406
409
  tests/plugins/apps/browser/__init__.py
410
+ tests/plugins/apps/browser/test_brave.py
407
411
  tests/plugins/apps/browser/test_chrome.py
408
412
  tests/plugins/apps/browser/test_chromium.py
409
413
  tests/plugins/apps/browser/test_edge.py