2020# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2121#
2222
23- import bisect
2423import re
2524
26- from rekall import obj
2725from rekall import plugin
2826from rekall import scan
27+ from rekall import utils
2928from rekall .plugins .windows import common
3029
3130
@@ -34,25 +33,29 @@ class Modules(common.WindowsCommandPlugin):
3433
3534 __name = "modules"
3635
37- @classmethod
38- def args (cls , parser ):
39- """Declare the command line args we need."""
40- super (Modules , cls ).args (parser )
41- parser .add_argument ("--name_regex" ,
42- help = "Filter module names by this regex." )
36+ __args = [
37+ dict (name = "name_regex" , type = "RegEx" ,
38+ help = "Filter module names by this regex." )
39+ ]
4340
44- def __init__ (self , name_regex = None , ** kwargs ):
45- """List kernel modules by walking the PsLoadedModuleList."""
46- super (Modules , self ).__init__ (** kwargs )
47- self .name_regex = re .compile (name_regex or "." , re .I )
41+ table_header = [
42+ dict (name = "_LDR_DATA_TABLE_ENTRY" , cname = "offset_v" , style = "address" ),
43+ dict (name = "Name" , cname = "file_name" , width = 20 ),
44+ dict (name = 'Base' , cname = "module_base" , style = "address" ),
45+ dict (name = 'Size' , cname = "module_size" , style = "address" ),
46+ dict (name = 'File' , cname = "path" )
47+ ]
4848
4949 def lsmod (self ):
5050 """ A Generator for modules (uses _KPCR symbols) """
51- for module in self .session .GetParameter ("PsLoadedModuleList" ).list_of_type (
52- "_LDR_DATA_TABLE_ENTRY" , "InLoadOrderLinks" ):
51+ for module in self .session .GetParameter (
52+ "PsLoadedModuleList" ).list_of_type (
53+ "_LDR_DATA_TABLE_ENTRY" , "InLoadOrderLinks" ):
5354
5455 # Skip modules which do not match.
55- if not self .name_regex .search (str (module .FullDllName )):
56+ if (self .plugin_args .name_regex and
57+ not self .plugin_args .name_regex .search (
58+ utils .SmartUnicode (module .FullDllName ))):
5659 continue
5760
5861 yield module
@@ -61,24 +64,15 @@ def addresses(self):
6164 """Returns a list of module addresses."""
6265 return sorted (self .mod_lookup .keys ())
6366
64- def render (self , renderer ):
67+ def collect (self ):
6568 object_tree_plugin = self .session .plugins .object_tree ()
6669
67- renderer .table_header (
68- [("_LDR_DATA_TABLE_ENTRY" , "offset_v" , "[addrpad]" ),
69- ("Name" , "file_name" , "20" ),
70- ('Base' , "module_base" , "[addrpad]" ),
71- ('Size' , "module_size" , "[addr]" ),
72- ('File' , "path" , "" )
73- ])
74-
7570 for module in self .lsmod ():
76- renderer .table_row (
77- module .obj_offset ,
78- module .BaseDllName ,
79- module .DllBase ,
80- module .SizeOfImage ,
81- object_tree_plugin .FileNameWithDrive (module .FullDllName .v ()))
71+ yield (module ,
72+ module .BaseDllName ,
73+ module .DllBase ,
74+ module .SizeOfImage ,
75+ object_tree_plugin .FileNameWithDrive (module .FullDllName .v ()))
8276
8377
8478class RSDSScanner (scan .BaseScanner ):
@@ -94,6 +88,13 @@ class ModVersions(Modules):
9488
9589 __name = "version_modules"
9690
91+ table_header = [
92+ dict (name = "Offset (V)" , cname = "offset_v" , style = "address" ),
93+ dict (name = "Name" , cname = "file_name" , width = 20 ),
94+ dict (name = 'GUID/Version' , cname = "guid" , width = 33 ),
95+ dict (name = "PDB" , cname = "pdb" )
96+ ]
97+
9798 def ScanVersions (self ):
9899 pe_profile = self .session .LoadProfile ("pe" )
99100 scanner = RSDSScanner (address_space = self .kernel_address_space ,
@@ -108,19 +109,12 @@ def ScanVersions(self):
108109 guid = "%s%x" % (rsds .GUID .AsString , rsds .Age )
109110 yield module , rsds , guid
110111
111- def render (self , renderer ):
112- renderer .table_header (
113- [("Offset (V)" , "offset_v" , "[addrpad]" ),
114- ("Name" , "file_name" , "20" ),
115- ('GUID/Version' , "guid" , "33" ),
116- ("PDB" , "pdb" , "" )])
117-
112+ def collect (self ):
118113 for module , rsds , guid in self .ScanVersions ():
119- renderer .table_row (
120- rsds ,
121- module .BaseDllName ,
122- guid ,
123- rsds .Filename )
114+ yield (rsds ,
115+ module .BaseDllName ,
116+ guid ,
117+ rsds .Filename )
124118
125119
126120class VersionScan (plugin .PhysicalASMixin , plugin .Command ):
@@ -191,7 +185,14 @@ class UnloadedModules(common.WindowsCommandPlugin):
191185
192186 name = "unloaded_modules"
193187
194- def render (self , renderer ):
188+ table_header = [
189+ dict (name = "Name" , cname = "name" , width = 20 ),
190+ dict (name = "Start" , cname = "start" , style = "address" ),
191+ dict (name = "End" , cname = "end" , style = "address" ),
192+ dict (name = "Time" , cname = "time" )
193+ ]
194+
195+ def collect (self ):
195196 unloaded_table = self .profile .get_constant_object (
196197 "MmUnloadedDrivers" ,
197198 target = "Pointer" ,
@@ -210,21 +211,18 @@ def render(self, renderer):
210211 mistate = self .profile .get_constant_object (
211212 "MiState" , target = "_MI_SYSTEM_INFORMATION" )
212213
213- unloaded_table = mistate .UnloadedDrivers .dereference_as (
214+ unloaded_table = mistate .multi_m (
215+ "UnloadedDrivers" ,
216+ "Vs.UnloadedDrivers"
217+ ).dereference_as (
214218 "Array" ,
215219 target_args = dict (
216220 target = "_UNLOADED_DRIVERS" ,
217221 count = mistate .LastUnloadedDriver )
218222 )
219223
220-
221- renderer .table_header ([("Name" , "name" , "20" ),
222- ("Start" , "start" , "[addrpad]" ),
223- ("End" , "end" , "[addrpad]" ),
224- ("Time" , "time" , "" )])
225-
226224 for driver in unloaded_table :
227- renderer . table_row (driver .Name ,
228- driver .StartAddress .v (),
229- driver .EndAddress .v (),
230- driver .CurrentTime )
225+ yield (driver .Name ,
226+ driver .StartAddress .v (),
227+ driver .EndAddress .v (),
228+ driver .CurrentTime )
0 commit comments