Анализ защиты программ и рекомендации по её усилению::Журнал СА 10.2003
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

Разбор полетов  

Ошибок опыт трудный

Как часто мы легко повторяем, что не надо бояться совершать ошибки, мол,

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6128
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6839
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4122
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 2971
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3776
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3784
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6273
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3129
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3427
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7242
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10612
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12331
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 13964
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9095
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7049
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5356
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4587
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3397
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3123
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3376
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 2996
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 Анализ защиты программ и рекомендации по её усилению

Архив номеров / 2003 / Выпуск №10 (11) / Анализ защиты программ и рекомендации по её усилению

Рубрика: Безопасность /  Угрозы

СТАНИСЛАВ ГОШКО

Анализ защиты программ и рекомендации

по её усилению

Для того чтобы защитить программы от взлома, необходимо знать, против чего мы боремся. Будем считать, что мы являемся разработчиком программного обеспечения и нам противостоит взломщик среднего уровня. Почему среднего? Да потому, что если взломщик выше среднего уровня, то будет очень сложно создать защиту для программы, которую он бы не взломал (если не невозможно).

В большинстве своём крэкеры используют следующий инструментарий:

  • отладчики (SoftICE, TRW, Turbo Debugger, ...)
  • дизассемберы (IDA, W32 Dasm, Sourcer, ... )
  • шестнадцатиричные редакторы (Hiew, Hex Workshop, ...)
  • мониторы (FileMon, RegMon, ...)

Теперь рассмотрим, как в основном взламываются обычные программы на конкретных примерах.

Winzip 8.0

Загрузить SoftICE, поставить точку прерывания на GetDlgitemTexta, затем заполнить поля формы Winzip (name, serial_number; заполнить чем угодно) и нажать OK. Появится окно SoftICE, там поставить точку прерывания на 0167:00407AAB и посмотреть данные.

  • bpx GetDlgItemTextA
  • bpx 0167:00407AAB
  • d eax
  • В окне данных будет серийный номер, сгенерированный по вашему имени.

Hexworkshop 2.54

Ставим точку прерывания на GetWindowTexta, затем ставим точку прерывания по адресу 0167:004262AF. Трассируем без вхождения (F10) до второго перехода jnz. Этот второй переход выполняться не хочет, изменяем флаг нуля (в окне регистров наводим на Z и нажимаем INS).

Теперь убираем все точки прерывания:

bc *

и закрываем SoftICE – F5.

Вводим имя и фирму, на которую хотим зарегистрироваться. Вот и всё.

Winamp 2.xx

  • bpx hmemcpy
  • Вводим serial.
  • Всплываем в SoftICE.
  • Видим что-то вроде:

cmp eax, esi

два раза клацаем на эту строку, жмём F5.

  • ? eax (там и хранится регистрационный код).
  • Убираем точки прерывания, выключаем SoftICE.

Irfanview 2.0

Данная программа была препарирована за 5 минут, а делалось это так:

  • Устанавливаем точку прерывания в SoftICE на MessageBoxA:

bpx MessageBoxA

  • Всплывя в Irfan, мы видим кучу разных сравнений и несколько переходов. Моё внимание привлекла функция Kernel32, заполнив форму, я нашёл на неё переход и увидел, что переход находится по адресу:

0167:00440347 jnz 00440375

  • Исправляем флаг нуля в окне регистров и жмём F5, вуаля – мы зарегистрированы.

P.S. Можно было в HIEW заменить этот переход на jz.

mIRC v. 6.01

Загрузить SoftICE, поставить точку прерывания на MessageBoxA.

bpx MessageBoxA

Затем заполнить поля формы и нажать «ОК». Появится окно SoftICE. Выйдем из User32.dll и затем проанализируем код, предшествующий сообщению об ошибке.

Выше вызова MessageBoxA я натолкнулся на следующий вызов функции:

push 0056d737    ; Помещается в стек смещение серийного номера

push 0056d350    ; Помещается в стек смещение имени

call 004c37b1    ; Вызов функции, которая проверяет корректность

test eax,eax     ; Проверка результата функции

jz   004c3ce1    ; !!!!!!!!!!!!!

Команду условного перехода необходимо либо обратить (jnz 004c3ce1), либо забить nop.

Адрес инструкции условного перехода следующий: 004с3с24.

Customiser

Данная программа работает определённое количество времени и потом сообщает о том, что время её использования кончилось. И больше работать не хочет – это выражается в том, что пропадает кнопка «Continue».

Начнём наше исследование с того, что взглянём, какие функции данная программа импортирует. Нас особо будут интересовать функции из USER32.dll, так как диалог, на котором была кнопка «Continue», импортируется скорее всего оттуда. Мое внимание привлекла функция – DialogBoxParamA.

Загружаем SoftICE и ставим брейкпоинт на эту функцию:

bpx DialogBoxParamA

После этого запускаем программу и сразу же всплывёт SoftICE в недрах USER32.dll, и мы поднимемся из этой функции (нажатием F12).

