Снимаем пароль с тестов MyTestX и easyQuizzy

Время от времени сталкиваюсь с просьбами, касающимися программ для проведения компьютерного тестирования (MyTestX и easyQuizzy), которые заключаются либо в извлечении файла теста из .exe-файла (в случае с MyTestX), либо в открытии защищенного паролем теста.
Набросал "деревянный" последовательный мануал для тех, кому необходимо самостоятельно извлечь тест или сделать, чтобы редактор позволял открыть тест при вводе любого пароля.

Нам понадобится отладчик, например, OllyDbg и программа для упрощенной работы со структурой PE-файла, например, CFF Explorer, также нам понадобится редактор тестов (элементарно ищется в Google), который мы будем "исправлять", и файл, содержащий тест, который необходимо открыть.

Перейти к описанию про easyQuizzy
Перейти к модифицированным редакторам для открытия тестов без пароля
Снимаем пароль с тестов MyTestXPro (.mtx)
Утилита для извлечения теста (.mtf/.mtx) из .exe-файла (пароль kaimi-io)

Для начала, разберем самую тривиальную проблему: как извлечь из .exe-файла файл с тестом - .mtf (речь о MyTestX).
Берем .exe-файл, который содержит тест (я воспользовался экземпляром с форума) и открываем его в CFF Explorer. Сразу же переходим в раздел "Resource Directory" в колонке слева, далее, в списке справа, ищем "Resource Directory Entry ... AKA: RCData", открываем выпадающий список и в нем ищем "Resource Directory Entry ... AKA: MTA".

exe_to_mtf-1

Этот ресурс фактически является .mtf-файлом, который нас интересует. Теперь нам необходимо извлечь его. Для этого обратимся к дочернему элементу последнего вышеупомянутого ресурса - "Resource Data Entry". Выделим его и увидим в нижней половине окна его атрибуты, нас интересуют поля "OffsetToData" и "Size".

exe_to_mtf-2

Запомним значение поля "OffsetToData" и переключимся на "Address Converter" в списке слева. Теперь введем значение в поле RVA - мы получили физическое смещение интересующего нас ресурса относительно начала файла ("File Offset").

exe_to_mtf-3

Воспользуемся встроенным hex-редактором, который расположен в нижней части окна и пометим это место (правая клавиша мыши, "Begin Of Block"), теперь прибавим к "File Offset" значение поля "Size", которое я упоминал выше: 003437E8 + 0001A50B = 0035DCF3 (значения указаны в hex, у вас значения могут отличаться), переместимся по этому адресу (кнопка с изогнутой стрелкой), отметим это место (правая клавиша мыши, "End Of Block"). Осталось сохранить выделенный фрагмент в отдельный файл. Снова нажмем правую клавишу, выберем Copy->Into New File, укажем имя файла, и готово (dx предлагает упрощенный метод: CFF Explorer->Resource Editor->RCData->"MTA"->правой кнопкой мыши Save Resource (Raw)).

exe_to_mtf-4

Мы получили .mtf-файл, который можно открыть в редакторе тестов MyTestX - MyTestEditor. Однако, тест может быть защищен паролем. Давайте рассмотрим, как модифицировать редактор тестов, чтобы файл с тестом открывался при вводе любого пароля.

Запускаем редактор тестов MyTestEditor и отладчик OllyDbg. Аттачимся OllyDbg к процессу MyTestEditor (File->Attach). Мы оказываемся внутри ntdll.

fix_mtf-1

Нажимаем Debug->Run и возобновляем работу приложения. Далее нажимаем правую клавишу где-нибудь в левом верхнем окне отладчика. В появившемся меню выбираем Go to->Expression, в появившемся окне вводим ReadFile (имя функции WinAPI, которая скорее всего будет использоваться для чтения содержимого файла с тестом).

fix_mtf-2

В списке снизу выбираем kernel32.ReadFile и нажимаем "Follow expression". Мы находимся в начале функции ReadFile, теперь нам необходимо поставить breakpoint, чтобы отследить обращение программы к функции. Ставим breakpoint, для этого нажимаем правой клавишей на подсвеченной линии ассемблерного кода и выбираем Breakpoint->Toggle. Вообще, прежде чем ставить breakpoint, лучше сначала в MyTestEditor вызвать диалог открытия теста, иначе придется пропускать много обращений (F9) к ReadFile из не интересующих нас мест, их можно определить по значению на верхушке стек-фрейма (правое нижнее окно отладчика, строка с текстом "Return from kernel32.ReadFile to ..."). Интересующий нас вызов будет выглядеть приблизительно так:

