如何在稍后加载pykd的dll中设置bp?


1

我正在使用pykd调试应用程序,只有当满足某些条件时才加载dll。如何在dll中设置一个断点,该断点尚未在pykd中加载,以便我的处理程序获取回调?目前我的代码看起来是这样的

class ExceptionHandler(pykd.eventHandler): 
    def __init__(self): 
     pykd.eventHandler.__init__(self) 

    def onException(self, exceptionInfo): 
     return pykd.eventResult.NoChange 

    def onBreakpoint(self, id): 
     return pykd.eventResult.NoChange 

    def onThreadStart(self): 
     return pykd.eventResult.NoChange 

    def onThreadStop(self): 
     return pykd.eventResult.NoChange 

    def onLoadModule(self, base, name): 
     print "onLoadModule " + name 
     # sys.stdout.flush() 
     # if name == "test_module": 
     #  # test_module = pykd.module("test_module") 
     #  # test_module.reload() 
     #  # pykd.setBp(test_module.offset('test_function'), breakCount) 
     #  # print pykd.dbgCommand("bl") 
     #  print pykd.dbgCommand('bp test_module!test_function "r;gc"') 
     #  # print pykd.dbgCommand("bl") 
     #  # print "Breakpoint Set %x" % (test_module.offset('test_function')) 
     #  print "Breakpoint Set" 
     return pykd.eventResult.NoChange 

    def onUnloadModule(self, base, name): 
     return pykd.eventResult.NoChange 

pykd.initialize() 
pykd.handler = ExceptionHandler() 
pykd.startProcess("testmydelayedload.exe %s\\%s" % (os.getcwd(), sys.argv[1].strip())) 
alloc_module = pykd.module("ntdll") 
alloc_module.reload() 
b0 = pykd.setBp(alloc_module.offset('RtlAllocateHeap')+0xe6, breakCount) 
b1 = pykd.setBp(alloc_module.offset('RtlFreeHeap'), breakCount) 
pykd.loadExt("C:\\Program Files\\Windows Kits\\10\\Debuggers\\x86\\winext\\ext.dll") 
pykd.go() 
pykd.killAllProcesses() 

我曾尝试手动设置使用pykd.dbgCommand断点但回调不会在这种情况下触发。我试图在设置bp时将onLoadModule的返回值更改为pykd.eventResult.NoChange以外的值。我错过了什么?

  0

变化'bp'到'bu' 28 12月. 172017-12-28 08:43:09

  0

@LievenKeersmaekers设置与'pykd.dbgCommand'一个基点,我说不会触发回调。我想要使​​用pykd的api。 28 12月. 172017-12-28 09:38:21

+1

我刚刚发现,存储bp的变量应该是全局的,否则它将无法工作。 28 12月. 172017-12-28 09:55:17

  0

您可以回答自己的问题并接受它。 28 12月. 172017-12-28 10:13:38

1

我刚刚发现,存储bp的变量应该是全局的,否则它将无法工作。它应该在课堂的背景下活着。

def onLoadModule(self, base, name): 
     global test_function, test_module 
     print "onLoadModule " + name 
     if name == "jscript": 
      test_module = pykd.module("jscript") 
      test_module.reload() 
      test_function = pykd.setBp(test_module.offset('test_function'), breakCount) 
      print "Breakpoint Set %x" % (test_module.offset('test_function')) 
     return pykd.eventResult.NoChange