В окне «Активация easyQuizzy» (пункт. Взлом платных программ с помощью OllyDBG Метод : Reverse Engineering.
Время от времени сталкиваюсь с просьбами, касающимися программ для проведения компьютерного тестирования (My. Test. X и easy. Quizzy), которые заключаются либо в извлечении файла теста из . My. Test. X), либо в открытии защищенного паролем теста. Набросал . Сразу же переходим в раздел . Теперь нам необходимо извлечь его. Для этого обратимся к дочернему элементу последнего вышеупомянутого ресурса - . Выделим его и увидим в нижней половине окна его атрибуты, нас интересуют поля .
Теперь введем значение в поле RVA - мы получили физическое смещение интересующего нас ресурса относительно начала файла (. Осталось сохранить выделенный фрагмент в отдельный файл.
Снова нажмем правую клавишу, выберем Copy- > Into New File, укажем имя файла, и готово (dx предлагает упрощенный метод: CFF Explorer- > Resource Editor- > RCData- >. Однако, тест может быть защищен паролем. Давайте рассмотрим, как модифицировать редактор тестов, чтобы файл с тестом открывался при вводе любого пароля. Запускаем редактор тестов My. Test. Editor и отладчик Olly.
Dbg. Аттачимся Olly. Dbg к процессу My. Test. Editor (File- > Attach). Мы оказываемся внутри ntdll. Нажимаем Debug- > Run и возобновляем работу приложения.
Далее нажимаем правую клавишу где- нибудь в левом верхнем окне отладчика. В появившемся меню выбираем Go to- > Expression, в появившемся окне вводим Read. File (имя функции Win. API, которая скорее всего будет использоваться для чтения содержимого файла с тестом). В списке снизу выбираем kernel. Read. File и нажимаем . Мы находимся в начале функции Read.
File, теперь нам необходимо поставить breakpoint, чтобы отследить обращение программы к функции. Ставим breakpoint, для этого нажимаем правой клавишей на подсвеченной линии ассемблерного кода и выбираем Breakpoint- > Toggle. Вообще, прежде чем ставить breakpoint, лучше сначала в My. Test. Editor вызвать диалог открытия теста, иначе придется пропускать много обращений (F9) к Read. File из не интересующих нас мест, их можно определить по значению на верхушке стек- фрейма (правое нижнее окно отладчика, строка с текстом .
Интересующий нас вызов будет выглядеть приблизительно так: Как только мы поймали нужное обращение (оно произойдет, когда мы в диалоге открытия теста выберем наш тест, защищенный паролем, и нажмем . Для этого выберем строчку, которая содержит путь к тесту, нажмем правой клавишей мыши и выберем Breakpoint- > Hardware.. В открывшемся окне в первой колонке (Break on), выберем Access (R/W) и нажмем OK. Продолжим выполнение программы (F9 или Debug- > Run).
Через какое- то время программа в очередной раз остановится, сработает наш свежепоставленный hardware breakpoint. У меня место срабатывания выглядело как- то так: Напоминает какую- то промежуточную функцию для работы с файлом, поэтому воспользуемся несколько раз опцией Debug- > Execute till return (Ctrl+F9), пока не окажемся в более .
Нас интересуют всевозможные условные переходы (je, jne, jz, jnz и так далее), которые перепрыгивают более- менее внушительные фрагменты кода, скажем от 5 инструкций. Некоторые участки я сразу пропустил, где, как мне показалось, производятся неинтересные действия, как, например, в этом фрагменте: Напоминает проверку версии теста. Мне так сразу показалось, но можно убедиться и опытным путем, поставив breakpoint на инструкции условного перехода и поменяв значение Z- флага в окне регистров справа, когда выполнение программы прервется на этом участке.
Пролистаем немного вниз и наткнемся на следующую группу условных переходов: Попробуем в лоб поменять Z- флаг на каждом переходе. То есть в My. Test. Student у нас открыт диалог выбора файла с тестом, мы ставим breakpoint на одном из переходов, в диалоге выбираем файл с тестом, который защищен паролем, наблюдаем окно, запрашивающее ввод пароля, вводим туда произвольный текст, после этого у нас должен сработать ранее установленный breakpoint, меняем Z- флаг и продолжаем выполнение программы нажатием F9. Мы увидим, что на вышеупомянутых двух переходах, при изменении Z- флага программа завершает свою работу, после этого запускается браузер, где открывается сайт с фрагментом законодательства: какая- то самопальная .
Однако, при изменении логики условного перехода, который расположен чуть ниже, мы видим, что в программе предварительно открывается тест, хотя после этого программа все равно завершает свою работу и открывает браузер. Для открытия браузера скорее всего используется функция Win. API Shell. Execute. Проверим наше предположение: снова нажимаем правую клавишу где- нибудь в левом верхнем окне отладчика, в появившемся меню выбираем Go to- > Expression, в появившемся окне вводим имя нашей функции, переходим в начало функции и ставим там breakpoint. Снова выполним модификацию логики последнего, интересующего нас, условного перехода, и наш breakpoint срабатывает: Воспользуемся несколько раз Debug- > Execute till return (или Ctrl+F9), чтобы вернуться из недр shell.
My. Test. Editor (следим за заголовком окна отладчика, там где в данный момент написано . Почти сразу попадаем в подобное место: Здесь мы видим еще один условный переход, который нам необходимо исправить (на лету, либо заменив условный переход на безусловный - jmp). Получается, что нам нужно подправить два условных перехода, чтобы получить возможность открывать защищенный тест, вводя любой пароль.
Заменим и проверим: Мой тестовый . После внесения необходимых изменений, нажимаем правой клавишей в левом верхнем окне отладчика, выбираем Edit- > Copy all modifications to executable, в появившемся диалоге указываем имя файла и получаем модифицированный редактор тестов.
Переходим к той же самой проблеме открытия защищенных тестов, созданных с помощью программы easy. Quizzy. В этом случае тест представляет собой . Давайте запустим редактор файлов easy. Quizzy, отладчик Olly. Реферат Школьное Обучение далее.
Dbg, подсоединим отладчик к процессу (здесь и далее я не буду детализировать тривиальные моменты работы с отладчиком, как в тексте до этого) и возобновим работу процесса. В этот раз воспользуемся другим способом поиска участка кода, который необходимо исправить.
Как вы могли заметить, при открытии защищенного паролем теста, программа выдает сообщение . Будем отталкиваться от этого. Переключимся на основной исполняемый модуль easy. Quizzy в отладчике (View- > Executable modules, двойной клик по имени модуля, убедитесь, что в заголовке окна присутствует текст: . Нажмем правой клавишей мыши в окне отладчика и найдем все строковые ресурсы, на которые существуют ссылки в исполняемом коде. Перед нами появится перечень строк в одной большой таблице, найдем в ней строки с сообщением о некорректном пароле и поставим на них breakpoint'ы.
Пробуем открыть защищенный тест и тут же ловим срабатывание breakpoint'а. Почему? Скорее всего программа подгружает необходимые строковые ресурсы при открытии теста, опираясь на некоторые внутренние идентификаторы. Бегло осмотрев функцию, где мы оказались, можно сделать вывод, что ничего особого интересного здесь не происходит. Единственный примечательный момент, это условный переход, отвечающий за отображение подсказки к паролю - ссылка на строку .
Давайте рассмотрим функцию, откуда была вызвана эта функция (либо воспользовавшись Execute till return, либо посмотрев адрес возврата в стеке). Мы оказались внутри занимательной функции, где можем наблюдать пропуск довольного большого фрагмента кода по условному переходу, вдобавок пропускаемый фрагмент содержит ссылку на строку ?