fix_mtf-3

Как только мы поймали нужное обращение (оно произойдет, когда мы в диалоге открытия теста выберем наш тест, защищенный паролем, и нажмем "Открыть"), посмотрим внимательнее в правое нижнее окно отладчика (в нем мы видим содержимое стека), прокрутим окно вниз в поисках строки, которая представляет собой полный путь к файлу с тестом (нас интересует этот стек-фрейм, так как скорее всего он был сформирован в интересующей нас функции).

fix_mtf-4

Поставим hardware breakpoint, чтобы отследить обращение по этому адресу. Для этого выберем строчку, которая содержит путь к тесту, нажмем правой клавишей мыши и выберем Breakpoint->Hardware... В открывшемся окне в первой колонке (Break on), выберем Access (R/W) и нажмем OK.

fix_mtf-5

Продолжим выполнение программы (F9 или Debug->Run). Через какое-то время программа в очередной раз остановится, сработает наш свежепоставленный hardware breakpoint. У меня место срабатывания выглядело как-то так:

fix_mtf-6

Напоминает какую-то промежуточную функцию для работы с файлом, поэтому воспользуемся несколько раз опцией Debug->Execute till return (Ctrl+F9), пока не окажемся в более "высокоуровневом" участке кода, где строится основная логика обработки файла с тестом.

fix_mtf-7

Полистаем код. Нас интересуют всевозможные условные переходы (je, jne, jz, jnz и так далее), которые перепрыгивают более-менее внушительные фрагменты кода, скажем от 5 инструкций. Некоторые участки я сразу пропустил, где, как мне показалось, производятся неинтересные действия, как, например, в этом фрагменте:

fix_mtf-8

Напоминает проверку версии теста. Мне так сразу показалось, но можно убедиться и опытным путем, поставив breakpoint на инструкции условного перехода и поменяв значение Z-флага в окне регистров справа, когда выполнение программы прервется на этом участке. Пролистаем немного вниз и наткнемся на следующую группу условных переходов:

fix_mtf-9

Попробуем в лоб поменять Z-флаг на каждом переходе. То есть в MyTestStudent у нас открыт диалог выбора файла с тестом, мы ставим breakpoint на одном из переходов, в диалоге выбираем файл с тестом, который защищен паролем, наблюдаем окно, запрашивающее ввод пароля, вводим туда произвольный текст, после этого у нас должен сработать ранее установленный breakpoint, меняем Z-флаг и продолжаем выполнение программы нажатием F9.
Мы увидим, что на вышеупомянутых двух переходах, при изменении Z-флага программа завершает свою работу, после этого запускается браузер, где открывается сайт с фрагментом законодательства: какая-то самопальная "защита" от простого взлома. Однако, при изменении логики условного перехода, который расположен чуть ниже, мы видим, что в программе предварительно открывается тест, хотя после этого программа все равно завершает свою работу и открывает браузер.

fix_mtf-10

Для открытия браузера скорее всего используется функция WinAPI ShellExecute. Проверим наше предположение: снова нажимаем правую клавишу где-нибудь в левом верхнем окне отладчика, в появившемся меню выбираем Go to->Expression, в появившемся окне вводим имя нашей функции, переходим в начало функции и ставим там breakpoint. Снова выполним модификацию логики последнего, интересующего нас, условного перехода, и наш breakpoint срабатывает:

fix_mtf-11

Воспользуемся несколько раз Debug->Execute till return (или Ctrl+F9), чтобы вернуться из недр shell32.dll и попасть в модуль MyTestEditor (следим за заголовком окна отладчика, там где в данный момент написано "[CPU - main thread, module shell32]"). Почти сразу попадаем в подобное место:

fix_mtf-12

Здесь мы видим еще один условный переход, который нам необходимо исправить (на лету, либо заменив условный переход на безусловный - jmp). Получается, что нам нужно подправить два условных перехода, чтобы получить возможность открывать защищенный тест, вводя любой пароль. Заменим и проверим:

fix_mtf-13

Мой тестовый .mtf-файл, защищенный паролем, открылся без проблем (ссылки на модифицированный редактор и пример файла с тестом находятся в конце статьи). После внесения необходимых изменений, нажимаем правой клавишей в левом верхнем окне отладчика, выбираем Edit->Copy all modifications to executable, в появившемся диалоге указываем имя файла и получаем модифицированный редактор тестов.


