Техника отладки Крис Касперски ака мыщъх Спецвыпуск: Хакер, номер #057, стр. 057-020-1 Как правильно отлаживать программы без исходных кодов Практически все знают, что программы взламываются отладчиком, но не все знают, как именно. На самом деле ничего сложного в этом нет - достаточно выучить несколько простых приемов работы с ним, и уже можно начинать ломать. Введение в отладку Дебаггер - невероятно мощный инструмент взломщика, однако к нему нужен свой подход. Большинство начинающих хакеров начинают отлаживать программу с точки входа и в итоге умирают в цикле выборки сообщений. Пошаговое исполнение программы (также называемое трассировкой) - слишком трудоемкий и крайне неэффективный процесс. Событийно-ориентированные (то есть практически все виндовые) приложения так не отлаживаются. Допустим, мы трассируем MFC-программу: доходим до вызова AfxWinMain и оказываемся глубоко внутри MFC42.DLL, откуда и должен вызываться весь пользовательский код, однако прежде чем трассировка доберется до него, мы успеем состариться! Но отлаживать программу целиком совершенно не обязательно! Опытные хакеры трассируют только отдельные части защитного кода. Как мы найдем их в миллионах машинных инструкций исполняемого файла? Существует множество методик: точки останова, раскрутка стека, перекрестные ссылки, условная трассировка, прямой поиск паролей/серийных номеров в памяти и т.д. Расскажем обо всем этом поподробнее. Испытания мы будем проводить над программой Drive LED от компании O&O Software, ее 30-дневную демонстрационную версию можно скачать с сайта www.oo-software.com/en/download/index.shtml. Дизассемблер и отладчик в одной упряжке Дизассемблер содержится в каждом отладчике (мы же не собираемся отлаживать программу непосредственно в машинном коде, верно?), но те дизассемблеры, что находятся внутри SoftIce или OllyDbg, слишком примитивны. ИДА (IDA Pro) намного мощнее. Она автоматически распознает имена библиотечных функций, определяет типы локальных переменных и делает множество других полезных вещей, в частности, позволяет комментировать листинг и назначать символьные метки для инструкций и данных. Исследовать защищенные программы с ее помощью - настоящее удовольствие. Однако без дебаггера все равно никак. Вызовы типа call [ebx+64h] в дизасм-листинге приводят хакеров в бешенство, особенно если функция вызывается все время с разным EBX. На выяснение значения этого регистра в дизассемблере можно ухлопать целый день, а в отладчике просто "подсмотрел" его - и все! Или вот вызывается что-то по адресу 77E92B8D, лежащему где-то внутри операционной системы (при дизассемблировании дампов памяти такие адреса встречаются сплошь и рядом). В отладчике достаточно просто дать команду "u 77E92B8D", и мы тут же увидим, что это CreateFileA. Бессмысленно спорить, кто круче: отладчик или дизассемблер. Эти инструменты взаимно дополняют друг друга. Реконструкцию алгоритмов лучше поручить дизассемблеру, а все непонятные места уточнять в отладчике. Загрузка символов в дебаггер осуществляется довольно неочевидным образом, на котором спотыкаются многие начинающие. Последовательность действий должна быть такой: |