後でpykdにロードするDLLにbpを設定するには?


1

私はpykdを使用して、何らかの条件が満たされたときにのみdllをロードするアプリケーションをデバッグしています。私のハンドラがコールバックを取得するようにpykdにまだロードされていないdllにブレークポイントを設定するには?現在、私のコードは、私が手動でpykd.dbgCommandを使用してブレークポイントを設定しようとしたこの

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() 

ようになっていますが、コールバックが、その場合にはトリガされません。 bpを設定しているときにonLoadModuleの戻り値をpykd.eventResult.NoChange以外に変更しようとしました。私は何が欠けていますか?

  0

私が言ったように、 'pykd.dbgCommand'がコールバックをトリガしませんと、BPを設定する' bu' 28 12月. 172017-12-28 08:43:09

  0

@LievenKeersmaekersにbp'変更し '。私は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