eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJak działa debugger? ramki stosu
Ilość wypowiedzi w tym wątku: 10

  • 1. Data: 2013-05-01 21:48:39
    Temat: Jak działa debugger? ramki stosu
    Od: "Borneq" <b...@a...hidden.pl>

    Mam opis pod Windows (a jak będzie pod Linuksem?)
    http://www.codeproject.com/Articles/189711/Write-you
    r-own-Debugger-to-handle-Breakpoints
    http://www.codeproject.com/Articles/43682/Writing-a-
    basic-Windows-debugger

    Tam jest nietypowo, bo pułapkę ustawia proces śledzony, ale doszedłem że
    można użyć WriteProcessMemory. Nawet gdy nie ustawię pułapki, debugger
    zatrzymuje się na samym początku wykonywania programu w
    ntdll.DbgBreakPoint (czy zawsze tak jest)?
    Aby otrzymac adres początku programu muszę znać ramki stosu, jak można
    wylistować je?


  • 2. Data: 2013-05-01 22:32:02
    Temat: Re: Jak działa debugger? ramki stosu
    Od: firr kenobi <p...@g...com>

    W dniu środa, 1 maja 2013 21:48:39 UTC+2 użytkownik Borneq napisał:
    > Mam opis pod Windows (a jak będzie pod Linuksem?)
    >
    > http://www.codeproject.com/Articles/189711/Write-you
    r-own-Debugger-to-handle-Breakpoints
    >
    > http://www.codeproject.com/Articles/43682/Writing-a-
    basic-Windows-debugger
    >
    >
    >
    > Tam jest nietypowo, bo pułapkę ustawia proces śledzony, ale doszedłem że
    >
    > można użyć WriteProcessMemory. Nawet gdy nie ustawię pułapki, debugger
    >
    > zatrzymuje się na samym początku wykonywania programu w
    >
    > ntdll.DbgBreakPoint (czy zawsze tak jest)?
    >
    > Aby otrzymac adres początku programu muszę znać ramki stosu, jak można
    >
    > wylistować je?


    dobre pytanie, nie wiem dokladnie,
    ale prawdopodobnie (w 32bitowej wersji)
    jest tak ze w ebp masz wskaznik na poczatek
    tramki stosu danej funkcji, pod ktorym to adresem
    jest zapisany poprzedni ebp w ten sposob przez
    wyluskiwanie mozna sie cofnac, jesli main
    by nadal ebp wartosc 0 to mozna sprawdzic kiedy
    koniec cofania (ale nie wiem czy tak jest)

    Przed kazdym z tych adresow na stosie sa adresy
    powrotów dla ret - nie sa top adresy poczatku funkcji w sekcji .code tylko adresy tuz
    za
    call (o ile dobrze to rozumiem) ale cofajac sie
    z nich 4 bajty dostaniesz prawdopodobnie
    adresy poczatkow procedur kolejnych poziomów

    - jest to ew przyblizony obraz ale tak to mw chyba
    jest - bo tak sobie to wyobrazam, czyli nie jest to takie skomplikowane


  • 3. Data: 2013-05-01 22:34:38
    Temat: Re: Jak działa debugger? ramki stosu
    Od: "Borneq" <b...@a...hidden.pl>

    Użytkownik "Borneq" <b...@a...hidden.pl> napisał w wiadomości
    news:klrrio$821$1@node2.news.atman.pl...
    > Aby otrzymac adres początku programu muszę znać ramki stosu, jak można
    > wylistować je?

    Jest coś takiego
    http://svn.pld-linux.org/cgi-bin/viewsvn/backtracexx
    /


  • 4. Data: 2013-05-01 22:58:06
    Temat: Re: Jak działa debugger? ramki stosu
    Od: "Borneq" <b...@a...hidden.pl>

    Użytkownik "firr kenobi" <p...@g...com> napisał w wiadomości
    news:44c0cefb-1b95-4137-afc7-d9deb0cd528e@googlegrou
    ps.com...
    > jest tak ze w ebp masz wskaznik na poczatek
    > tramki stosu danej funkcji, pod ktorym to adresem

    Dzięki za info, mam nadzieję że większość programów używa ebp w standardowy
    sposób, bo może być jakis program który wola call i ret ale nie ustawia ebp,


  • 5. Data: 2013-05-02 08:38:49
    Temat: Re: Jak działa debugger? ramki stosu
    Od: Marek Borowski <m...@...borowski.com>

    On 2013-05-01 22:58, Borneq wrote:
    > Użytkownik "firr kenobi" <p...@g...com> napisał w wiadomości
    > news:44c0cefb-1b95-4137-afc7-d9deb0cd528e@googlegrou
    ps.com...
    >> jest tak ze w ebp masz wskaznik na poczatek
    >> tramki stosu danej funkcji, pod ktorym to adresem
    >
    > Dzięki za info, mam nadzieję że większość programów używa ebp w
    > standardowy sposób, bo może być jakis program który wola call i ret ale
    > nie ustawia ebp,
    Jest ich wiele. Wystarczy miec wlaczona opcje kompilatora omit frame
    pointer. W visualu domyslnie sie wlacza razem z opcjami optymalizacji.

    Pozdrawiam

    Marek


  • 6. Data: 2013-05-02 18:10:30
    Temat: Re: Jak działa debugger? ramki stosu
    Od: "Borneq" <b...@a...hidden.pl>

    Użytkownik "Marek Borowski" <m...@...borowski.com> napisał w wiadomości
    news:klt1lq$57f$1@news.task.gda.pl...
    > Jest ich wiele. Wystarczy miec wlaczona opcje kompilatora omit frame
    > pointer. W visualu domyslnie sie wlacza razem z opcjami optymalizacji.

    Czy w takim razie jest jakaś możliwość? Debuggery pokazują, ale nie wiem czy
    tylko w tym przypadku, gdy mają informację dla debuggera, a to problem
    (format dwarf) złozony.
    Jakby przeanalizować backtracexx, można by zobaczyc jak sobie radzi.
    Zaimportowałem do githuba:
    https://github.com/borneq/backtracexx

    Pozdrawiam


  • 7. Data: 2013-05-02 19:26:53
    Temat: Re: Jak działa debugger? ramki stosu
    Od: firr kenobi <p...@g...com>

    wtedy chyba byloby o wiele trudniej
    bo o ile asma dosyc latwo disasembluje
    sie w przod to gorzej z disasemblowaniem
    go w tyl - trzebaby napisac jakies
    bardziej skomplikowane algorytmy ktore
    pewie dalyby sie napisac i moze gwaratntowaly
    by nawet blisko 100% ppoprawnosc ale
    to cyba jednak juz dzialka nieco
    powazniejszej analizy

    wogole debugowanie na poziomie asma
    wydaje mi sie robota raczej dla crackerow
    a nie normalnych programistow

    mi wogole debugger nie wydaje sie niezbedny
    aczkolwiek pewnie czasem moze sie przydac
    (jest jeszcze rofiler potencjalnie ciekawe
    narzedzie ale nie zaznajomilem sie z zadnym
    w wiekszym stopniu - pamietam tylko tego z
    xcode)





  • 8. Data: 2013-05-03 00:22:47
    Temat: Re: Jak działa debugger? ramki stosu
    Od: "M.M." <m...@g...com>

    W dniu czwartek, 2 maja 2013 19:26:53 UTC+2 użytkownik firr kenobi napisał:

    > to gorzej z disasemblowaniem go w tyl
    Kazda instrukcja (wraz ze swoimi argumentami) musialaby
    zajmowac taka sama ilosc bitow. Gdy N poprzednich bitow
    zawiera liczbe X, to nie wiemy czy to jest opcode poprzedniej
    instrukcji, czy argument "jeszcze poprzedniej" instrukcji :)


    Pozdrawiam


  • 9. Data: 2013-05-03 08:47:26
    Temat: Re: Jak działa debugger? ramki stosu
    Od: Edek <e...@g...com>

    Dnia Thu, 02 May 2013 15:22:47 -0700 po głębokim namyśle M.M. rzekł:

    > W dniu czwartek, 2 maja 2013 19:26:53 UTC+2 użytkownik firr kenobi
    > napisał:
    >
    >> to gorzej z disasemblowaniem go w tyl
    > Kazda instrukcja (wraz ze swoimi argumentami) musialaby zajmowac taka
    > sama ilosc bitow. Gdy N poprzednich bitow zawiera liczbe X, to nie wiemy
    > czy to jest opcode poprzedniej instrukcji, czy argument "jeszcze
    > poprzedniej" instrukcji :)

    To jeszcze nic. Mając dowolną labelkę może być wiele dróg, jakimi
    program do nich doszedł.

    Ale prawdopodobnie proces jest możliwy, tyle nie ze 100% skutecznością.
    Języki są kompilowane w dość przewidywalny i schematyczny sposób,
    dałoby się zrekonstruować zmienne i graf bloków kodu co już byłoby
    przydatnym narzędziem. Potem dałoby radę wyeleminować z grafu te
    bloki, które logicznie można odrzucić na podstawie stanu zmiennych
    i rejestrów - udowadniając, że program nie mógł do nich dojść.
    Można dorzucić zachowany stos poniżej SP, aktualny stos, możliwe
    wcześniejsze stosy i przebieg pomiędzy funkcjami, a to co wymieniałem
    dotyczy jednak bloku kodu jedenj funkcji, dałoby radę też użyć
    rejestrów, które są już "dead", lae zachowały ostatnie użycie,
    byle nie float - i ma się pikne narzędzie.

    Pomimo tego uważam, że to wysiłek poświęcony złej sprawie.

    --
    Edek


  • 10. Data: 2013-05-04 23:04:09
    Temat: Re: Jak działa debugger? ramki stosu
    Od: Michoo <m...@v...pl>

    On 03.05.2013 08:47, Edek wrote:

    >
    > To jeszcze nic. Mając dowolną labelkę może być wiele dróg, jakimi
    > program do nich doszedł.
    >
    > Ale prawdopodobnie proces jest możliwy,

    IDA tak działa - sprawdza program flow i rejestruje adresy skoków (po
    skoku musimy być na prawidłowej instrukcji) - w ten sposób z czasem
    tworzy graf przepływu sterowania a przy tym ignoruje takie "standardowe"
    sztuczki jak skakanie do segmentu danych(który z o dziwo ma +x ;) ), czy
    skakanie do EIP+2.

    Jest cała szkoła - jak pisać kod tak, żeby debugowanie za pomocą IDY
    było możliwie trudne - jedna z ciekawszych sztuczek(przy czym ma już
    kilka lat, więc pewnie nauczyli się to obchodzić): umieść na początku
    funkcji kilka instrukcji, printf("%s",ESP+xxx), potem skok gdzie
    indziej. Skacz do funkcji za pomocą if(!foo) bar(); else (foo+bar)(); -
    disassembler pójdzie tylko pierwszą ścieżką bo druga jest osiągalna
    tylko w runtime.


    --
    Pozdrawiam
    Michoo

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: