Skip to content

Commit 308a466

Browse files
authored
Merge pull request #1829 from SolitudePy/regexscan
Regexscan fixes
2 parents f5feee8 + c270cf4 commit 308a466

File tree

1 file changed

+24
-10
lines changed

1 file changed

+24
-10
lines changed

volatility3/framework/plugins/regexscan.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,38 +46,52 @@ def get_requirements(cls) -> List[interfaces.configuration.RequirementInterface]
4646
),
4747
]
4848

49-
def _generator(self, regex_pattern):
50-
regex_pattern = bytes(regex_pattern, "UTF-8")
51-
vollog.debug(f"RegEx Pattern: {regex_pattern}")
49+
def _generator(self, context, layer_name, pattern, maxsize):
50+
layer = self.context.layers[layer_name]
51+
vollog.debug(f"RegEx Pattern: {pattern}")
52+
53+
# Convert string pattern to bytes for RegExScanner
54+
pattern_bytes = pattern.encode("utf-8")
55+
56+
# Compile the pattern here to ensure consistency
57+
try:
58+
compiled_pattern = re.compile(pattern_bytes)
59+
except re.error as e:
60+
vollog.error(f"Invalid regex pattern: {e}")
61+
raise ValueError(f"Invalid regex pattern: {e}")
5262

53-
layer = self.context.layers[self.config["primary"]]
5463
for offset in layer.scan(
55-
context=self.context, scanner=scanners.RegExScanner(regex_pattern)
64+
context=context, scanner=scanners.RegExScanner(pattern_bytes)
5665
):
57-
result_data = layer.read(offset, self.MAXSIZE_DEFAULT, pad=True)
66+
result_data = layer.read(offset, maxsize, pad=True)
5867

5968
# reapply the regex in order to extract just the match
60-
regex_result = re.match(regex_pattern, result_data)
69+
regex_result = compiled_pattern.search(result_data)
6170

6271
if regex_result:
63-
# the match is within the results_data (e.g. it fits within MAXSIZE_DEFAULT)
72+
# the match is within the results_data (e.g. it fits within maxsize)
6473
# extract just the match itself
6574
regex_match = regex_result.group(0)
6675
text_result = str(regex_match, encoding="UTF-8", errors="replace")
6776
bytes_result = regex_match
6877
else:
69-
# the match is not with the results_data (e.g. it doesn't fit within MAXSIZE_DEFAULT)
78+
# the match is not with the results_data (e.g. it doesn't fit within maxsize)
7079
text_result = str(result_data, encoding="UTF-8", errors="replace")
7180
bytes_result = result_data
7281

7382
yield 0, (format_hints.Hex(offset), text_result, bytes_result)
7483

7584
def run(self):
85+
pattern = self.config.get("pattern")
86+
maxsize = self.config.get("maxsize", self.MAXSIZE_DEFAULT)
87+
layer_name = self.config["primary"]
88+
context = self.context
89+
7690
return renderers.TreeGrid(
7791
[
7892
("Offset", format_hints.Hex),
7993
("Text", str),
8094
("Hex", bytes),
8195
],
82-
self._generator(self.config.get("pattern")),
96+
self._generator(context, layer_name, pattern, maxsize),
8397
)

0 commit comments

Comments
 (0)