Why setBp not work?

Jun 21, 2012 at 4:37 PM
Edited Jun 22, 2012 at 1:37 AM

from pykd import *
nt = loadModule( "nt" )

def NtCreateFileHandle():
 dprintln( "callback: CreateProcessHandler" );

cfaddr = getOffset("NtCreateFile");
if cfaddr != 0:
 bpNtCreateFile  = setBp(cfaddr, NtCreateFileHandle);
 print "bpNtCreateFile :", bpNtCreateFile;
 go(); 

############# rem #############

kd> !py f:\dbgscript\t2.py
bpNtCreateFile : 0
Breakpoint 0 hit
#problem: when breakpoint hit, the callback handler NtCreateFileHandle not called.

 

Coordinator
Jun 22, 2012 at 8:03 AM
Edited Jun 22, 2012 at 8:05 AM

1. Handler must have a arg - breakpoint Id
def NtCreateFileHandle(Id):
 dprintln( "callback: CreateProcessHandler" );

2. Often there are several copies of the NtCreateFile: nt!NtCreateFile and ntdll!NtCreateFile. It is better to note explicity  a module name:
cfaddr = nt.NtCreateFile



Jun 22, 2012 at 11:59 AM

Fine, Thanks a lot, pykd is very useful.

Oct 6, 2012 at 7:47 PM

Hello. I am try to set a breakpoints with callbacks at specific addresses using this code:

while i < funcAddrs.__len__():                      #funcAddr is an array of function addresses
     setBp(funcAddrs[i], bpCallback)

...

def bpCallback(Id):
     ...
     dprintln("breakpoint!\n")
     return DEBUG_STATUS_GO_HANDLED

when breakpoint hit, the callback handler not called. Why?

Coordinator
Oct 8, 2012 at 8:38 AM

Which pykd version you are using?

Jan 7, 2013 at 3:48 PM

I am having the exact same problem with the newest version of pykd:

 

 

def handler(id):

   dprintln("In the handler")



setBp(address, handler)



The handler never gets called, the breakpoint just halts the debugger. 

Jan 7, 2013 at 3:53 PM

Actually the issue was with an exception in my code, for some reason the exception doesn't print out when in a callback. Maybe something to implement in the next release? 

Coordinator
Jan 9, 2013 at 5:30 AM

What is a version of pykd? The latest ( 0.2.0.11 ) must print stacktrace for callbacks.

Jan 9, 2013 at 9:30 AM

I'll download the newest version (I think I have newest release version) and respond back before posting any other bugs or questions.

Jan 11, 2013 at 7:28 AM

Та же проблема не ставится бряк с использованием setBp().

import sys
from pykd import *

def Callback(Id):
    dprintln( "callback: CreateProcessHandler" )

nt = module( "ntdll" )

faddr = nt.offset("NtCreateFile")

if faddr != 0:
    bp = setBp(faddr, Callback)
    print "callback id: ", bp, "address: ", hex( faddr )

Вызываю и смотрю бряки:

0:001> !py test2
callback id:  0 address:  0x77181860
0:001> bl

Пусто. Ок. Жмем g. И тишина... Что-то упускаю?

WinDbg 6.2.9200.16384 AMD64 (понятно, что система х64)

PYKD 0.2.0.13

Python 2.7.3 x64

Coordinator
Jan 11, 2013 at 9:32 AM
Edited Jan 11, 2013 at 9:33 AM

Все правильно :)
Команда !py test2:
1) запустила питон-машину
2), исполнила скрипт ( в том числе бряк поставила )
3) закончила работу питон-машинки, в том числе все созданные объекты удалила ( ну и колбек тож )

Как нужно:
1) Использовать !pycmd - консоль работает в "глобальном" интерпретаторе, его время жизни равно времени жизни плагина в windbg
Примерно так:
!pycmd
>>> import test2

Тут нужно чтобы файл test2.py находился в правильно месте - там где его питон сможет найти 

Или 2) Вставить в свой код go():

import sys
from pykd import *

def Callback(Id):
    dprintln( "callback: CreateProcessHandler" )

nt = module( "ntdll" )

faddr = nt.offset("NtCreateFile")

if faddr != 0:
    bp = setBp(faddr, Callback)
    print "callback id: ", bp, "address: ", hex( faddr )

go() # один раз сработает
Jan 11, 2013 at 10:53 AM
Edited Jan 11, 2013 at 10:54 AM

Спасибо! =)

Проект стоящий, имхо. Хочется конечно немного больше примеров и доков. Но и за то, что сейчас уже есть спасибо.

Слежу за развитием!

P.S. А ведь можно запустить скрипт (не этот) через !py чтобы он сделал какую-то работу и продолжал там висеть, до определенных событий, да? Ну и как это сделать или если не трудно или ссылку на RTFM=)


P.P.S. Ссылка на скрипты на главной странице ведет к 404...

Coordinator
Jan 11, 2013 at 11:38 AM
Edited Jan 11, 2013 at 11:40 AM

Например так:


handler.py:

 

from pykd import *

class MyHandler( eventHandler ):

    def onBreakpoint( self, id ):
         return  NoChange # place your code here

    def OnException( self, exceptionInfo ):
        return  NoChange # place your code here

 

в windbg:

 

>!pycmd
>>>import  handler
>>>eventHandler = handler.MyHandler()
>>>quit()
>g

 

Обработчик событий будет висеть до удаления переменной eventHandler.  Также поддерживаются события OnModuleLoad  и OnModuleUnload