Все-таки, кто-нибудь сталкивался с полностью рабочим вариантом бряков на обращение к диапазону памяти? Известные мне варианты: 1. SoftIce + IceExt = !bpr. Вылетает в синий экран либо сразу, либо через какое-то время. 2. OllyDbg + Breakpoint on memory access. Недостаток в том, что работает сразу на большой кусок (слишком много ложных срабатываний). 3. OllyDbg + OllyScript = bprm. Срабатывает раз через двадцать, по каким-то странным закономерностям. Неужели так сложно реализовать эту функцию руками? На свой плагин катострофически нет времени, может кто знает пути решения.
Broken Sword Если только руками Intel и AMD )) Кроме хардварных бряков на 1,2,4 байта и изменения атрибутов 4К страниц вроде как других механизмов отловить обращение к памяти - нет
leo, ну почему же, можно и программно. В Olly Breakpoint on memory access впринципе нормально работает, единственный недостаток - много ложных срабатываний из-за большого диапазона. Почему бы при срабатывании бряка не проверять адрес на заданный диапазон? Пару команд добавить и все будет ок. В 1.10 появилась возможность при срабатывании бряка отправлять плагинам команды из Conditional Log Breakpoint, но, к сожалению, Break on memory access не поддерживается в этом окне. Какие есть еще варианты?
bogrus, всмысле - выделяю? мышью что-ли? а если там несколько тыс. кб. надо? или ты имеешь ввиду в окне Memory? Если там - то я ж говорю: этот вариант не подходит. В тот диапазон, что мне нужен, попадает куча ненужных страниц и слишком часто срабатывает. Мне нужно конкретно на мою область - 500h байт к примеру.
Ок, как с этим делом у IDA-шного дебагера обстоят дела? Вообще как он в пятой версии - догнал ольку или уже перегнал?
ок, отвечу сам себе - до ольки еще далеко. поддерживаются бряки только 1,2 и 4 байта длиной. придумал вариант - что если поменять аттрибуты того блока памяти, в котором находится требуемый диапазон (запретить чтение/запись, к примеру), а потом в скрипте (или плагине) просто сравнивать адрес, по которому возник эксепшн и если он не наш - поменять атрибуты обратно на "Доступно все". отсюда вопрос: как это сделать? единственное, что удалось найти - структура t_memory в plugins.hlp, однако "do not modify directly!" ставит в тупик - как иначе, если не directly?
Broken Sword + затем в пошаге выполнить инструкцию, вызвавшую исключение, и снова запретить доступ к страницам (иначе будет срабатывать "раз через двадцать, по каким-то странным закономерностям"
Итак, в ODBG_Pausedex информация о событии ACCESS VIOLATION приходит "раз через двадцать", как и следовало ожидать... Почему то Олька в упор не хочет уведомлять об этом на инструкциях типа rep movsb (мож оптимизацию какую всунули?). Теперь вопрос: как можно реализовать все это без ODBG_Pausedex?
Asterix Что интересно - Access Violation возникает и на инструкциях типа rep movsb и mov reg,[addr], но ODBG_Pausedex вызывается только в случае mov reg,[addr]. У них там что - оптимизация что ли? Других решений, без ODBG_Pausedex, не вижу
Ну сам то Olly на rep movsb при бряке на доступ к памяти у меня срабатывает, так что даже не знаю, по идее и ODBG_Pausedex должен вызываться, может прога хитрая, проверяет атрибуты памяти?
Asterix неа.. ничего в ней нет, ничем не пакована. прога читает файл в буфер (при нажатии кнопки в меню), мне на чтение из этого буфера нужно бряк ставить. если я просто запущу прогу и поставлю бряк на диапазон, то rep movsb не отлавливается. Если же я пройду по коду на месте вызова ReadFile в режиме трассировки (именно так) и только затем поставлю бряк - он будет работать... Аналогично, событие в ODBG_Pausedex приходит только по mov reg, [addr] в первом случае, и приходят все собщения (включая rep-ы) если пройтись по ReadFile в режиме трассировки.
Написал уже свою прогу, которая аттачиться к процессу. Далее запретил доступ к требуемому диапазону, и сижу ловлю 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 дохнет... Странно как-то, кто-нибудь может предложить догадки?