пятница, 26 марта 2010 г.

Как я был отладчиком

На форуме RSDN попросили пропороть игрушку Minuscube на момент того, как она работает и нужна ли вообще.
Загружаю, ставлю и вижу страшную картинку, про то что обнаружена ошибка и пора бы отправить отчет. За неимением более важных дел, и из желания повыеживаться помочь, нажимаю «отладка» (OllyDbg по умолчанию) и открываю в IDA Pro.



Отладчик показал следующую картинку:




то есть DS:[004BB838] должен указывать на функцию, которую нужно вызвать. Но в моем случае он указывает на ноль, и естественно, что переход по этому адресу приведет к исключению.
Стало быть, надо найти, где в эту переменную заносится значение, и почему там 0. Вот тут и пригодится IDA.



Открываю, перехожу по искомому адресу, жму на просмотр перекрестных ссылок. Отлично: переменная изменяется только по одному адресу. Перехожу туда, запускаю дебагер, ставлю breakpoint, запускаю программу. Перехожу в начало функции и нажимаю просмотр перекрестных ссылок



Перехожу к вызову и вижу следующий текст:

loc_43938A
.text:0043938A call sub_4311B0
.text:0043938F test al, al
.text:00439391 setz dl
.text:00439394 cmp byte_4BD143, 0
.text:0043939B mov byte_4BCE5F, dl
.text:004393A1 jnz short loc_4393AC
.text:004393A3
.text:004393A3 loc_4393A3:
.text:004393A3 cmp byte_4BCE60, 0
.text:004393AA jz short loc_4393C4
.text:004393AC
.text:004393AC loc_4393AC:
.text:004393AC call sub_4315D0
.text:004393B1 test al, al
.text:004393B3 setz al
.text:004393B6 cmp byte_4BD143, 0
.text:004393BD mov byte_4BCE60, al
.text:004393C2 jnz short loc_4393CD

То есть программа вызывает процедуру инициализации нашей переменной, если переменные byte_4BD143 или byte_4BCE60 не равны 0. Как ни странно, byte_4BD143 не заметно где изменяется, а byte_4BCE60 изменяется чуть выше, в зависимости от версии
(Там вызывают glGetString(GL_VERSION) с результатом у меня, и проверяют 3-й байт. У меня, например, функция выдает строку «1.3.1072 WinXP Release»).

Всю эту информацию я донес до разработчика. Через 15 минут он выложил исправленную версию. Поигрался... игрушка хорошая, но искать в ней багу намного интереснее чем в нее играть :-)

3 комментария:

  1. ай молодца!
    каешно решать головоломки интересно... особенно если они решаются и при том достаточно просто. я тоже так люблю. дада

    ОтветитьУдалить
  2. это да, я честно говоря, сам пытался переделать так чтобы оно работало - не вышло :-(. Надо было глубже вникать как оно работает.

    ОтветитьУдалить