Брейкпоинт на диапазон адресов в памяти

Тема в разделе "WASM.RESEARCH", создана пользователем Broken Sword, 22 июл 2006.

  1. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Все-таки, кто-нибудь сталкивался с полностью рабочим вариантом бряков на обращение к диапазону памяти? Известные мне варианты:

    1. SoftIce + IceExt = !bpr. Вылетает в синий экран либо сразу, либо через какое-то время.
    2. OllyDbg + Breakpoint on memory access. Недостаток в том, что работает сразу на большой кусок (слишком много ложных срабатываний).
    3. OllyDbg + OllyScript = bprm. Срабатывает раз через двадцать, по каким-то странным закономерностям.

    Неужели так сложно реализовать эту функцию руками? На свой плагин катострофически нет времени, может кто знает пути решения.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Broken Sword
    Если только руками Intel и AMD ;)))
    Кроме хардварных бряков на 1,2,4 байта и изменения атрибутов 4К страниц вроде как других механизмов отловить обращение к памяти - нет
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    случай 2) автор мог бы разделить на execution и rw
     
  4. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    leo, ну почему же, можно и программно. В Olly Breakpoint on memory access впринципе нормально работает, единственный недостаток - много ложных срабатываний из-за большого диапазона. Почему бы при срабатывании бряка не проверять адрес на заданный диапазон? Пару команд добавить и все будет ок.
    В 1.10 появилась возможность при срабатывании бряка отправлять плагинам команды из Conditional Log Breakpoint, но, к сожалению, Break on memory access не поддерживается в этом окне. Какие есть еще варианты?
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    не понял, я всегда выделяю только тот диапазон который надо и ставлю бряк на него
     
  6. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    bogrus, всмысле - выделяю? мышью что-ли? а если там несколько тыс. кб. надо?
    или ты имеешь ввиду в окне Memory? Если там - то я ж говорю: этот вариант не подходит. В тот диапазон, что мне нужен, попадает куча ненужных страниц и слишком часто срабатывает. Мне нужно конкретно на мою область - 500h байт к примеру.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Broken Sword
    MR expression1 [,expression2] Set memory breakpoint on access to rang

    в окне кода
     
  8. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Полностью аналогично ситуации с bprm - срабатывает не всегда и по странным закономерностям.
     
  9. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Ок, как с этим делом у IDA-шного дебагера обстоят дела? Вообще как он в пятой версии - догнал ольку или уже перегнал?
     
  10. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    ок, отвечу сам себе - до ольки еще далеко. поддерживаются бряки только 1,2 и 4 байта длиной.
    придумал вариант - что если поменять аттрибуты того блока памяти, в котором находится требуемый диапазон (запретить чтение/запись, к примеру), а потом в скрипте (или плагине) просто сравнивать адрес, по которому возник эксепшн и если он не наш - поменять атрибуты обратно на "Доступно все". отсюда вопрос: как это сделать? единственное, что удалось найти - структура t_memory в plugins.hlp, однако "do not modify directly!" ставит в тупик - как иначе, если не directly?
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Broken Sword
    + затем в пошаге выполнить инструкцию, вызвавшую исключение, и снова запретить доступ к страницам (иначе будет срабатывать "раз через двадцать, по каким-то странным закономерностям" ;)
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Broken Sword
    > отсюда вопрос: как это сделать?
    VirtualProtect?
     
  13. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Итак, в ODBG_Pausedex информация о событии ACCESS VIOLATION приходит "раз через двадцать", как и следовало ожидать... Почему то Олька в упор не хочет уведомлять об этом на инструкциях типа rep movsb (мож оптимизацию какую всунули?).
    Теперь вопрос: как можно реализовать все это без ODBG_Pausedex?
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    У меня не юзается ODBG_Pausedex в плагине, но для твоего случая видимо не пойдет такой способ
     
  15. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Asterix
    Что интересно - Access Violation возникает и на инструкциях типа rep movsb и mov reg,[addr], но ODBG_Pausedex вызывается только в случае mov reg,[addr]. У них там что - оптимизация что ли? Других решений, без ODBG_Pausedex, не вижу :dntknw:
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Ну сам то Olly на rep movsb при бряке на доступ к памяти у меня срабатывает, так
    что даже не знаю, по идее и ODBG_Pausedex должен вызываться, может прога хитрая,
    проверяет атрибуты памяти?
     
  17. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Asterix
    неа.. ничего в ней нет, ничем не пакована. прога читает файл в буфер (при нажатии кнопки в меню), мне на чтение из этого буфера нужно бряк ставить. если я просто запущу прогу и поставлю бряк на диапазон, то rep movsb не отлавливается. Если же я пройду по коду на месте вызова ReadFile в режиме трассировки (именно так) и только затем поставлю бряк - он будет работать... Аналогично, событие в ODBG_Pausedex приходит только по mov reg, [addr] в первом случае, и приходят все собщения (включая rep-ы) если пройтись по ReadFile в режиме трассировки.
     
  18. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Написал уже свою прогу, которая аттачиться к процессу. Далее запретил доступ к требуемому диапазону, и сижу ловлю EXCEPTION_SINGLE_STEP и EXCEPTION_ACCESS_VIOLATION. Ну и что вы думаете? Первый же отловленный ACCESS_VIOLATION на все той же mov reg,[mem]!!! А первым там идет rep movsb.

    Вообщем оказывает лажа то совсем в другом. Дело в том, что перед всеми манипуляциями с буфером, прога делает ReadFile в этот буфер. Если же уже перед ReadFile поставить бряк на доступ к этому буферу, то ReadFile обламывается!!! Именно поэтому до rep movsb дело не доходит. Но прикол в другом. В проге для вызова ReadFile идет такая конструкция:

    call proc1
    ...
    proc1: call proc2
    ...
    proc2:call proc3
    ...
    proc3: call ReadFile

    Так вот, если пройти в режиме трассировки call ReadFile (причем с верхнего уровня) - то все ок! Буфер наполняется даже с установленным брейкпоинтом на него. А если сразу нажать Step over на call proc2 - ReadFile дохнет... Странно как-то, кто-нибудь может предложить догадки?