Реверсинг программы с парольной защитой на С++. Часть 4

Тема в разделе "WASM.ARTICLES", создана пользователем Alex81524, 31 янв 2019.

  1. Alex81524

    Alex81524 New Member

    Публикаций:
    5
    Регистрация:
    12 фев 2008
    Сообщения:
    8
    Рассмотрим пример исследования программного кода для анализа вводимого пароля и вывода сообщения о регистрации. Для начала рассмотрим очень простую консольную программу (программа 2.8).
    Программа 2.8.
    Код (C):
    1. #include <iostream>
    2. #include <stdio.h>
    3. #include <process.h>
    4. #include <conio.h>
    5. using namespace std;
    6. void main()
    7. {
    8.   cout << " Enter pssword " << endl;
    9.   int pass;
    10.   cin >> pass;
    11.   if (pass==999)  //пароль 999
    12.   {
    13.   cout << " OKEY!!! ;) " << endl;
    14.   getch();
    15.   }
    16.   else
    17.   {
    18.   cout << " WRONG!!! " << endl;
    19.   cout << " Try next time! " << endl;
    20.   getch();
    21.   exit(0);
    22.   }
    23.   cout << " Your registration allright! " << endl;
    24.   cout << " Press any key! " << endl;
    25.   getch();
    26. }
    После компиляции программы будет получен ехе-файл. В связи с тем, что в учебных целях присутствует исходный текст, то особо исследовать PE файл необходимости нет. Однако, если бы исходного текста программы не было, то прежде, чем исследовать ехе-файл в отладчике необходимо исследовать структуру РЕ-файла. Это позволяет узнать компилятор, а следовательно, и язык программирования, использованный при написании программы, упаковщика или криптора. Для исследования 32-разрядного кода наибольшее распространение получила программа-анализатор PEiD 0.95, главное окно которой представлено на рис. 2.12.


    upload_2019-1-31_22-10-25.png

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


    upload_2019-1-31_22-10-47.png

    Программа-анализатор PEiD давно не обновляется. Поэтому для получения аналогичной и детализированной информации необходимо пользоваться несколькими другими и, желательно, более современными приложениями.
    Одной из таких программ является программа CFF Explorer. Программа предназначена для анализа PE32/64 исполняемых файлов с полной поддержкой x86, x64, Itanium архитектур. Окно программы CFF Explorer представлено на рис. 2.14.


    upload_2019-1-31_22-11-18.png

    Следующей часто применяемой программой есть программа з названием Pestudio. Окно этого приложения с загруженной программой для анализа представлено на рис. 2.15.


    upload_2019-1-31_22-11-38.png

    Она автоматически сканирует загруженный образец файла на VirusTotal, отображает используемые в исследуемом приложении функции таблицы импорта, показывает вирусные признаки приложения, используемые библиотеки и информацию заголовка PE-файла, может работать с ресурсами.
    Продолжим анализ исследуемой программы запроса пароля. После того, как получена детальная информация по РЕ-формату и выяснено, на каком языке написана программа и упакована ли исследуемая программа, то необходимо ее выполнить. После ее запуска в консольном окне выведется сообщение с просьбой о вводе пароля. Если ключ совпадает с тем, что хранится в программе, то будет выведено сообщение о регистрации программы, а если же ключ введен неверный, то будет выведено соответствующее сообщение (рис. 2.16).

    upload_2019-1-31_22-12-8.png upload_2019-1-31_22-12-20.png

    После того, как получено хоть какое-то сообщение (как правило – это сообщение о неверной регистрации), его необходимо запомнить и приступить к его поиску.
    Различают два способа нахождения места в программном коде, в котором происходит вывод сообщения от исследуемой программы:
    – с применением контрольных точек;
    – с глобальным поиском строки вывода сообщения.
    Применение контрольных точек является классическим способом поиска места в коде, в котором происходит вывод сообщения от программы. Этот способ, несмотря на то, что он медленный, но он почти всегда позволяет достичь желаемого результата.
    Применение глобального поиска строки вывода сообщения позволяет очень быстро найти это место. А применение двух этих методов всегда приносит положительное решение.

    Поиск места анализа кода с применением контрольных точек
    Чтобы программа принимала любой ключ надо изменить ее код в отладчике. Открываем полученный ехе-файл в отладчике x32Dbg (рис. 2.17).

    upload_2019-1-31_22-13-2.png

    В открывшемся окне надо нажать на клавишу F9 (чтобы выполнить программу).
    Следующим шагом надо нажимать на клавишу F8 (чтобы выполнять построчно каждую строку кода без вхождения во внутрь процедур) и удерживать нажатой до тех пор, пока в консольное окно не выведется сообщение ”Enter password”.
    Дальнейшее удерживание клавиши F8 не приведет ни к каким действиям, пока не будет введен любой пароль, например, 123. Поэтому, сначала необходимо на ту строку, на которой остановилась программа и с которой вывелось сообщение, поставить контрольную точку. Для этого, когда курсор стоит на этой строке, нажать на клавишу F2. Чтобы в последующем снять контрольную точку, тоже необходимо повторно на этой же строке нажать на клавишу F2.
    После того, как контрольная точка поставлена (адрес строки выделился красным цветом), необходимо перезагрузить программу, а затем выполнить ее, нажав на клавишу F9. Причем нажимать на клавишу F9 необходимо несколько раз, пока программа не остановится на контрольной точке, но сообщение не будет выведено. Теперь надо войти во внутрь этой строки, на которой стоит контрольная точка. Для этого нажимаем клавишу F7.
    После того, как попали во внутрь строки (эта строка – всегда является вызовом процедуры – call), на которой стояла контрольная точка, необходимо снова нажимать на клавишу F8 – чтобы не попасть во внутрь других процедур, которые на прямую не влияют на вывод сообщения.
    Через несколько нажатий на F8 выведется приглашение на ввод пароля. Эта строка тоже должна быть вызовом процедуры. Если проскочили, то возвращаемся и ставим еще одну контрольную точку (клавиша F2).
    Снова перезагружаем программу, а затем несколько раз нажимаем на клавишу F9, пока не появится установленная контрольная точка.
    Таким образом, в обобщенном случае алгоритм поиска процедуры вывода сообщения будет следующим:
    – находится процедура, по результату выполнения которой выводится приглашение о вводе пароля;
    – на процедуре вывода сообщения клавишей F2 устанавливается контрольная точка;
    – производится перезагрузка ехе-файла в отладчике;
    – несколько раз нажимается клавиша F9 для выполнения программы до появления последней отмеченной контрольной точки;
    – после нахождения последней контрольной точки при помощи клавиши F7 входим во внутрь этой контрольной точки;
    – при помощи клавиши F8 выполняется каждая строка кода до определения строки кода, которая выводит сообщение, а если контрольная точка последняя, то определяется команда сравнения, по результатам которой уже и выводится сообщение о вводе пароля.
    При исследовании ехе-файла в конкретной конфигурации компьютера контрольные точки были определены по адресам:
    004304FB;
    0041C38D;
    0041F3Cd;
    0041F965.
    После того, как попали во внутрь последней контрольной точки, начинается длинный цикл посимвольного вывода сообщения ”Enter password”. А после вывода последнего символа сообщения находится команда сравнения
    0041C3AA817D F8 E7030000cmp dword ptr ss:[ebp-8],3E7
    В этой команде сравнивается содержимое буфера, где хранится введенный пароль, с эталонным паролем, который находится во втором операнде в шестнадцатеричной системе счисления. Пароль найден.
    А если необходимо сделать так, чтобы программа принимала любой пароль, то необходимо изменить адрес перехода на вывод нужного сообщения. Это делается в команде, которая располагается за командой сравнения – это команда jne sp1.41C3D8 с адресом перехода на часть кода, которая выводит сообщение о неправильном пароле. А чтобы знать адрес перехода на вывод сообщения о правильном пароле необходимо посмотреть в поле комментариев ниже по коду. Это сообщение “OKEY”, которого располагается сразу же после рассмотренных команд. Поэтому, проще всего команду перехода заполнить командами NOP.
    Для этого подводим курсор к строке с командой jne, дважды нажимаем левую клавишу мышки, ставим отметку в окошке Заполнить командами NOP и вводим NOP (рис. 2.18).

    upload_2019-1-31_22-14-8.png

    Внести изменения в отладчике x32/64Dbg можно двумя способами.
    Первый способ: выбираем Файл/ Исправить файл. В новом окне выбрать пункт Исправить файл. Затем – новое имя и расширение ехе.
    Второй способ: выбрать пиктограмму с названием Исправления, нажать на кнопку Исправить файл, а далее новое имя и расширение ехе.
    После внесенных изменений ехе-файл с новым именем на любой пароль реагирует как на лицензионный.

    Поиск места анализа кода с глобальным поиском строки вывода сообщения
    Для того, чтобы найти место анализа кода, надо запустить на выполнение программу (ехе-файл), ввести любой пароль и запомнить сообщения программы. Первое сообщение – "Enter pssword", а при неправильном пароле – "WRONG!!!".
    После чего запускаем отладчик x32Dbg и открываем исследуемый ехе-файл. Наводим мышку на любое окно отладчика, нажимаем правую клавишу мышки и выбираем Поиск в / Все модули / Ссылки на строки. Выводятся все сообщения, а верхние в списке относятся к исследуемой программе (рис. 2.19).

    upload_2019-1-31_22-15-28.png

    Подводим мышку к строке с сообщением "Enter pssword" и дважды нажимаем левую клавишу. Сразу же переходим по выбранному адресу этой строки к коду программы, где видны и другие сообщения программы.
    Дальше поступаем так, как в предыдущем варианте: исправлению команды ветвления и пересохранению с другим именем и с расширением ехе.
     
    Последнее редактирование: 1 фев 2019
    Mikl___ нравится это.