Skip to content

Commit 0769df4

Browse files
authored
Merge pull request #1039 from Abyss-W4tcher/linux_extensions_patches
Linux extensions patches
2 parents 4ce42fc + 39144ff commit 0769df4

File tree

1 file changed

+61
-20
lines changed
  • volatility3/framework/symbols/linux/extensions

1 file changed

+61
-20
lines changed

volatility3/framework/symbols/linux/extensions/__init__.py

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ def get_name(self):
7171
def _get_sect_count(self, grp):
7272
"""Try to determine the number of valid sections"""
7373
arr = self._context.object(
74-
self.get_symbol_table().name + constants.BANG + "array",
74+
self.get_symbol_table_name() + constants.BANG + "array",
7575
layer_name=self.vol.layer_name,
7676
offset=grp.attrs,
7777
subtype=self._context.symbol_space.get_type(
78-
self.get_symbol_table().name + constants.BANG + "pointer"
78+
self.get_symbol_table_name() + constants.BANG + "pointer"
7979
),
8080
count=25,
8181
)
@@ -92,53 +92,94 @@ def get_sections(self):
9292
else:
9393
num_sects = self._get_sect_count(self.sect_attrs.grp)
9494
arr = self._context.object(
95-
self.get_symbol_table().name + constants.BANG + "array",
95+
self.get_symbol_table_name() + constants.BANG + "array",
9696
layer_name=self.vol.layer_name,
9797
offset=self.sect_attrs.attrs.vol.offset,
9898
subtype=self._context.symbol_space.get_type(
99-
self.get_symbol_table().name + constants.BANG + "module_sect_attr"
99+
self.get_symbol_table_name() + constants.BANG + "module_sect_attr"
100100
),
101101
count=num_sects,
102102
)
103103

104104
for attr in arr:
105105
yield attr
106106

107-
def get_symbols(self):
108-
if symbols.symbol_table_is_64bit(self._context, self.get_symbol_table().name):
109-
prefix = "Elf64_"
110-
else:
111-
prefix = "Elf32_"
107+
def get_elf_table_name(self):
112108
elf_table_name = intermed.IntermediateSymbolTable.create(
113-
self.context,
114-
self.config_path,
109+
self._context,
110+
"config_name_elf_symbol_table",
115111
"linux",
116112
"elf",
117113
native_types=None,
118114
class_types=elf.class_types,
119115
)
116+
return elf_table_name
117+
118+
def get_symbols(self):
119+
"""Get symbols of the module
120+
121+
Yields:
122+
A symbol object
123+
"""
120124

125+
if not hasattr(self, "_elf_table_name"):
126+
self._elf_table_name = self.get_elf_table_name()
127+
if symbols.symbol_table_is_64bit(self._context, self.get_symbol_table_name()):
128+
prefix = "Elf64_"
129+
else:
130+
prefix = "Elf32_"
121131
syms = self._context.object(
122-
self.get_symbol_table().name + constants.BANG + "array",
132+
self.get_symbol_table_name() + constants.BANG + "array",
123133
layer_name=self.vol.layer_name,
124134
offset=self.section_symtab,
125135
subtype=self._context.symbol_space.get_type(
126-
elf_table_name + constants.BANG + prefix + "Sym"
136+
self._elf_table_name + constants.BANG + prefix + "Sym"
127137
),
128138
count=self.num_symtab + 1,
129139
)
130140
if self.section_strtab:
131141
for sym in syms:
132-
sym.set_cached_strtab(self.section_strtab)
133142
yield sym
134143

135-
def get_symbol(self, wanted_sym_name):
136-
"""Get value for a given symbol name"""
144+
def get_symbols_names_and_addresses(self) -> Tuple[str, int]:
145+
"""Get names and addresses for each symbol of the module
146+
147+
Yields:
148+
A tuple for each symbol containing the symbol name and its corresponding value
149+
"""
150+
137151
for sym in self.get_symbols():
138-
sym_name = sym.get_name()
139-
sym_addr = sym.st_value
152+
sym_arr = self._context.object(
153+
self.get_symbol_table_name() + constants.BANG + "array",
154+
layer_name=self.vol.native_layer_name,
155+
offset=self.section_strtab + sym.st_name,
156+
)
157+
try:
158+
sym_name = utility.array_to_string(
159+
sym_arr, 512
160+
) # 512 is the value of KSYM_NAME_LEN kernel constant
161+
except exceptions.InvalidAddressException:
162+
continue
163+
if sym_name != "":
164+
# Normalize sym.st_value offset, which is an address pointing to the symbol value
165+
mask = self._context.layers[self.vol.layer_name].address_mask
166+
sym_address = sym.st_value & mask
167+
yield (sym_name, sym_address)
168+
169+
def get_symbol(self, wanted_sym_name):
170+
"""Get symbol value for a given symbol name"""
171+
for sym_name, sym_address in self.get_symbols_names_and_addresses():
140172
if wanted_sym_name == sym_name:
141-
return sym_addr
173+
return sym_address
174+
175+
return None
176+
177+
def get_symbol_by_address(self, wanted_sym_address):
178+
"""Get symbol name for a given symbol address"""
179+
for sym_name, sym_address in self.get_symbols_names_and_addresses():
180+
if wanted_sym_address == sym_address:
181+
return sym_name
182+
142183
return None
143184

144185
@property
@@ -1132,7 +1173,7 @@ def get_devname(self) -> str:
11321173
class kobject(objects.StructType):
11331174
def reference_count(self):
11341175
refcnt = self.kref.refcount
1135-
if self.has_member("counter"):
1176+
if refcnt.has_member("counter"):
11361177
ret = refcnt.counter
11371178
else:
11381179
ret = refcnt.refs.counter

0 commit comments

Comments
 (0)