На форуме 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 минут он выложил исправленную версию. Поигрался... игрушка хорошая, но искать в ней багу намного интереснее чем в нее играть :-)
ай молодца!
ОтветитьУдалитькаешно решать головоломки интересно... особенно если они решаются и при том достаточно просто. я тоже так люблю. дада
это да, я честно говоря, сам пытался переделать так чтобы оно работало - не вышло :-(. Надо было глубже вникать как оно работает.
ОтветитьУдалитьНе верю своим глазам!!!
ОтветитьУдалить