ООА cpp 02 - реверс-инжиниринг.ppt
- Количество слайдов: 10
Реверс-инжиниринг программного кода Программирование
Способы документирования Документирование Текстовое описание программных интерфейсов Блок-схемы Отдельный документ Алгоритм Текст на основе требований Текст Комментарии в коде по структуре Руководство по использованию UML Комментарии в коде по алгоритму Программирование
Плохой исходный код Особенности: • плохо отформатирован • отсутствуют комментарии или они бессмысленны • имена переменных и пользовательских типов вводят в заблуждение • запутанная последовательность выполнения • дублирование кода • не работает или неэффективен Программирование
Плохой исходный код void sfm. LOG(LOGLEVEL log. Level, const c_string format, va_list args) { std: : string local. Format(format); String. Utils: : Replace( local. Format, "%ll", "%I 64" ); int i = 2048; char *foo = new char[ i ]; size_t l; while( l = _vsntprintf(foo, i, local. Format. c_str(), args) < 0 ) { delete[] foo; i = 1024; foo = new char[ i+1 ]; } for(log. Delegates. Set: : iterator di = log. Delegates. begin(); di != log. Delegates. end(); ++di) { (*di)(log. Level, foo, i); } delete[] foo; } Программирование
Хороший исходный код Особенности: • отформатирован в едином легко читаемом стиле • комментарии не избыточны, но помогают понять код • имена переменных и пользовательских типов прямо указывают на способ применения • алгоритм легко прослеживается визуально • дублирование кода сведено к разумному минимуму • работает Программирование
Хороший исходный код // общая функция для лога, принимающая уже готовый список параметров void sfm. LOG(LOGLEVEL log. Level, const c_string format, va_list args) { /* сформировать строку сообщения */ std: : string local. Format(format); // WIN: прежде чем формировать строку, нужно в формате заменить все %ll на %I 64 String. Utils: : Replace( local. Format, "%ll", "%I 64" ); /* узнаем размер получаемой в итоге строки */ // WIN: ничего лучше не работает под MS VC++ ): int str. Buff. Len = 2048; char *str. Buff = new char[ str. Buff. Len+1 ]; size_t message. Lenght; while( message. Lenght = _vsntprintf(str. Buff, str. Buff. Len, local. Format. c_str(), args) < 0 ) { delete[] str. Buff; str. Buff. Len += 1024; str. Buff = new char[ str. Buff. Len+1 ]; }// while new buff. . . /* отправляем готовую строку по делегатам */ for(log. Delegates. Set: : iterator di = log. Delegates. begin(); di != log. Delegates. end(); ++di) (*di)(log. Level, str. Buff, message. Lenght); /* чистимся */ delete[] str. Buff; }// sfm. LOG() Программирование
Анализ кода Этап 1. Визуальный анализ • • Свернуть до заголовков – получить структуру Переформатировать, если код сложно читается Найти «точку входа» Определить по косвенным признакам возможное назначение пользовательских типов, переменных, методов • Понять, что требуется для выполнения входных условий • Проследить, если необходимо, последовательность выполнения и алгоритм, заложенный в программу Программирование
Анализ кода Этап 2. Трассировка В процессе трассировки подтверждается или опровергается результат визуального анализа, выясняются новые подробности использования. Процесс трассировки удобнее организовать многоступенчатым. Желательно понять функциональность метода, не входя внутрь вызванных из него подпрограмм. Второстепенные подпрограммы можно исследовать отдельно и только в случае особой необходимости. Программирование
Анализ кода Этап 3. Зондирование – исследование через применение Процесс носит итерационный характер. Для каждой итерации: 1. Выделить объект исследования 2. Обеспечить входные условия 3. Изучить поведение (трассировка, ведение логов) 4. Изучить результат работы 5. Изменять входные условия и повторять с пункта 3 до тех пор, пока объект не будет изучен в достаточной для применения степени Программирование
Применение чужого кода 1. Создать свою обертку, подходящую в конкретной ситуации 2. Разработать собственное приложение Не рекомендуется вносить правки в работающий исходный код, либо они должны быть выполнены согласно принципам рефакторинга. Программирование
ООА cpp 02 - реверс-инжиниринг.ppt