Защита ПО от нелегального использования. Лабораторная работа 6 Защита программного обеспечения от нелегального использования по дисциплине Основы информационной безопасности
![]()
|
Министерство образования и науки Российской Федерации Санкт-Петербургский Политехнический Университет Петра Великого — Институт кибербезопасности и защиты информации ЛАБОРАТОРНАЯ РАБОТА № 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. Выводы по работе В ходе работы на практике я приобрёл навыки по защите приложений от нелегального использования, научился анализировать исполняемые коды в отсутствие исходных текстов и изучил простые способы защит программ от дизассемблирования и отладки. |