- •Методы защиты программного обеспечения и способы их обхода.
- •Классификация систем защиты программного обеспечения. Классификация по методу установки, по используемым механизмам защиты, по принципу функционирования.
- •Упаковщики/шифраторы. Достоинства и недостатки.
- •Форматы исполняемых файлов. Формат Portable Executable. Relative Virtual Address.
- •Форматы исполняемых файлов. Формат Portable Executable. Поле ImageBase структуры image_optional_header. Настройка адресов. Секция .Reloc.
- •Стандартный механизм импорта
- •Форматы исполняемых файлов. Формат Portable Executable. Секция .Export. Как работает механизм экспортируемых функций?
- •Виды точек останова в отладчике. Алгоритм работы точек останова.
- •Антиотладочные приёмы. Использование функции IsDebuggerPresent и защита от неё.
- •Антиотладочные приёмы. Использование функции FindWindow и защита от неё.
- •Антиотладочные приёмы. Использование функций Proccess32First и Process32Next и защита от них.
- •Антиотладочные приёмы. Обнаружение отладчика по имени процесса и защита от данного приёма.
Виды точек останова в отладчике. Алгоритм работы точек останова.
То́чка остано́ва (англ. breakpoint) — это преднамеренное прерывание выполнения программы, при котором выполняется вызов отладчика (одновременно с этим, программа сама может использовать точки останова для своих нужд).
Виды
- Программная точка останова - Это самая обыкновенная точка останова (BPX)
- Аппаратная -
DR0-DR3 -- задают четыpе линейных адpеса контpольных точек по адpесам,
котоpые фоpмиpуются текущей пpогpаммай. Эти pегистpы отладки сpавниваются с
каждым адpесом выполненяемой команды и пpи pавенстве генеpиpуется особый
случай.
К pегистpам отладки также относятся D6 -- pег. состояния отладки, D7 -- pег.
упpавления отладкой.
Имеем 4 pег. отладки обеспечивающие 4 независимые контpольные точки,
котоpые позволяют pегестpиpовать пеpеключение на конкpетную задачу, установка
контpольных точек по адpесам ПЗУ и фиксиpовать модификацию значений пеpеменных в
памяти.
- по памяти - Данный вид точек останова модифицирует свойства страниц памяти, которым принадлежит область, на которую вешается (BPM)
Антиотладочные приёмы. Использование функции IsDebuggerPresent и защита от неё.
Функции не передаётся никаких параметров, в ответ она говорит, запущен процесс под отладчиком (EAX = 1) или нет (EAX=0). Функция экспортируется из модуля kernel32.dll
Внутренности функции
MOV EAX, DWORD PTR FS:[18] ; EAX = offset TIB
MOV EAX, DWORD PTR DS:[EAX+30]; EAX = offset PEB
MOVZX EAX, BYTE PTR DS:[EAX+2]; EAX = Peb.BeingDebugged
Переменная влияет на многие механизмы, один из которых - отладочный вывод. Функция DbgPrint() проверяет это поле, если оно обнулено сообщение доставляется отладчику ядра, иначе генерируется исключение DBG_PRINTEXCEPTION_C(0x40010006), которое обрабатывает пользовательский отладчик. Это позволяет локально обрабатывать отладочный вывод(например посредством VEH перенаправить его в консоль).
Защита от обнаружения
Вручную изменить на 0. Или использовать плагины для OllyDbg - например HideDbg
Антиотладочные приёмы. Использование функции FindWindow и защита от неё.
Функция FindWindow разыскивает данные о дескрипторе окна верхнего уровня, чье имя класса и имя окна соответствуют определенным строкам. Эта функция не ищет дочерние окна.
Синтаксис
HWND FindWindow
(
LPCTSTR lpClassName, // указатель на имя класса
LPCTSTR lpWindowName // указатель на имя окна
);
Параметры
lpClassName
Указывает на строку с нулевым символом в конце, которая определяет имя класса или - атом, который идентифицирует строку имени класса. Если этот параметр - атом, он должен быть общим атомом, созданным предыдущим вызовом функции GlobalAddAtom. Атом - это 16-разрядное значение, в котором должно быть помещено в младшем слове lpClassName; старшее слово должно быть нулевое.
lpWindowName
Указывает на строку с нулевым символом в конце, которая определяет имя окна (заголовок окна). Если этот параметр - ПУСТО (NULL), полное соответствие имени окна.
Возвращаемые значения
Если функция завершилась успешно, возвращаемое значение - дескриптор окна, которое имеет определенное имя класса и имя окна. Если функция терпит неудачу, возвращаемое значение - ПУСТО (NULL). Чтобы получить дополнительные данные об ошибках, вызовите GetLastError.