Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Обратная инженерия

Антон Hex Кукоба (xtin@ua.fm)

Спецвыпуск: Хакер, номер #057, стр. 057-012-2


Кажется, это все. Let's get it started!

Анализ существующей информации

Итак, основная задача реверсера - разобраться в том, как работает чужой код. Чтобы сделать это быстрее, мы должны получить как можно больше сведений об исследуемом продукте, поэтому в первую очередь лезем на посвященный ему сайт. Там наверняка есть информация о технологиях, задействованных в программе. Например, описан способ шифрования, вынесены благодарности каким-нибудь компаниям за библиотеки и т.д. Какой именно протектор использовался, конечно же, не скажут. Однако, опять же, реверсинг - это не борьба с защитой, а самостоятельное исследование кода.

Программисты – люди, как правило, ленивые и рациональные, поэтому они очень любят использовать готовый код. А где обычно берут готовый код? Правильно, на SourceForge и иже с ним. Реверсер обязательно должен ознакомиться с библиотеками, которые использовались в исследуемой части программы, чтобы иметь о каждой из них хотя бы общее представление. Множество платных библиотек можно найти на варезных сайтах или в p2p-сетях. Но если уж так "повезло", программисты написали все сами и ничьим кодом не пользовались, или код был куплен, и его невозможно добыть из интернета на халяву, то есть другой путь - посмотреть, как реализованы аналогичные программы. Как ни причудлива человеческая фантазия, но схожие задачи люди обычно решают одинаково. Возьмем, к примеру, два менеджера закачек - reget и flashget. Ну и что? Разницу между ними можно найти только на высоком уровне, а внизу одни и те же API WinInet. А если тебе нужно разобраться с продуктом, написанным на VC, и у него есть аналог на Delphi. Ковыряй последний, потому что исследовать Delphi всегда проще.

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

Реверсинг невозможен без знания того, как компилятор реализует те или иные конструкции языка высокого уровня. Поэтому если попадается программа, написанная на каком-нибудь малораспространенном компиляторе, сначала нужно изучить компилятор, сделать сигнатуры для IDA с его библиотек. Сигнатуры - это шаблоны кода функций, позволяющие IDA находить и именовать библиотечные функции внутри файлов. Поэтому стоит сделать сигнатуры и для библиотек, которые используются в исследуемом продукте, чтобы распознать их части в коде. Это сократит время анализа в несколько раз, поскольку не придется анализировать библиотечные функции. Для создания собственных сигнатур есть набор инструментов FLAIR, идущий с IDA. Только после этого стоит переходить к следующему этапу.

Дизассемблирование

Поиск информации в коде

Первым делом определим компилятор. Самый простой способ сделать это - применить все сигнатуры. Тогда по функциям из той или иной библиотеки все сразу станет ясно. Можно просто поискать оставленные компилятором следы вроде строк "Borland" и "Microsoft".

Назад на стр. 057-012-1  Содержание  Вперед на стр. 057-012-3