Протрассируем до адреса 41f8c4, и там мы заметим подозрительный условный переход, следом за которым идёт ещё один. Второй переход указывает на вызов функции EnableWindow. Становится ясно, что нам нужно перейти по этому переходу. Для этого мы инвертируем флаг нуля в SoftICE и нажимаем F5, что возвращает управление программе, и мы видим, что программа заработала.

Теперь мы должны пропатчить её. Запускаем HIEW, переходим по адресу 41f8c4 и меняем байты «75 03» на «EB 18».

После этого снимем брейкпоинт в SoftICE.

bc *

Запустим программу, нажмём кнопку «Exit», и программа не завершится, а, наоборот, запустится. Но по-прежнему будет постоянно появляться это мерзкое окно с сообщением, что время твое прошло. Поэтому мы попытаемся избавиться от него. Найдём вызов функции рисования данного окна. Получится адрес 41f89c, и там будет вызов подпрограммы из 3 байт, которые перезапишем 3 nop («90»).

Перезаписывать будем при помощи HIEW.

Вот полная информация о проведённых изменениях:

41f89c: 90 90 90

41f8c4: EB 18

После этого программа будет запускаться без всяких окон.

Существует ещё один способ продления лицензии без изменения программы. Нужно перед её установкой установить дату в системе лет на 20 вперёд, а после установки вернуть старую дату.

Shadow Security Scanner 5.37

Эта программа – один из лучших сетевых сканеров безопасности. Она имеет ограничение по времени на использование (trial).

Метод, который применялся при взломе Customiser, не работает потому, что окно создаётся функцией CretaeWindowExA, это всё несколько усложняет.

Но можно пойти другим путём. Трассировать программу без вхождения в подпрограммы, пока не появится окно, уведомляющее, что время программы закончилось.

Нужно запомнить адрес подпрограммы, в которой выводится данное сообщение, и заглянуть туда. Там мы можем заметить какое-то странное сравнение:

cmp [ebx+14],0

После этого переход, если не равно нулю. Поиграем с флагом нуля, и что мы видим – программа заработала, осталось только её пропатчить:

593598: EB

Вот и всё, защита с программы снята.

Как мы можем видеть, взлом программы чаще всего отталкивается от перехвата  WIN API-функций. Как можно этому противостоять?

Существует несколько методов:

Написание и использование своих функций с переходом куда-нибудь в середину WIN API-функции

Рассмотрим написание своих функций на примере функции GetWindowTextA.

Как устанавливается прерывание отладчика на имя функции? Вставляется байт «CC» перед первой инструкцией функции. Но мы ведь можем сделать так, что на этот первый байт инструкции управление никогда и не будет передано. Вы спросите, как это сделать?

Давайте рассмотрим, как начинается данная функция:

77d5c13a:  push   0c

77d5c13c:  push   77d6e498

77d5c141:  call   77d439c0

Так начало функции выглядит у меня. Каждому необходимо посмотреть на её начало под отладчиком самому:

  • Загрузить SoftICE
  • Ctrl + D ( Всплываем в SoftICE)
  • u GetWindowTextA

Теперь давайте разберёмся, как выглядит вызов нашей функции в программе в общем виде:

           push   xxxxxxxx

           ................

           push   xxxxxxxx

           call   GetWindowTextA

Причём при вызове GetWindowTextA идёт переход по адресу 77d5c13a. Мы же можем сделать следующим образом:

           push   xxxxxxxx

           ................

           push   xxxxxxxx

           push   return_address

           push   0c

           jmp    (GetWindowTextA+2)

Данный метод позволяет защититься от точки прерывания в SoftICE такого вида:

bpx GetWindowTextA

Так же можно сделать следующим образом:

           push   xxxxxxxx

           ................

           push   xxxxxxxx

           push   return_address

           push   0c

           push   77d6e498

           jmp    (GetWindowTextA+7)

И таких вариантов существует достаточно много.

В оптимальном варианте применения данной техники нужно написать дизассемблер длин и подключить его к программе таким образом, чтобы он формировал вызовы функций, копируя некоторые инструкции из них в тело программы.

Это позволит ещё более обезопасить программу от перехвата WIN API-функций.

Подсчёт контрольной суммы WIN API-функций

Данный метод мне ещё нигде не встречался, и хочется верить, что его идея принадлежит мне.

Он заключается в том, что перед вызовом необходимой WIN API-функции подсчитывается её контрольная сумма и сверяется с той суммой, которая хранится в программе. Как вы помните, при установленной точке прерывания на место первой инструкции записывается байт «СС» (int 3), который и изменяет контрольную сумму данной функции. При проверке контрольной суммы данной функции и определении отладки можно выйти из программы.

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

Ну естественно, что это ограничит круг операционных систем и их версий, но между двух зол выбирают меньшую.

Обнаружение отладчика и завершение программы

Все отладчики подсистемы семейства Windows делятся по уровням:

  • ring 3 (уровень приложения)
  • ring 0 (уровень ядра)

