Skip to content
This repository was archived by the owner on May 16, 2025. It is now read-only.

Commit 17a2dfa

Browse files
committed
Mac - add more sources of vnodes for cached file enumeration
1 parent c87f60b commit 17a2dfa

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

volatility/plugins/mac/list_files.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,45 @@ def __init__(self, config, *args, **kwargs):
4141
help = 'Show orphans (vnodes without a parent)',
4242
action = 'store_true')
4343

44+
@staticmethod
45+
def walk_vnodelist(listhead, loop_vnodes):
46+
seen = set()
47+
48+
vnode = listhead.tqh_first.dereference()
49+
while vnode:
50+
if vnode in seen:
51+
break
52+
53+
loop_vnodes.add(vnode)
54+
vnode = vnode.v_mntvnodes.tqe_next.dereference()
55+
56+
return loop_vnodes
57+
4458
@staticmethod
4559
def list_files(config):
4660

4761
plugin = mac_mount.mac_mount(config)
4862
mounts = plugin.calculate()
4963
vnodes = {}
5064
parent_vnodes = {}
65+
loop_vnodes = set()
5166

67+
seen = set()
5268
## build an initial table of all vnodes
5369
for mount in mounts:
54-
vnode = mount.mnt_vnodelist.tqh_first.dereference()
70+
loop_vnodes = mac_list_files.walk_vnodelist(mount.mnt_vnodelist, loop_vnodes)
71+
72+
loop_vnodes = mac_list_files.walk_vnodelist(mount.mnt_workerqueue, loop_vnodes)
73+
74+
loop_vnodes = mac_list_files.walk_vnodelist(mount.mnt_newvnodes, loop_vnodes)
75+
76+
loop_vnodes.add(mount.mnt_vnodecovered)
5577

78+
loop_vnodes.add(mount.mnt_realrootvp)
79+
80+
loop_vnodes.add(mount.mnt_devvp)
81+
82+
for vnode in loop_vnodes:
5683
while vnode:
5784
## abort here to prevent going in a loop
5885
if vnode.obj_offset in vnodes:
@@ -66,6 +93,7 @@ def list_files(config):
6693

6794
entry = [name, None, vnode]
6895
vnodes[vnode.obj_offset] = entry
96+
6997

7098
else:
7199
name = vnode.v_name.dereference()
@@ -82,7 +110,7 @@ def list_files(config):
82110

83111
entry = [name, par_offset, vnode]
84112
vnodes[vnode.obj_offset] = entry
85-
113+
86114
vnode = vnode.v_mntvnodes.tqe_next.dereference()
87115

88116
## account for vnodes that aren't in the list but are
@@ -114,7 +142,7 @@ def list_files(config):
114142
vnodes[parent.obj_offset] = entry
115143

116144
parent = next_parent
117-
145+
118146
## build the full paths for all directories
119147
for key, val in vnodes.items():
120148
name, parent, vnode = val

0 commit comments

Comments
 (0)