mirror of
https://github.com/volatilityfoundation/volatility3.git
synced 2026-09-11 20:27:38 +02:00
Refactor of module object. Adding function helpers to simplify the control of exceptions and errors and consolidate everything on them.
This commit is contained in:
@@ -13,7 +13,6 @@ from typing import Generator, Iterable, Iterator, Optional, Tuple, List, Union,
|
||||
|
||||
from volatility3.framework import constants, exceptions, objects, interfaces, symbols
|
||||
from volatility3.framework.renderers import conversion
|
||||
from volatility3.framework.configuration import requirements
|
||||
from volatility3.framework.constants.linux import SOCK_TYPES, SOCK_FAMILY
|
||||
from volatility3.framework.constants.linux import IP_PROTOCOLS, IPV6_PROTOCOLS
|
||||
from volatility3.framework.constants.linux import TCP_STATES, NETLINK_PROTOCOLS
|
||||
@@ -56,88 +55,80 @@ class module(generic.GenericIntelProcess):
|
||||
self._mod_mem_type = {}
|
||||
return self._mod_mem_type
|
||||
|
||||
def _get_mem_type(self, mod_mem_type_name):
|
||||
module_mem_index = self.mod_mem_type.get(mod_mem_type_name)
|
||||
if module_mem_index is None:
|
||||
raise AttributeError(f"Unknown module memory type '{mod_mem_type_name}'")
|
||||
|
||||
if not (0 <= module_mem_index < self.mem.count):
|
||||
raise AttributeError(
|
||||
f"Invalid module memory type index '{module_mem_index}'"
|
||||
)
|
||||
|
||||
return self.mem[module_mem_index]
|
||||
|
||||
def _get_mem_size(self, mod_mem_type_name):
|
||||
return self._get_mem_type(mod_mem_type_name).size
|
||||
|
||||
def _get_mem_base(self, mod_mem_type_name):
|
||||
return self._get_mem_type(mod_mem_type_name).base
|
||||
|
||||
def get_module_base(self):
|
||||
if self.has_member("mem"): # kernels 6.4+
|
||||
try:
|
||||
return self.mem[self.mod_mem_type["MOD_TEXT"]].base
|
||||
except KeyError:
|
||||
raise AttributeError(
|
||||
"module -> get_module_base: Unable to get module base. Cannot read base from MOD_TEXT."
|
||||
)
|
||||
return self._get_mem_base("MOD_TEXT")
|
||||
elif self.has_member("core_layout"):
|
||||
return self.core_layout.base
|
||||
elif self.has_member("module_core"):
|
||||
return self.module_core
|
||||
raise AttributeError("module -> get_module_base: Unable to get module base")
|
||||
|
||||
raise AttributeError("Unable to get module base")
|
||||
|
||||
def get_init_size(self):
|
||||
if self.has_member("mem"): # kernels 6.4+
|
||||
try:
|
||||
return (
|
||||
self.mem[self.mod_mem_type["MOD_INIT_TEXT"]].size
|
||||
+ self.mem[self.mod_mem_type["MOD_INIT_DATA"]].size
|
||||
+ self.mem[self.mod_mem_type["MOD_INIT_RODATA"]].size
|
||||
)
|
||||
except KeyError:
|
||||
raise AttributeError(
|
||||
"module -> get_init_size: Unable to determine .init section size of module. Cannot read size of MOD_INIT_TEXT, MOD_INIT_DATA, and MOD_INIT_RODATA"
|
||||
)
|
||||
return (
|
||||
self._get_mem_size("MOD_INIT_TEXT")
|
||||
+ self._get_mem_size("MOD_INIT_DATA")
|
||||
+ self._get_mem_size("MOD_INIT_RODATA")
|
||||
)
|
||||
elif self.has_member("init_layout"):
|
||||
return self.init_layout.size
|
||||
elif self.has_member("init_size"):
|
||||
return self.init_size
|
||||
raise AttributeError(
|
||||
"module -> get_init_size: Unable to determine .init section size of module"
|
||||
)
|
||||
|
||||
raise AttributeError("Unable to determine .init section size of module")
|
||||
|
||||
def get_core_size(self):
|
||||
if self.has_member("mem"): # kernels 6.4+
|
||||
try:
|
||||
return (
|
||||
self.mem[self.mod_mem_type["MOD_TEXT"]].size
|
||||
+ self.mem[self.mod_mem_type["MOD_DATA"]].size
|
||||
+ self.mem[self.mod_mem_type["MOD_RODATA"]].size
|
||||
+ self.mem[self.mod_mem_type["MOD_RO_AFTER_INIT"]].size
|
||||
)
|
||||
except KeyError:
|
||||
raise AttributeError(
|
||||
"module -> get_core_size: Unable to determine core size of module. Cannot read size of MOD_TEXT, MOD_DATA, MOD_RODATA, and MOD_RO_AFTER_INIT."
|
||||
)
|
||||
return (
|
||||
self._get_mem_size("MOD_TEXT")
|
||||
+ self._get_mem_size("MOD_DATA")
|
||||
+ self._get_mem_size("MOD_RODATA")
|
||||
+ self._get_mem_size("MOD_RO_AFTER_INIT")
|
||||
)
|
||||
elif self.has_member("core_layout"):
|
||||
return self.core_layout.size
|
||||
elif self.has_member("core_size"):
|
||||
return self.core_size
|
||||
raise AttributeError(
|
||||
"module -> get_core_size: Unable to determine core size of module"
|
||||
)
|
||||
|
||||
raise AttributeError("Unable to determine core size of module")
|
||||
|
||||
def get_module_core(self):
|
||||
if self.has_member("mem"): # kernels 6.4+
|
||||
try:
|
||||
return self.mem[self.mod_mem_type["MOD_TEXT"]].base
|
||||
except KeyError:
|
||||
raise AttributeError(
|
||||
"module -> get_module_core: Unable to get module core. Cannot read base from MOD_TEXT."
|
||||
)
|
||||
return self._get_mem_base("MOD_TEXT")
|
||||
elif self.has_member("core_layout"):
|
||||
return self.core_layout.base
|
||||
elif self.has_member("module_core"):
|
||||
return self.module_core
|
||||
raise AttributeError("module -> get_module_core: Unable to get module core")
|
||||
raise AttributeError("Unable to get module core")
|
||||
|
||||
def get_module_init(self):
|
||||
if self.has_member("mem"): # kernels 6.4+
|
||||
try:
|
||||
return self.mem[self.mod_mem_type["MOD_INIT_TEXT"]].base
|
||||
except KeyError:
|
||||
raise AttributeError(
|
||||
"module -> get_module_core: Unable to get module init. Cannot read base from MOD_INIT_TEXT."
|
||||
)
|
||||
return self._get_mem_base("MOD_INIT_TEXT")
|
||||
elif self.has_member("init_layout"):
|
||||
return self.init_layout.base
|
||||
elif self.has_member("module_init"):
|
||||
return self.module_init
|
||||
raise AttributeError("module -> get_module_init: Unable to get module init")
|
||||
raise AttributeError("Unable to get module init")
|
||||
|
||||
def get_name(self):
|
||||
"""Get the name of the module as a string"""
|
||||
|
||||
Reference in New Issue
Block a user