Переходим к той же самой проблеме открытия защищенных тестов, созданных с помощью программы easyQuizzy. В этом случае тест представляет собой .exe-файл, однако нет необходимости проводить с ним какие-то дополнительные манипуляции - редактор умеет открывать такие файлы.

Давайте запустим редактор файлов easyQuizzy, отладчик OllyDbg, подсоединим отладчик к процессу (здесь и далее я не буду детализировать тривиальные моменты работы с отладчиком, как в тексте до этого) и возобновим работу процесса. В этот раз воспользуемся другим способом поиска участка кода, который необходимо исправить. Как вы могли заметить, при открытии защищенного паролем теста, программа выдает сообщение "Incorrect password" (у меня язык интерфейса переключен на английский). Будем отталкиваться от этого.

Переключимся на основной исполняемый модуль easyQuizzy в отладчике (View->Executable modules, двойной клик по имени модуля, убедитесь, что в заголовке окна присутствует текст: "...module easyQuizzy"). Нажмем правой клавишей мыши в окне отладчика и найдем все строковые ресурсы, на которые существуют ссылки в исполняемом коде.

easy_quizzy-1

Перед нами появится перечень строк в одной большой таблице, найдем в ней строки с сообщением о некорректном пароле и поставим на них breakpoint'ы.

easy_quizzy-2

Пробуем открыть защищенный тест и тут же ловим срабатывание breakpoint'а.

easy_quizzy-3

Почему? Скорее всего программа подгружает необходимые строковые ресурсы при открытии теста, опираясь на некоторые внутренние идентификаторы. Бегло осмотрев функцию, где мы оказались, можно сделать вывод, что ничего особого интересного здесь не происходит. Единственный примечательный момент, это условный переход, отвечающий за отображение подсказки к паролю - ссылка на строку "Password hint:" в коде. Давайте рассмотрим функцию, откуда была вызвана эта функция (либо воспользовавшись Execute till return, либо посмотрев адрес возврата в стеке).

Мы оказались внутри занимательной функции, где можем наблюдать пропуск довольного большого фрагмента кода по условному переходу, вдобавок пропускаемый фрагмент содержит ссылку на строку "Incorrect password.".

easy_quizzy-4

Но как мы вообще попадаем в этот фрагмент кода? Прокрутим листинг немного вверх и увидим гораздо более интересный условный переход: он позволяет пропустить даже вызов функции, которая отображает нам диалог ввода пароля.

easy_quizzy-5

