Вернуться на сайт

Пример 1: Создание простейшей парольной защиты
и исследование ее безопасности

Для данного примера нам потребуются следующие программы:

Все эти средства общедоступны в Интернете, желательно скачать самые последние версии.

Для создания программы-имитации парольной защиты воспользуемся средой разработки Builder.

Form1

Создаем новый проект, на форму вытаскиваем 2 элемента: Edit1 и Button1. В свойстве Caption у Button1 пишем название кнопки «Регистрация», свойство Text для поля ввода Edit1 делаем пустым. В обработчике нажатия Button1->OnClick пишем текст программы, показанный справа. Правильным паролем для показа сообщения о регистрации является «pass», при этом выводится сообщение о регистрации.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

 if (Edit1->Text==String('p')+String('a')+ String('s')+String('s'))

ShowMessage ("Registered!");

 else

ShowMessage ("Wrong!");

}

Компилируем программу, не забываем в свойствах проекта убрать галочку в Packages->Build with runtime packages и в Linker->Use dynamic RTL для создания exe-файла, который будет запускаться на любой машине. Компилируем проект, получаем на выходе файл Project1.exe.

Запускаем программу и пробуем ввести различные варианты в поле ввода, убеждаемся, что строка «Registered!» появляется только в случае ввода пароля «pass».

Теперь загружаем полученную программу в дизассемблер IDA Pro. Ждем окончания анализа и переходим на вкладку Strings.

Нам известно, что программа при вводе неправильного пароля выводит сообщение «Wrong», поэтому ищем эту строчку в переменных, нажав Alt-T. Естественно, такая строчка найдена, а заодно и соседняя, «Registered!». Теперь все, что нам надо, это найти условие, при котором выбирается то или иное сообщение. Для этого щелкаем два раза на переменной Wrong и переходим к вкладке IDA View-A.

В поле DATA XREF: показано место в программе, откуда вызывается данная строковая переменная. Щелкаем два раза на XREF (перекрестная ссылка), который соответствует строковой переменной “Registered

Разобраться в этом куске кода на Ассемблере достаточно просто. Стоит лишь обратить внимание на операторы test и jz перед показом сообщения «Registered».
Это соответственно операции сравнения и условного перехода. В данном случае при прыжке (показано слева серой пунктирной стрелкой) будет показано сообщение «
Wrong!», иначе выполнение продолжится с сообщением «Registered!». Для проверки, так ли это на самом деле, загружаем программу в отладчик OllyDebug.

Нажимаем на кнопку  для перехода на строку с номером 401ACE (адрес инструкции jz). Ставим на этой строчке breakpoint (точку остановки) нажатием F2. Запускаем программу из отладчика, нажав F9. В программе вводим к примеру «123» и при нажатии кнопки вываливаемся опять в Olly.

При этом видим внизу надпись «Jump is taken», что означает, что прыжок в данном случае будет совершен. Чтобы обойти прыжок щелкаем на этой строчке 2 раза и в окне замены инструкции пишем «nop»

При этом условный прыжок заменяется двумя инструкциями nop (no operation), которые ничего не делают.

Продолжаем выполнение программы, нажав F9, и наблюдаем показ сообщения о регистрации. Таким образом, изменение условного перехода jz на nop устраняет возможность перехода к показу сообщения «Wrong!».

Последнее, что мы сделаем в данном примере, это создадим патч для программы. Для этого вернемся в окно дизассемблера IDA, поставим курсор на инструкцию jz по адресу 401ACE  и посмотрим на строку состояния.

000010CE в данном случае является физическим адресом инструкции jz в файле Project1.exe. Запускаем шестнадцатеричный редактор WinHEX и переходим по этому смещению, нажав на кнопку .

Наблюдаем по этому смещению наличие байтов 74 2F, которые соответствуют инструкции jz.

Заменяем эти два байта на 90 90, что соответствует двум командам nop. Таким образом, мы проделали в файле то, что до этого делали отладчиком Olly в оперативной памяти. Сохраним измененный файл под именем Project2.exe. Для пробы запустим его и убедимся, что при вводе любой строки выдается сообщение «Registered!» об успешной регистрации.

Для создания патча воспользуемся программой CodeFusion. В поле Patch Window Caption напишем «Project1» и нажмем Next. В появившемся окне нажимаем на зеленый плюсик для выбора File to Patch и добавляем файл Project1.exe

Для выбора Data to Patch нажимаем зеленый плюсик и выбираем File Compare

Нажимаем ОК и Next. Далее нажимаем на кнопку  и сохраняем патч под именем Patch.exe

Теперь при запуске патча в файле с именем Project1.exe будут произведены все необходимые замены. Конечно, необходимо помнить, что создание патчей для коммерческих программ и их распространение является нарушением УК РФ и карается лишением свободы. Поэтому данный пример затрагивает лишь самолично созданную программу и ее анализ. 

По всем вопросам к данному руководству писать: mimicria@mail.ru

Original File – это Project1.exe, Patched File – соответственно Project2.exe. Нажимаем кнопку «Compare» и видим, что по смещению 10CE будут заменены 2 байта: 742F на 9090.

 Вернуться на сайт