2012-01-05 12 views
12

Obecnie realizuję ostatnie zadanie dla małego szkieletu do debugowania, a mianowicie HW Breakpoints. Odniosłem się do tego artykułu do tej pory: http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx oraz książkę o pisaniu Debuggera.Hardwarebreakpoint WINAPI

mam następujące dwie funkcje do tej pory do ustawiania punktu przerwania HW:

void debuglib::breakpoints::hw_bp() { 
    HANDLE helper = 0; 

    CONTEXT co; 
    CURRENTCONTEXT(co); 

    helper = ::CreateThread(0,0,threadfunc,reinterpret_cast<void*>(co.Eip),0,0); 

    DWORD status = ::WaitForSingleObject(helper,INFINITE); 


    if (status != WAIT_OBJECT_0) { 
      ::MessageBoxA(0, "Helper thread didn't exit cleanly", "HWBreakpoint", MB_OK); 
    } 

    ::CloseHandle(helper); 
} 

static DWORD WINAPI debuglib::breakpoints::threadfunc(void* param) { 

    DWORD suspendcnt = ::SuspendThread(debuglib::process::thread()); 
    if(suspendcnt) { 
     return 0; 
    } 

    CONTEXT co; 
    ::ZeroMemory(&co,sizeof(co)); 
    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 

    BOOL ok = ::GetThreadContext(debuglib::process::thread(),&co); 

    if(!ok) { 
     return 0; 
    } 

    DWORD freeDr = 0; 
    DWORD condition = debuglib::breakpoints::TRIGGER::CODE; 
    DWORD length = debuglib::breakpoints::SIZE::SIZE_1; 

    co.Dr0 = reinterpret_cast<DWORD>(param); 

    co.Dr7 = co.Dr7 | 1 << (freeDr*2); 
    co.Dr7 = co.Dr7 | condition << ((freeDr*4)+16); 
    co.Dr7 = co.Dr7 | length << ((freeDr*4)+18); 

    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 
    ok = ::SetThreadContext(debuglib::process::thread(), &co); 

    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 
    ::GetThreadContext(debuglib::process::thread(),&co); 

    suspendcnt = ::ResumeThread(debuglib::process::thread()); 
    if(suspendcnt == 0xFFFFFFFF) { 
     return 0; 
    } 

    return 1; 
} 

Więc najpierw tworzę wątku pomocnika ponieważ jestem debugowania bieżącego wątku. W ramach funkcji wywołania zwrotnego wątku pomocniczego, zawieszam wątek główny. Następnie odczytuję bieżące wartości DR głównego wątku (w tej chwili nie jest to istotne, ponieważ zawsze używam DR0, po tym działa, sprawdzę, które rejestry są wolne i używają do 4 BP). Następnie użyłem adresu zwrotnego funkcji wywołującej (EIP) jako adresu, aby złamać DR0 i ustawić przynależne flagi w DR7.

Na koniec wznawiam główny wątek i zamykam klamkę nici pomocnika, po jej zakończeniu.

Z tym kodem mam następujący problem:

Gdybym uruchomić program w trybie debugowania programów zatrzymuje się pod właściwym adresem, ale nie mogę nic więcej robić, ponieważ flaga INT1 jest ustawiony Chyba i VS debugger nie może o jeden krok dalej?

Jeśli wykonuję program bez debugowania, to powoduje on awarie. Próbowałem użyć __try, __except jak we wspomnianym projekcie (http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx), ale to też nie działa.

Doceniam i pomagam lub informuję, co robię źle i jak rozwiązać ten problem.

+0

Czy możesz mi powiedzieć, jakie jest imię książki, z której korzystasz? Jestem również zainteresowany rozwojem debuggera hw. –

+2

To się nazywa "Hacking with Python", ale jest napisane po niemiecku (http://www.amazon.de/Hacking-mit-Python-Fehlersuche-Programmanalyse/dp/3898646335/ref=sr_1_1?ie=UTF8&qid= 1325766641 i sr = 8-1). – Chris

+0

Dziękuję, spróbuję znaleźć coś po angielsku od tego samego autora. –

Odpowiedz

1

Nie sądzę, że dobrym pomysłem jest zrobienie debugowania programu. Dlaczego nie skorzystać z API programowania debuggera wbudowanego w Windows?

Dev Center - Pulpit> Nauka> Referencje> Diagnostyka> Debugowanie i obsługa błędów> Podstawowe debugowanie> Debugowanie Reference> Funkcje debugowania: http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303%28v=vs.85%29.aspx

Na sprzęcie x86, single-stepping jest włączona, ustawiając flagę pułapki w eflags. Procesor podniesie wyjątek punktu przerwania po ukończeniu jednej instrukcji. Wydaje mi się, że debugger visual kei zmienia ten fragment flag, ingerując w to, co próbujesz zrobić.

Spróbuj uruchomić swój program poza visual studio (bez debuggera). Czy działa zgodnie z oczekiwaniami?

Powiązane problemy