Защита ПО от нелегального использования. Лабораторная работа 6 Защита программного обеспечения от нелегального использования по дисциплине Основы информационной безопасности
Скачать 0.88 Mb.
|
Министерство образования и науки Российской Федерации Санкт-Петербургский Политехнический Университет Петра Великого — Институт кибербезопасности и защиты информации ЛАБОРАТОРНАЯ РАБОТА № 6 «Защита программного обеспечения от нелегального использования» по дисциплине «Основы информационной безопасности» Выполнил студент гр. 4851001/10001 Сергеев К.Д. <подпись> Руководитель Малышев Е.В. <подпись> Санкт-Петербург 2022 1. Листинги реализованных программ до и после модификации До модификации #define _CRT_SECURE_NO_WARNINGS #include #include #include #define MAX 1000 bool control(char* request, FILE* file); int main() { char request[MAX]; FILE* file; file = fopen("password.txt", "r"); printf("Password:\n"); fgets(request, MAX, stdin); if (!(control(request, file))) { perror("Error!"); fclose(file); abort(); } printf("Cracked!"); getchar(); fclose(file); } bool control(char* request, FILE* file) { char f; int i = 0; while ((f = getc(file)) != EOF) { if (request[i] != f) { return false; } if (request[i] == '\0') { return false; } i++; } return true; } После модификации #define _CRT_SECURE_NO_WARNINGS #include #include #include #define MAX 1000 #define const 5 bool control(char* request, FILE* file); void Xor_cipher(char* request); int main() { char request[MAX]; FILE* file; file = fopen("password.txt", "r"); printf("Password:\n"); fgets(request, MAX, stdin); Xor_cipher(request); if (!(control(request, file))) { perror("Error!"); fclose(file); abort(); } printf("Cracked!"); getchar(); fclose(file); } bool control(char* request, FILE* file) { char f; int i = 0; while ((f = getc(file)) != EOF) { if (request[i] != f) { return false; } if (request[i] == '\0') { return false; } i++; } return true; } void Xor_cipher(char* request) { for (int i = 0; request[i] != '\n'; i++) { request[i] ^= const; } } 2. Пароль и примеры работы созданной программы Программа запрещает доступ пользователю при вводе неправильного пароля Поведение программы при вводе правильного пароля Поведение программы при вводе неправильного пароля 3. Найденные участки исполняемого кода, содержащие команды переходов, в дизассемблированном виде с указанием адресов команд В дизассемблере Hiew найдена команда, отвечающая за переход при проверке пароля. Команда условного перехода «jnz» меняется на команду безусловного перехода «jmps». Команда условного перехода Замена команды условного перехода командой безусловного перехода Поведение программы при вводе случайного пароля 4. Внесённые в ходе работы изменения и примеры работы тестовых программ с произвольным вводом пароля В Visual Studio был включён режим оптимизации кода Проводим повторные действия, описанные в п. 3 Замена команды условного перехода командой безусловного перехода Поведение программы при вводе случайного пароля Теперь добавим в программу функцию шифрования пароля и проделаем те же действия void Xor_cipher(char* request) { for (int i = 0; request[i] != '\n'; i++) { request[i] ^= const; } } Команда условного перехода Замена команды условного перехода командой безусловного перехода Поведение программы при вводе случайного пароля 5. Выводы по сравнению исходной и оптимизированной программ Так как в работе была использована оптимизация с приоритетом размера, то можно заметить, что размер исполняемого файла стал меньше и в дизассемблере отображается гораздо меньше инструкций. Это позволило чуть быстрее найти нужную инструкцию и изменить исполняемый файл так, чтобы при вводе случайного пароля программа разрешала доступ пользователю. 6. Программа Nag3.exe В программе каждые 10 секунд появляется всплывающее окно, не дающее пользователю дальше работать с текстом в окне. Приходится ждать некоторое время, чтобы нажать на кнопку «ОК» для закрытия всплывающего окна и продолжения работы с программой. Программа Nag3.exe Была найдена команда «jle», отвечающая за вызов «SetTimer». Она была заменена на «nop». В результате кнопка «ОК» становилась доступна для нажатия сразу же после появления всплывающего окна. Команда, отвечающая за вызов функции «SetTimer» Замена команды, отвечающей за вызов функции «SetTimer», командой «nop» (no operation) Поведение программы после проделанных изменений: всплывающее окно можно сразу же закрыть Также была найдена команда «call», отвечающая за вызов функции «SetTimer». После её замены на «nop» всплывающее окно больше не появляется. Команда, отвечающая за вызов функции «SetTimer» Замена команды, отвечающей за вызов функции «SetTimer», командой «nop» (no operation) Поведение программы после проделанных изменений: всплывающее окно не появляется 7. Программа Guard3.exe При попытке ввода произвольного пароля программа выводит окно с уведомлением о вводе неверного пароля. С помощью утилиты PEiD было установлено, что исполняемый файл был запакован с помощью UPX. Исполняемый файл был распакован с помощью утилиты PE Explorer. При попытке запустить программу в отладчике OllyDBG программа выдаёт окно об активном отладчике. Была найдена команда «je», отвечающая за проверку отладчика. Она была заменена на «jmp». Также были найдена команда «je», отвечающая за проверку длины вводимого пароля и команда «jne», отвечающая за проверку правильности вводимого пароля. Они также были заменены на «jmp». После внесённых в исполняемый файл изменений программа уведомляет о том, что пароль введён верно. 8. Обфускация программы Код исходной программы после обфускации: #include int funcA(int x){if(x==x++-1)x++;return x;}int main(){int counters=funcA('x');int A=3;if(A==3)A=4;int B=3;if(B==3)B=4;int C=3;if(C==3)C=4;printf("z");return 0;} Конфигурационный файл 9. Ответы на контрольные вопросы Какие методы применяются для защиты коммерческих программ от ввода некорректных учетных данных? Одним из способов проверки легальности копии программы является запрос у пользователя учётных данных (пароль, номер лицензии, идентификатор и т.д.). Другой способ - механизм мягкого «психологического давления», направленного на систематическое нарушения нормальной работы пользователя. Это делается с помощью всплывающих окон, которые часто активизируются в ходе сеанса пользовательской работы и напоминают о необходимости зарегистрировать программу. По каким признакам можно найти интересующий код сопоставления с паролем в программе? Код содержит команду условного перехода, который осуществляется в том случае, если был введён верный пароль. Какие существуют основные методы защиты от дизассемблирования и отладки программ? Простейшим методом защиты от дизассемблирования является применение оптимизирующего компилятора. В оптимизированном исполняемом файле с целью повышения быстродействия программы или сокращения объема исполняемого файла нарушается прямой («логичный») порядок вызова команд и использования регистров. Традиционный способ защиты программ – применение шифрования или упаковки распространяемого программного обеспечения. В этом случае собственно исполняемый код не соответствует тексту программы в открытом виде. А в программах, требующих хорошего уровня защиты от дизассемблирования, используется метод неполного динамического шифрования/дешифрования. Простейшим методом защиты от отладки является проверка наличия отладчика. Существует метод защиты программного обеспечения, основанный на запутывании программного кода: обфускация. Как реализуется обфускация с помощью виртуальных машин? Создается виртуальная машина со случайным набором инструкций, и весь код программы трансформируется под нее. Предложите методы усиления механизмов защиты программ от нелегального использования, исследованные в данной работе. Можно использовать не одно, а несколько всплывающих окон с различным периодом возникновения. Тогда будет сложнее находить и изменять данные участки кода с помощью дизассемблера. 10. Выводы по работе В ходе работы на практике я приобрёл навыки по защите приложений от нелегального использования, научился анализировать исполняемые коды в отсутствие исходных текстов и изучил простые способы защит программ от дизассемблирования и отладки. |