Сложная модульная структура Технологическое разнообразие Native и Managed модули Mixed code Особенности современного ПО
Внедрение Managed кода в современные ОС Microsoft Windows:.NET Framework Java Linux Java Mono Мобильные платформы Java.NET Framework Mono
Важность анализа ПО без исходного кода Доступ к исходным кодам часто ограничен Влияние настроек и особенностей компилятора на фактически исполняемый на процессоре код
Средства реверс-инжиниринга Hex Rays IDA Pro (Managed и Native) Red Gate.NET Reflector (Managed) JetBrains dotPeek (Managed) WinDBG Многое другое
Современные подходы к анализу ПО Метод белого ящика Метод черного ящика Метод серого ящика
Классический подход к анализу ПО методом серого ящика. Дизассемблеры. Дизассемблеры Hex Rays IDA Pro – Managed и Native код dumpbin (Microsoft Windows SDK) – Native код Ildasm – Native код Другие
Декомпиляторы Red Gate.NET Reflector – Managed код JetBrains dotPeek – Managed код Другие Полная декомпиляция Native кода в высокоуровневый программный код на данный момент не реализована. Имеются лишь механизмы частичного восстановления структуры алгоритмов. Классический подход к анализу ПО методом серого ящика. Декомпиляторы.
WinDBG – Managed и Native OllyDBG - Native Другие WinDBG с применением расширения SOS. Отладка производится в режиме ассемблера..NET Reflector предоставляет возможность отладки в Visual Studio. Классический подход к анализу ПО методом серого ящика. Отладчики.
SusinternalsSuite Procexp Procmon Portmon Другие Классический подход к анализу ПО методом серого ящика. Средства мониторинга.
Пример дизассемблированного Native кода
Пример дизассемблированного Manged кода
Пример декомпилированного Managed кода
Сравнение Дизассемблированные листинги в общем случае менее удобны для анализа Дизассемблированные листинги дают большую полноту понимания процесса выполнения ПО
Mixed код! Дизассемблирование.
Современное ПО Native модули Managed модули Mixed код
Некоторые особенности Managed кода Генерируемый JIT-компилятором код так же является динамически создаваемым объектом и располагается в куче.
Страницы памяти Managed кучи имеют RWX атрибуты
В режиме Run-Time код и данные могут размещаться по адресам, выбранным JIT компилятором Код CIL функции можно обнаружить по базовому адресу загрузки модуля + смещение функции
IL код функции main в Ida Pro (сверху) и снятый с дампа в WinDBG (внизу)
Заключение Современное ПО: Native код Managed код Mixed код (компилятор Microsoft Visual C++) #include #pragma managed #pragma unmanaged
Заключение JIT компилятор выбирает адреса размещения компилированных функций самостоятельно Управляемая куча имеет атрибуты RWX IL код модуля можно найти по базовому адресу загрузки + смещение функции
Заключение Различия в интерпретации результатов работы дизассемблеров и декомпиляторов Смешивание Native и Managed модулей в рамках даже одного проекта Mixed код в некоторых модулях Важно развитие средств анализа программного обеспечения, способных обрабатывать не только Native или Managed, но и Mixed сборки. Результаты интерпретации должны иметь гомогенную структуру.