Пробуем изменить логику его работы (например, забиваем условный переход NOP'ами) - вуаля, защищенный тест открывается не запрашивая пароль.

Подведем итог: как мы видим, защита теста паролем в общем-то номинальная и ее легко преодолеть при наличии базовых навыков работы с отладчиком.

Файлы с тестами, на которых я проводил эксперименты: cкачать.
Оригинальные редакторы тестов: MyTestX и easyQuizzy.

Модифицированные редакторы тестов, позволяющие открыть тест, не зная оригинального пароля:
mega.co.nz: MyTestX-mod, easyQuizzy-mod
sendspace.com: MyTestX-mod, easyQuizzy-mod

Снимаем пароль с тестов MyTestX и easyQuizzy: 176 комментариев

  1. Kaimi вернулся! Наконец-то! Пожалуйста, скажи домен, на который переедет блог.

  2. Пере залейте плиз модифицированный редактор тестов easyQuizzy-mod. ОЧЕНЬ АКТУАЛЬНО!!!

  3. Привет помоги мне с этим : http://rghost.ru/58046592/image.png
    Пишу значит : C:\Program Files\Java\jdk1.7.0_67\bin>java -cp .;javassist.jar;android.jar Hook
    Выдает : Error: Could not find or load main class Hook
    Напиши сюда : https://vk.com/id204464369
    Или сюда : [email protected]
    Помоги мне мне нужно.
    Все это я говорю к статье : http://kaimi.io/2013/07/modifying-official-vk-app-android/
    Я просто не понимаю помоги!

    1. Так в ошибке все написано. А причина - да без понятия, может файл отсутствует, может собрано криво, может класс переименован...

  4. Ув.Kaimi,пожалуйста объясните подробнее пункт "Пробуем изменить логику его работы - вуаля, защищенный тест открывается не запрашивая пароль." - а то что не перепробывал,не работает.

    1. Поменять условный переход на противоположный, jz на jnz или наоборот, смотря что там.

  5. А не могли бы вы сделать картинку,на которой это показано,а то я с отладчиками ой как не дружу,извините за беспокойствие

  6. Я просто не могу найти JZ и JNZ,джамп как показано на скрине нашёл а что делать незнаю.

    1. Учитывая то, что jn-jnz на скрине расположен выше на две строчки, то могу предположить, что найден либо не тот джамп, либо другая версия редактора тестов.

  7. Огромное спасибо,сделал,может будете делать уроки по отладчику )?

  8. Блин,я вас "задолбал" но всёже,а как сохранить эту программу ? Copy to exe нету...?

  9. Не получается у меня на этом этапе
    "Как только мы поймали нужное обращение (оно произойдет, когда мы в диалоге открытия теста выберем наш тест, защищенный паролем, и нажмем "Открыть"), посмотрим внимательнее в правое нижнее окно отладчика (в нем мы видим содержимое стека), прокрутим окно вниз в поисках строки, которая представляет собой полный путь к файлу с тестом (нас интересует этот стек-фрейм, так как скорее всего он был сформирован в интересующей нас функции)."

    fix_mtf-4

    Отсутствует полный путь к файлу с тестом. У меня тест с расширением *.mtx
    Прошу помочь в решении данного вопроса.

    1. Google -> "введение в крэкинг с нуля, используя ollydbg"
      Тогда можно и самостоятельно все сделать

  10. помогите пожалуйста, не получается взломать easy quizzy:
    джамп как на скрине нашел, меня условный переход - после программа не возобновляется, выводит ошибку:
    CPU Disasm
    Address Hex dump Command Comments
    004172CE F3:66:A5 REP MOVS WORD PTR ES:[EDI],WORD PTR DS:[
    может что то не так делаю? или прогу обновили)
    можете пожалуйста отправить easyquizzy-mod?

  11. Если не сложно, то можете посмотреть SunRav TestOfficePro, можно ли там снять пароль?

  12. Помогите пожалуйста с последним пунктом для Квизи. Что значит- Изменить логику его работы?

    1. Тест защищен Vmprotect дополнительно, так что вероятно надо снимать протектор сначала, я таким не занимаюсь

  13. посмотрите пожалуйста, я вытащил текст с вопросами из 11-й версии my test x, но я не могу открыть ни одним редактором тестов.
    файл с вопросами
    yadi.sk/d/jDsgSJchd2dhA
    сам тест
    yadi.sk/d/09fNTUnId2RWZ
    за ранее спасибо

  14. Здравствуйте. Спасибо за статью. У меня не получается с этого момента "Ставим breakpoint, для этого нажимаем правой клавишей на подсвеченной линии ассемблерного кода и выбираем Breakpoint->Toggle. Вообще, прежде чем ставить breakpoint, лучше сначала в MyTestEditor вызвать диалог открытия теста". Вызываю диалог открытия теста, потом ставлю breakpoint. Строчку "Return from kernel32.ReadFile to ..." найти не могу, да и открыть файл теста тоже невозможно, видимо, потому что стоит Paused. Подскажите, пожалуйста, что делаю не так?

    1. Может тогда проще скачать исправленную версию редактора по ссылке в конце статьи?

  15. Здравствуйте, помогите пожалуйста перевести файл теста из exe в формат для MyTestEditor. Файл перешлю по почте(по другому не могу:))

    1. Это от новой версии, я не в курсе, хранится ли там вообще тест в пригодном для редактора формате.
      На первый взгляд при упаковке теста в автономный файл берется MyTestStudent.exe и информация по тесту сохраняется в ресурсы RCData (TEST, TESTIUD), но там лежат данные в формате отличном от того, что было бы в .mtx файле для данного теста. Энтропия высокая, может просто пожаты как-то, может еще и зашифрованы. Операции, которые автономный файл производит с этими ресурсами, так просто не изучить, т.к. часть методов накрыта VMProtect'ом, конечно, возможно где-то можно перехватить содержимое теста в подходящем виде, но это надо сидеть и разбираться, или хотя бы снять VMProtect, для лучшего понимания, что там внутри происходит.

  16. Здравствуйте. Пробовал провернуть подобное. Все шло хорошо ровно до того, как понадобилось CTRL+F9 и искать нужный условный переход. Для начала, у меня строк кода было даже в половину меньше тех, что на скрине. Что я делаю не так? =/

  17. Воспользуемся встроенным hex-редактором, который расположен в нижней части окна и пометим это место (правая клавиша мыши, "Begin Of Block"), теперь прибавим к "File Offset" значение поля "Size", которое я упоминал выше: 003437E8 + 0001A50B = 0035DCF3 (значения указаны в hex, у вас значения

    КАКОЕ МЕСТО НУЖНО ПОМЕТИТЬ???

    1. Можно просто открыть Resource Editor, выбрать нужный ресурс (с именем MTA) и из контекстного меню выбрать Save raw (кажется)

  18. Перезолейте пожалуйста на другой сервер мод версии, а то скачать невозможно. Буду очень благодарен!

    1. Вообще нормально все качается, но я добавил ссылки на sendspace в конце, если кому-то от этого легче.

  19. здравствуйте, я в этом ничего не понимаю, но мне нужно достать тест с ответами, тест запароленый easyquizzy,в виде программки(приложения), можете помочь?))

    1. А взять модифицированный редактор по ссылке в конце и попробовать им открыть религия не позволяет?

  20. с версией Mytest 10.0.4 не действует это. видимо только со старыми версиями

  21. Может я криворукий или малость слепой, но я не могу найти строку с путем к файлу.
    Если не сложно гляньте, пожалуйста, редактор тестов нужной версии и mtf файл по ссылке.
    https://cloud.mail.ru/public/245844d30326/MyTest
    Все делаю по мануалу, а толку ровно ноль

      1. @Kaimi, у меня когда я проводжу поиск вискакивает ошибка..

          1. Я же спросил, что мешает скачать уже исправленный редактор по ссылке в конце статьи, вместо того, чтобы пытаться самому сделать что-то там?

  22. Kaimi, есть желание приобрести у вас модифицированный редактор для MyTestX Pro версии 11.0.0.34. Насколько это реально?

  23. День добрый, все делаю по инструкции для того чтобы извлечь из exe mtf-файл, в разделе RCDATA нету пункта MTA, из подобных есть только раздел TEST, попробовал его и еще несколько других извлечь и переименовать в нужное расширение, но в итоге программа не открывает "тест". В чем проблема? вот сам файл http://rghost.ru/8nyx8HBtS

    1. А причем тут я? Это вообще какой-то самописный тест, который никак не относится ни к MyTest, ни к easyQuizzy.

      1. @Kaimi, хотел понять с чем это есть, думал может что подскажешь, учитывая твой опыт

  24. Сделал по инструкции , но путь не указывается как у вас там ,что делать? UNICODE там другое всё :( (тест-mytest) може рук из доы растут? (Версия старая ,старей этой , которая там рассматривалась)

      1. @Kaimi, я ищу нужное мне обращение. Но там не UNICODE и путь к тесту , там
        ACSII и путь к тесту. (И таких путей много штуки 3 наверно) Что делать?

        1. Понять принцип, прочитав набор статей. В конце концов никто не мешает взять конверте с официального сайта и преобразовать файл с тестом в более свежий формат, который поймет редактор из статьи.

  25. @Kaimi, Привет, помоги пожалуйста, открыть тесты, или подобрать пароль, модифицированый редактор из статьи не помог, сам модифицировать тоже не смог. Версия проде MyTest 3.0.4.7. Пожалуйста помоги модифицировать редактор или подобрать пароль.
    http://rghost.ru/private/6NsRcxSyn/3f44a244551e0a96a5e35cc4b289d155

  26. слушай,у меня проблема, у меня некая версия 10.010, я не могу её переконвертировать нет такого конвертера не подскажешь, что делать, буду благодарен

  27. При открытии на CFF Explorer в разделе "Resource Directory"нету "Resource Directory Entry ... AKA: RCData". Как его найти?

    1. Здравствуйте, Валеева Алия Фаритовна. Значит файл с тестом упакован/защищен/создан в какой-нибудь другой версии/еще что-нибудь. Что делать? Изучать ассемблер, устройство PE-файлов, статьи на сайте exelab...

  28. Доброго времени суток, не могли бы Вы помочь мне убрать пароль из *mtf файла? уже 6 часов бьюсь над ним(( ничего не получается(((

  29. День добрый.
    Подскажи, сделал все как написано в посте, но редактор отказывается открывать мой файл, пишет "неверный тип файла" хотя требует от меня расширение .mtf, отказываясь его читать.
    Возможно у меня руки кривые и я сам файл неправильно сохраняю.
    Мой файл: https://yadi.sk/d/E86up-33gpbRw
    Сам тест с которым я работал: https://yadi.sk/d/DN3d6oulgpbC8

Обсуждение закрыто.