3939except ImportError :
4040 has_distorm = False
4141
42+ try :
43+ import yara
44+ import volatility .plugins .malware .malfind as malfind
45+ has_yara = True
46+ except ImportError :
47+ has_yara = False
48+
4249class _HMAP_ENTRY (obj .CType ):
4350
4451 @property
@@ -212,10 +219,37 @@ def findcookie(self, kernel_space):
212219 debug .warning ("Cannot find NT module" )
213220 return False
214221
222+ model = meta .get ("memory_model" )
223+
215224 addr = nt_mod .getprocaddress ("ObGetObjectType" )
216225 if addr == None :
217- debug .warning ("Cannot find nt!ObGetObjectType" )
218- return False
226+ if not has_yara :
227+ debug .warning ("Cannot find nt!ObGetObjectType" )
228+ return False
229+ # Did not find nt!ObGetObjectType, trying with YARA instead.
230+ if model == "32bit" :
231+ # 8bff mov edi, edi
232+ # 55 push ebp
233+ # 8bec mov ebp, esp
234+ # 8b4d08 mov ecx, dword ptr [ebp + 8]
235+ # 8d41e8 lea eax, dword ptr [ecx - 0x18]
236+ nt_ObGetObjectType_signature = "8bff 55 8bec 8b4d08 8d41e8"
237+ else :
238+ # 488d41d0 lea rax, qword ptr [rcx - 0x30]
239+ # 0fb649e8 movzx ecx, byte ptr [rcx - 0x18]
240+ nt_ObGetObjectType_signature = "488d41d0 0fb649e8"
241+ rule = 'rule r1 {strings: $a = {%s} condition: $a}' \
242+ % nt_ObGetObjectType_signature
243+ rules = yara .compile (source = rule )
244+ scanner = malfind .DiscontigYaraScanner (
245+ address_space = kernel_space ,
246+ rules = rules )
247+ first_match = next (scanner .scan (), None )
248+ if not first_match :
249+ debug .warning ("Cannot find nt!ObGetObjectType" )
250+ return False
251+ _ , addr = first_match
252+ addr -= nt_mod .DllBase
219253
220254 # produce an absolute address by adding the DLL base to the RVA
221255 addr += nt_mod .DllBase
@@ -224,7 +258,6 @@ def findcookie(self, kernel_space):
224258 return False
225259
226260 # in theory...but so far we haven't tested 32-bits
227- model = meta .get ("memory_model" )
228261 if model == "32bit" :
229262 mode = distorm3 .Decode32Bits
230263 else :
@@ -327,6 +360,9 @@ def TypeIndex(self):
327360 addr = self .obj_offset
328361 indx = int (self .m ("TypeIndex" ))
329362
363+ if cook is None :
364+ debug .error ("Cannot obtain nt!ObHeaderCookie value" )
365+
330366 return ((addr >> 8 ) ^ cook ^ indx ) & 0xFF
331367
332368 def is_valid (self ):
@@ -1120,4 +1156,4 @@ class Win10x64_18362(obj.Profile):
11201156 _md_minor = 4
11211157 _md_build = 18362
11221158 _md_vtype_module = 'volatility.plugins.overlays.windows.win10_x64_18362_vtypes'
1123- _md_product = ["NtProductWinNt" ]
1159+ _md_product = ["NtProductWinNt" ]
0 commit comments