- •Модульная архитектура технических средств защиты по от несанкционированного использования
- •Функционирование подсистем и модулей системы защиты по от несанкционированного использования
- •Электронные ключи hasp
- •Глава 1. Методы и средства обратного проектирования.
- •1.1. Понятие обратного проектирования
- •1.2. Основные приемы, используемые злоумышленником при отладке и дизассемблировании программного обеспечения
- •1.2.1. Специфика атак на модули проверки корректности ключевой информации
- •1.2.2. Специфика атак на модули проверки истечения временного срока работы программы или ограничения по количеству ее запусков
- •1.2.3. Отлов злоумышленником вызова WinApi функций при взломе по
- •1.3. Мониторинг событий
- •Глава 2. Методы противодействия обратному проектированию
- •2.1. Методы противодействия отладчикам
- •2.1.1. Защита от отладчиков реального режима
- •2.1.2. Защита от отладчиков защищенного режима
- •2.1.3. Методы, основанные на невозможности полного эмулирования отладчиком среды загрузки программы
- •2.2. Методы противодействия дизассемблированию программного обеспечения
- •2.3. Защита, основанная на человеческом факторе злоумышленника
- •Глава 3. Общие методы защиты программ от отладки и дизассемблирования
- •3.1. Использование недокументированных команд и недокументированных возможностей процессора
- •3.2. Шифрование кода программы
- •Глава 4. Эмуляторы процессоров. Использование эмуляторов для взлома и защиты программного обеспечения.
- •Глава 5. Защита исходных текстов программного обеспечения
- •Глава 6. Идентификация и аутентификация субъектов
- •6.1. Идентификация и аутентификация пользователей с использованием технических устройств
- •6.2. Идентификация и аутентификация с использованием индивидуальных биометрических характеристик пользователя
- •7. Защита от разрушающих программных воздействий
- •7.1. Понятие разрушающего программного воздействия
- •7.2 Модели взаимодействия прикладной программы и рпв
- •7.3 Компьютерные вирусы как класс рпв
- •7.4. Защита от рпв. Изолированная программная среда
- •Глава 8. Руководящие документы России
- •Приложение
- •6.1. Отладка программ в отладчике SoftIce
- •6.2. Дизассемблирование программ с помощью интерактивного дизассемблера Ida Pro
- •6.3. Редактор кода hiew
- •Лабораторные работы
2.2. Методы противодействия дизассемблированию программного обеспечения
Дизассемблирование машинного кода злоумышленником проблематично даже в том случае, когда противодействие ему не предусмотрено в связи с тем, что данные и код находятся в одном адресном пространстве. В связи с этим, задача автоматической идентификации какого-то участка программы как данных или как кода довольно сложна и неоднозначна: программист может использовать код как данные или наоборот.
Выделяют несколько общих подходов к защите ПО от дизассемблирования.
1. Шифрование кода. Защищаемый участок кода шифруется каким-либо алгоритмом, а в программу добавляется модуль расшифровки, который в нужный момент расшифровывает его и передает ему управление. В данном случае, защищаемый участок кода перед дизассемблером предстанет в зашифрованном виде, и будет воспринят дизассемблером неверно. Перед злоумышленником в данном случае предстанет просто «мусор».
Этот метод при неправильном использовании достаточно уязвим, ввиду того, что алгоритм расшифровки доступен взломщику, необходимо лишь найти его и произвести расшифровку. Поэтому, шифрование должно производиться на секретном ключе, который доступен только легальному пользователю и никому другому. Хранение ключа в программе или в каком-нибудь файле на диске сводит данную защиту на «нет».
2. Самомодификация кода программой. В данном случае, средства статического исследования ПО также не смогут верно воспринять участки кода, модифицируемые в процессе работы программы, ей самой. Следует отметить, что самомодифицироваться программы могут только при работе процессора реальном режиме (не в защищенном).
3. Различные ходы, приводящие к обману дизассемблера. Этот способ заключается в том, чтобы с помощью различных «хитрых» ходов запутать дизассемблер, подсунув данные вместо кода, или дизориентировать его логику, повести его по ложному следу. В качестве примеров такой защиты можно привести следующие участки кода.
Пример 2.1.
00000000: B83534 Mov ax, 03435; “45”
00000000: EBFC jmps 00000001
……дальнейший код.
После выполнения данных инструкций, дальнейший код программы, воспринятый дизассемблером будет совершенно неверен., так как программа перейдет на инструкцию 3534EB, что соответствует команде xor ax, 0EB34h. На самом же деле программой выполняется следующий код.
Mov ax,03435
Xor ax,0EB34 <- инструкция дизассемблером пропущена.
…… дальнейший код.
Пример 2.2.
Labellone: |
Mov ax, 0CEBh |
|
Jmp labellone+1 |
|
Db 1,2,3,4,5,6,7,8,9,0 |
|
Mov ax,1234h |
|
Ret |
Данная защита аналогична примеру 2.1.
Существуют и чисто психологические способы защиты, которые сбивают с толку не дизассемблер, а человека, анализирующего текст программы после дизассемблирования. Например, обмен векторов прерываний 21h и 10h, или обращение к порту 378h как к 8378h.
4. Сокрытие команд передачи управления.
Сокрытие команд передачи управления приводит к тому, что дизассемблер не может построить граф передачи управления. Например, можно модифицировать адреса переходов в ходе выполнения программы (только для реального режима).
Пример 2.3.
Mov word ptr cs:m[1],1234h; |
модификация адреса перехода |
…… |
|
m: jmp place |
вместо метки place ранее внесен другой адрес |
…… |
|
Пример 2.4.
mov word ptr cs:m[1],es; |
модификация адреса вызываемой подпрограммы |
mov word ptr cs:m[3],5678h |
|
…… |
|
m: CALL far 0000h |
данный адрес перехода был ранее модифицирован |
…… |
|
В данном случае, злоумышленник анализируя дизассемблированный текст, видит не действительные адреса переходов, а те, которые были до модификации кода.
5. Использование методики косвенной передачи управления также затрудняет анализ дизассемблированного кода.
Mov bx,1234h
Jmp dword ptr cs:[bx]
6. Использование нестандартных способов передачи управления.
В данном случае, для затруднения изучения дизассемблированного кода, разработчиком ПО могут использоваться нестандартные способы передачи управления по каким либо адресам. Разработчик может, например, моделировать работу операторов JMP, CALL, INT … средствами других операторов, что затрудним понимание листинга на языке ассемблера. Примеры возможных альтернативных записей команд передачи управления приведены в таблице 2.1.
Таблица 2.1. Примеры возможных альтернативных записей команд передачи управления
Первичный код |
Альтернативный код |
… jmp m … m: … |
Mov ax, offset m Push ax Ret … m: |
… call subr m: … subr: … ret |
Mov ax, offset m Push ax Jmp subr m: … subr: … ret |
… int 13h |
… pushf; флаги в стек push cs mov ax, offset m push ax; занести в стек адрес возврата xor ax,ax mov es,ax jmp dword ptr es:[13h*4] m: …
|
… ret |
… pop bx jmp bx |
Iret |
Mov bp,sp Jmp dword ptr [bp]; переход на точку возврата из прерывания … add sp, 4; точка возврата popf |
7. Использование ссылок вида [EAX+0ffffff64h] (в качестве эквивалента [EAX-9Ch]) с целью затруднения анализа дизассемблированных текстов человеком.
8. Можно сделать короткий переход вперед, а между командой перехода и адресом перехода встроить мусор. В данном случае, можно добиться совершенно неверного результата дизассемблирования.