mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-29 20:03:33 +08:00
[+] ntobj: get directory object content
[+] ntobj: get object address by full name [+] drivers.py - demonstration of the new ntobj.py: print list of all driver objects git-svn-id: https://pykd.svn.codeplex.com/svn@66437 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
2f4f925b4b
commit
cbbc29523e
26
samples/drivers.py
Normal file
26
samples/drivers.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
"""
|
||||||
|
Print list of all drivers
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pykd import *
|
||||||
|
import ntobj
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
def printDriverFromDir(dirName):
|
||||||
|
lstDrvs = ntobj.getListByDirectoryObject(
|
||||||
|
ntobj.getObjectByName(dirName), ptrPtr( getOffset("nt", "IoDriverObjectType") )
|
||||||
|
)
|
||||||
|
for drv in lstDrvs:
|
||||||
|
cmdDriver = "\t<link cmd=\"!drvobj 0x%x 7\">0x%x</link>" % (drv, drv)
|
||||||
|
dprintln(dirName + "\\" + ntobj.getObjectName(drv) + cmdDriver, True )
|
||||||
|
|
||||||
|
|
||||||
|
if not isKernelDebugging:
|
||||||
|
dprintln( "Script for kernel mode only" )
|
||||||
|
else:
|
||||||
|
printDriverFromDir("\\Driver")
|
||||||
|
printDriverFromDir("\\FileSystem")
|
||||||
|
|
||||||
|
|
@ -13,8 +13,15 @@ Work with NT Object tree manager
|
|||||||
buildObjectName(p)
|
buildObjectName(p)
|
||||||
Return string of full object name. If can not get name - empty string
|
Return string of full object name. If can not get name - empty string
|
||||||
|
|
||||||
def getListByHandleTable(tableHandles=None, objTypeAddr=0, containHeaders=True)
|
getListByHandleTable(tableHandles=None, objTypeAddr=0, containHeaders=True)
|
||||||
Return list of objects from table of handles
|
Return list of objects from table of handles
|
||||||
|
|
||||||
|
getListByDirectoryObject(p, objTypeAddr=0)
|
||||||
|
Return list of objects from object directory
|
||||||
|
|
||||||
|
getObjectByName(name, caseSensitive=False)
|
||||||
|
Return address of object by full name. If error (f.e. not exist) - None
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from pykd import *
|
from pykd import *
|
||||||
@ -223,6 +230,90 @@ def getListByHandleTable(tableHandles=None, objTypeAddr=0, containHeaders=True):
|
|||||||
dprintln("ERROR: Unknown handle table level: %u" % nTableLevel)
|
dprintln("ERROR: Unknown handle table level: %u" % nTableLevel)
|
||||||
return list()
|
return list()
|
||||||
|
|
||||||
|
NUMBER_HASH_BUCKETS = 37
|
||||||
|
|
||||||
|
def getListByDirectoryObject(p, objTypeAddr=0):
|
||||||
|
"""
|
||||||
|
Build list of objects from object directory
|
||||||
|
|
||||||
|
Parameter objTypeAddr if not 0 used for getting object of specific type,
|
||||||
|
otherwise get object of all types
|
||||||
|
"""
|
||||||
|
|
||||||
|
if getType(p) != ptrPtr( getOffset("nt", "ObpDirectoryObjectType") ):
|
||||||
|
return None
|
||||||
|
|
||||||
|
result = list()
|
||||||
|
|
||||||
|
for i in range(0, NUMBER_HASH_BUCKETS):
|
||||||
|
bucket = ptrPtr( p + (i * ptrSize()) )
|
||||||
|
while bucket:
|
||||||
|
bucketVar = typedVar("nt", "_OBJECT_DIRECTORY_ENTRY", bucket)
|
||||||
|
if objTypeAddr and (getType(bucketVar.Object) == objTypeAddr):
|
||||||
|
result.append(bucketVar.Object)
|
||||||
|
elif (not objTypeAddr):
|
||||||
|
result.append(bucketVar.Object)
|
||||||
|
bucket = bucketVar.ChainLink
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def getObjectByName(name, caseSensitive=False):
|
||||||
|
"""
|
||||||
|
Query address of object by full name
|
||||||
|
"""
|
||||||
|
|
||||||
|
def cmpCase(s1, s2): return s1 == s2
|
||||||
|
def cmpNoCase(s1, s2): return s1.lower() == s2.lower()
|
||||||
|
|
||||||
|
if not len(name):
|
||||||
|
return None
|
||||||
|
|
||||||
|
if name[0] != '\\':
|
||||||
|
return None
|
||||||
|
|
||||||
|
object = ptrPtr( getOffset("nt", "ObpRootDirectoryObject") )
|
||||||
|
|
||||||
|
cmpFunc = cmpNoCase
|
||||||
|
if caseSensitive:
|
||||||
|
cmpFunc = cmpCase
|
||||||
|
|
||||||
|
while True:
|
||||||
|
name = name[1:]
|
||||||
|
if not len(name):
|
||||||
|
break
|
||||||
|
|
||||||
|
tok = name.find("\\")
|
||||||
|
if -1 != tok:
|
||||||
|
namePart = name[:tok]
|
||||||
|
name = name[tok:]
|
||||||
|
else:
|
||||||
|
namePart = name
|
||||||
|
|
||||||
|
if 0 == len(namePart):
|
||||||
|
return None
|
||||||
|
|
||||||
|
# FIXME: use name/index hash
|
||||||
|
lstObjects = getListByDirectoryObject(object)
|
||||||
|
if None == lstObjects:
|
||||||
|
return None
|
||||||
|
|
||||||
|
found = False
|
||||||
|
for p in lstObjects:
|
||||||
|
objName = getObjectName(p)
|
||||||
|
if len(objName) and cmpFunc( namePart, objName ):
|
||||||
|
object = p
|
||||||
|
found = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if not found:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if -1 == tok:
|
||||||
|
break
|
||||||
|
|
||||||
|
return object
|
||||||
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Display object kd-command
|
# Display object kd-command
|
||||||
|
Loading…
Reference in New Issue
Block a user