В основном все отладчики, кроме SoftICE, относятся к отладчикам уровня приложения и против них существует множество методов, которые мы сейчас и рассмотрим:

Использование WIN API-функции IsDebuggerPresent

Использовать её довольно легко:

        if (!IsDebuggerPresent()) goto no_debugger

        //........................................

no_debugger:

Или вот её полный код:

                 mov    eax,fs:[018h]

                 mov    eax,[eax+30h]

                 movzx eax,byte ptr [eax+02]

           ret

Погибель отладчику несут операции с SEH

Нужно установить свой обработчик ошибки, а после вызвать ошибку попыткой записи в ядро.

Вначале нам необходимо сохранить оригинальный обработчик SEH:

                   push    dword ptr fs:[0]

Теперь нам необходимо заменить оригинальный обработчик на свой:

           push    offset SEH_Handler

    mov     fs:[0],esp

Восстановление оригинального обработчика в нашем случае будет производиться следующей инструкцией:

           pop     dword ptr fs:[0]

Данная инструкция восстанавливает из стэка оригинальный обработчик SEH.

А теперь рассмотрим программу, которая обрушивает отладчик, а без отладчика работает:

.386p

.model     flat                           

extrn            ExitProcess:PROC

.data

Hi         dd     0

.code

;--------------------------------------------------------;

start:

           pop    ebx          ; Адрес для вызова исключения

           call   setupSEH                                                                                                                 

Ex_Handler:

           mov    esp,[esp+8]  ; Ошибка дает нам старый ESP в [ESP+8]

exit:

           push   0            ; Кладём в стэк 0

           call   ExitProcess  ; И завершаем программу 

;--------------------------------------------------------;

setupSEH:

           push   dword ptr fs:[0]    ; Push оригинальный обработчик SEH

           mov    fs:[0],esp          ; И помещаем новый  (который находится после первого call)

           mov    eax,012345678h      ; Пытаемся писать в ядро (что вызовет

           xchg   eax,[ebx]           ; исключение)

end start

После того, как мы научились противодействовать отладчикам уровня приложения, не мешало бы научиться бороться с SoftICE.

Победить правильно настроенный SoftICE практически невозможно, но дело в том, что в 90% он не настроен должным образом.

1) Стандартным методом является использование следующего кода:

           push   ss

           pop    ss

           int    3

При попадании на инструкцию int 3 взломщик попадёт внутрь обработчика и будет там вдали от защитного механизма программы.

2) Следующий код эффективно использовать для модификации ключа расшифровки:

           mov    ebp,"BCHK"

           push   ss

           pop    ss

           int    3

           db     blabla ; Опкод модифицирующий ключ декриптования

3) Разработчики SoftICE оставили возможности для определения его присутствия, которыми мы и воспользуемся для защиты своей программы от SoftICE.

Необходимо всего лишь открыть следующие файлы, если они открываются, значит, SoftICE присутствует на данной машине. В обратном быть уверенным нельзя.

Список файлов:

  • «\\.\NTICE»
  • «\\.\SIWVIDSTART»
  • «\\.\SICE»
  • «\\.\SIWVID»

Ну вот с отладчиками и закончили.

Дизассемблеры

Перейдём к дизассемблерам, которые позволяют анализировать код без его исполнения. Чтобы им противостоять, оптимальным вариантом считается шифрование критических участков программы. Также определённое распространение получила техника под названием «перекрывающийся код». Рассмотрим листинг:

           mov    eax,04ebh

           jmp    $-4

next:

Что же делает выделенная восклицательными знаками часть кода?

  • В eax помещается значение 04ebh(это опкод команды jmp $+4)
  • jmp $-4, переходит на значение 04ebh
  • jmp $+4, переходит на метку next

Таким образом, можно строить сколь угодно сложный перекрывающийся код. Ещё в перекрывающемся коде есть один большой плюс, с его помощью можно прятать неприятные для кодоанализаторов инструкции.

Защита от изменения кода

Многие программисты видели так называемые патчи (заплатки) для программ, которые сводят суть защиты программы на нет. Как же с этим бороться?

Существуют два метода защиты:

  • Шифровать при помощи контрольной суммы критического места программы важные данные.

При этом если даже защита будет снята, программа будет работать некорректно. И это сведёт попытки взломщика на нет. А для полноценного взлома такого вида защиты нужно будет полностью разобраться в алгоритме, что доступно далеко не каждому взломщику.

  • Использование помехозащищённого программирования.

Смысл данной техники заключается в том, что программа сама восстанавливает изменённые в своём коде байты. Существует множество методов реализации данной схемы.

Мониторы

Мониторам противодействовать практически невозможно, поэтому при построении защиты для программы необходимо свести обращения к файлам и реестру либо к минимуму, либо к максимуму.

Первый способ скрывает защитный механизм внутри программы. А второй запутывает своими обращениями к различным файлам.

Надеюсь, данный материал поможет вам достойно ответить на вызов крэкеров.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru