Вопросы по работе с OllyDbg

Тема в разделе "WASM.BEGINNERS", создана пользователем SoLa, 20 май 2006.

  1. SoLa

    SoLa New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    5
    Есть несколько очень конкретных вопросов по работе c OllyDbg:

    1) Есть следующий, понятный как день, код:

    00595828 /. 55 PUSH EBP

    00595829 |. 8BEC MOV EBP,ESP

    0059582B |. 83C4 F8 ADD ESP,-8

    0059582E |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX

    00595831 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX

    00595834 |. 33D2 XOR EDX,EDX

    00595836 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

    00595839 |. 8B80 BC050000 MOV EAX,DWORD PTR DS:[EAX+5BC]

    0059583F |. E8 585EEBFF CALL ccalc.0044B69C

    00595844 |. A1 FC6C6000 MOV EAX,DWORD PTR DS:[606CFC]

    00595849 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

    0059584B |. 8B40 24 MOV EAX,DWORD PTR DS:[EAX+24]

    0059584E |. 80B8 BC000000 CMP BYTE PTR DS:[EAX+BC],0

    00595855 74 0F JE SHORT ccalc.00595866

    00595857 A1 8C696000 MOV EAX,DWORD PTR DS:[60698C]

    0059585C 8B00 MOV EAX,DWORD PTR DS:[EAX]

    0059585E 8B10 MOV EDX,DWORD PTR DS:[EAX]

    00595860 FF92 F8000000 CALL DWORD PTR DS:[EDX+F8]

    00595866 |> 59 POP ECX

    00595867 |. 59 POP ECX

    00595868 |. 5D POP EBP

    00595869 \. C3 RETN

    Итак, по адресу 0059584E идет проверка. Если в ячейке по адресу DS:[EAX+BCh] не ноль, то прога, предположим, считает что не зарегистрирована. Значит, все что нужно сделать – это по DS:[EAX+BCh] записать зеро, а кусок кода с 00595855 по 00595866 (POP ECX, естественно, оставляем :)) занопить. Вопрос: если в природе что-то типа калькулятора, который при вводе команды MOV BYTE PTR DS:[EAX+BCh],0 выдавал опкод этой команды? И вообще, как быстро генерить опкод, не заглядывая в справочник и не прибегая к очевидному: «Набери код на ассемблере, откомпилируй в фасме и посмотри в отладчике»?



    2) Как правильно поставить бряк на чтение-запись ячейки, адрес которой в EAX+BCh (он конкретно известен при отладке, предположим: 01234567h), чтобы отследить в какой момент прога записывает туда чего-то (если записывает, конечно) или читает? Проблема в том, что как поставить бряк не совсем понятно (RM 01234567 ???) :) и, вдобавок, бряк нужно ставить после инициализации данного куска памяти, т.е. уже после того, как прога начала работу и, например, выделила память под нашу переменную.



    3) В чем отличие «хардварного» бряка на доступ к памяти от стандартного бряка на чтение-запись? «Хардварный» ослеживает обращение к ФИЗИЧЕСКОЙ ячейке памяти или ….? Поясните плиз.



    4) Есть следующая ситуация: основной код программы вызывает ПРОЦЕДУРУ1, а та в свою очередь ПРОЦЕДУРУ2, причем ПРОЦЕДУРА2 так «корявит» стек, что по завершению вываливается в основной блок программы. Бряк срабатывает в ПРОЦЕДУРЕ2. Каким образом, мне попасть в ПРОЦЕДУРУ1 не возясь со стеком? («EBP или какой там регистр при начале работы ПРОЦЕДУРЫ2 содержит адрес возврата в ПРОЦЕДУРУ1», - скажет эксперт: « Вот тебе и адрес!» ). Другими словами, как посмотреть откуда был прыжок в ПРОЦЕДУРУ2 (например, что-то типа: Olly ведет лог прыжков и я как бы «отматываю» назад выполнение программы)?

    5) Почему в командной стоке Olly не работает команда: bc*? Неудачный плагин или несовместимость версий? Или руки кривые :)?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351




    или следующий JE заменить на JMP, тогда и нопить ничего не придется.





    Если вариант с изучением формата команд и генерированием опкода в уме не подходит :) можно создать тестовый ехе в котором N нопов и ExitProcess, открываешь его в Olly и "режешь по живому" :)
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    SoLa



    Т.е. кратчайший эквивалент данной мнемоники в шестнадцатеричном формате?



    Двойной клик в колонке мнемоников в окне CPU. Вводим MOV BYTE PTR DS:[EAX+0BC],0. Жмём Assemble. Получаем: С680 BC000000 00.





    Вычисляем адрес этой ячейки в рантайме. Предположим, что адрес 01234567h. В дампе (окно dump) в контекстном меню задаём Go to -> Expression. Вводим 01234567. Смотрим нашу ячейку в окне дампа. Опять в контекстном меню Breakpoint -> Hardware. В зависимости от задачи, выбираем on access или on wright и размер ячейки. Если таких бряков будет много, вместо hardware задаём memory.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А хэлп почитать и потыкаться по менюшкам - наверное тяжело ;)

    1) По правой кнопке вызываешь Assemble и вводишь что угодно. Если не нужно сохранять делаешь Undo selection или View\Patches и т.д.

    2) А в чем проблема ? Ставишь хардварный бряк и ждешь ;)

    3) Насчет "физической" ты ес-но загнул. Хардварные бряки работают через отладочные регистры процессора DR0-DR3 и соответсвенно позволяют ослеживать обращение к 4-м областям памяти размером 1, 2, 4 байта. А вот как ты говоришь "стандартный" бряк - вовсе и не стандартный, а скорее извращенный - отладчик изменяет атрибуты защиты всей страницы памяти и обрабатывает все исключения, которые могут при этом возникнуть - отлавливая то, которое соответсвует заданному тобой диапазону адресов.

    4) View\Call stack

    5) не знаю
     
  5. SoLa

    SoLa New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    5
    Двойной клик в колонке мнемоников в окне CPU. Вводим MOV BYTE PTR DS:[EAX+0BC],0. Жмём Assemble. Получаем: С680 BC000000 00.

    То что нужно! Я пробовал, кстати, так делать но просто не ожидал что ноль надо ставить перед BCh. Спасибо! А что по поводу 4 вопроса?
     
  6. SoLa

    SoLa New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    5
    Все понял!Всем спасибо :) Следующие на очереди WinDasm и IDA :)