[OlyDbg] Ошибка записи при пошаговой отладке.

Тема в разделе "WASM.BEGINNERS", создана пользователем Vitamant, 11 дек 2011.

  1. Vitamant

    Vitamant New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    9
    Доброго времени суток!

    Отлаживаю софтину. Если пустить все на самотек и не брякать ее ни разу - все проходит чудесно. Стоит хоть раз ее тормознуть, как в определенном месте (вернее местах) она начинает стабильно падать. Вот, к примеру, одно из таких мест:

    Код (Text):
    1. CPU Disasm
    2. Address   Hex dump          Command                                  Comments
    3. 0044FF8A  ║► ┌8B06          MOV EAX,DWORD PTR DS:[ESI]
    4. 0044FF8C  ║· │83C6 04       ADD ESI,4
    5. 0044FF8F     │8907          MOV DWORD PTR DS:[EDI],EAX
    6. 0044FF91  ║· │83C7 04       ADD EDI,4
    7. 0044FF94  ║· │49            DEC ECX
    8. 0044FF95  ║·▲└75 F3         JNE SHORT 0044FF8A
    В данном случае в регистре EDI лежит число 0x01300018h - притом, что видимая отладчиком область памяти кончается на 0x004D6FF0h. При попытке записи
    Код (Text):
    1. 0044FF8F     │8907          MOV DWORD PTR DS:[EDI],EAX
    Отладчик грязно матерится на Access violation. Предлагает либо застрелиться, либо нажать Shift+Click
    Последний вариант выкидывает в такое вот место:
    Код (Text):
    1. CPU Disasm
    2. Address   Hex dump          Command                                  Comments
    3. 7C90E47C  ║·  8B4C24 04     MOV ECX,DWORD PTR SS:[ESP+4]             ; ntdll.KiUserExceptionDispatcher(pExceptionRecord,pContext)
    4. 7C90E480  ║·  8B1C24        MOV EBX,DWORD PTR SS:[ESP]
    5. 7C90E483  ║·  51            PUSH ECX                                 ; ╓Arg2
    6. 7C90E484  ║·  53            PUSH EBX                                 ; ║Arg1
    7. 7C90E485  ║·  E8 84C00100   CALL 7C92A50E                            ; └ntdll.7C92A50E
    Как я понял (возможно, ошибаюсь), выше висит отлов и обработка исключений, которая исправно их ловит, но не в меру умный OlyDbg делает это раньше, и не дает работать (цикл в несколько тысяч итераций особо не прощелкаешь).

    В связи с этим вопрос - что делать? Действительно ли это правомерный экзепшен, предвиденный разработчкиами или же он поражден бряком дебагера? Если первое - как отучить OlyDbg на этом падать? Код однозначно полезный - забивание NOP'ами приводит к тому, что исчезает то, что мне и нужно исправить.
     
  2. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Посмотри установлен ли обработчик SEH помимо дефолтного нулевого, если нет то ставь бряк на ближайшем. В простейшем случае.
     
  3. Vitamant

    Vitamant New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    9
    Эх, забыл уточнить, что я чайник... х_х
    Ладно, попробую разобраться. SEH - это механизм отлова исключений, нэ? Дефолтный нулевой SEH - это системный SEH, так? Тогда встает вопрос - как посмотерть - установлен ли он? И опять же, если исключение выбрасывает меня не вон из проги, а в какой-то участок ее памяти, видимо, там обработчик все-таки есть? Наконец что делать дальше? Бряк на ближайшем - эт здорово, но мне то нужно после конкретного кусочка кода...

    Разъясню ситуацию:
    Ломаю игру, пытаясь прикрутить к ней русские буковки. По-умолчанию все символы выше 127 игнорировались. Причина была в знаковых байтах. Нашел, исправил. Теперь она начала некоторые буквы глотать. В области памяти, в которой появляется выводимый текст на их месте стоят 0. Бряк на запись памяти не помогает - она часто используется другими функциями. По стеку прошел вверх до функции, которая также вызывается слишком часто и бряк на ней не поставишь ввиду того, что свернуть приложение я могу лишь раз (причина тут: http://www.wasm.ru/forum/viewtopic.php?id=43328). Поэтому решил остановить отладку хоткеем за секунду до вывода текста. Остановил. Дальнейший запуск приводит к вышеозначенной проблеме.

    Так что мне бы в первую очередь чтобы дебагер не ругался и позволил коду исполняться как тому нравится. Можно, конечно, перенести код в другое место, сделать к нему и от него джампы, сам код расширить и встроить проверку на выход за границе доступной памяти. Но а) лень; б) не уверен, что баги родные, а не вызванные отладкой.
     
  4. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Посмотри что лежит по адрессу fs:[0], если FFFFFFFF, то не установлен.
     
  5. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Vitamant
    Да, http://wasm.ru/publist.php?list=21
    Да.
    Да, но возможно зто системный обработчик.
     
  6. Vitamant

    Vitamant New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    9
    Хм... окей, попробую разобраться.
     
  7. ivanov122

    ivanov122 New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2011
    Сообщения:
    1
    Спасиб за инфу. Пытался разобраться, вроде получается, благодаря инфе на форуме.