Reverse engineering
May 13

Сказ о том, как чайник Autoplay Media Studio 8.5.3.0 ломал

From Sandbox
image

Как не трудно догадаться, то чайник — это я.

Захотелось мне на днях в исходник одной утилитки заглянуть, очевидно сделанной средствами AMS (.cdd файл рядом с .exe и пара lua*.dll). Пару лет назад разбирал детально одну программу сделанную аналогичными средствами и представление об упаковке .cdd, представляющего из себя обычный zip архив с паролем, имеется. Ну я не долго думая в AMSUnpacker запихнул и получил ошибку распаковки. Ну с этого момента и началось самое интересное...

Первая мысль, пришедшая в голову, что файл чем-то упакован кроме UPX (который я естественно распаковал). Ну чем я его только не проверял (DIE, Exeinfo PE, Nauz File Detector) и все меня убеждают, что нет, не упакован. Ну думаю, сравню банально .exe средствами Total Commander ранее распаковываемой программы и эту, и оказалось, что .exe сильно разные (ранее сравнивал другие программы на AMS и разница была только в единичных байтах, собственно, в пароле, записанном в открытом виде просто в самом .exe и в ресурсной части). Стало понятно, что это либо какая-то модифицированная и просто новая версия AMS. В последнее верил с трудом, зная (ну я так сперва думал, что знал), что разработчики давно на программу забили, но проверять так это или нет, не стал, да и вряд ли бы это что-то дало.

Начал вникать уже более детальнее, кое-как в x64dbg, с которым я на «Вы», нашел в старой версии программы место, где «читается» пароль. Покопавшись тем же x64dbg в «новой» версии, оказалось, что не так уж и сильно они отличаются, а в ней просто функций больше, чем в старой. Нашел аналогичное место, где вместо заветного push <адрес, где хранится пароль> был какой-то mov <что-то там> и несколько вызовов каких то других функций, а несколькими строками ниже код аналогичный, тому, что и в старой версии.

image
(слева — старая версия, справа — новая)

И тут я приуныл, т. к. моих знаний отладчика явно не хватает, чтобы в этом всем разобраться.
Появилась одна мысль — найти какую то другую аналогичную не распаковываемую программу и сравнить их .exe. Такая программа нашлась у того же автора, что та, которую я пытался распаковать. И сравнение файлов дало свой результат. Кроме мелких отличий нашелся целый блок различных данных:

image

И радость, что я нашел то уникальное место, где по-видимому и содержался пароль, и разочарование, что это явно не пароль, в таком виде как он был в предыдущих версиях.

Ничего не оставалось, как разбираться в отладчике. Вся «беда» в том, что ассемблер я знаю на уровне нескольких команд, с очень поверхностным представлением, что они делают, а сам отладчик на уровне нескольких просмотренных видео на youtube и небольшом опыте его использования, в основном «методом тыка».

После битого часа прогона отладчиком и неисчислимого количества перезапусков я кое-как нашел место, где читаются заветные байты и немногим позже нашел часть кода, которая какие-то манипуляции с этими байтами делает:

image

Еще немало времени понадобилось, чтобы понять, что же там делается.

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

image

В общем, заменив значения нижней таблицы соответствующими значениями из верхней таблицы, получим массив байт: 7B 10 DD 5A 4D 26 72 EE B2 2A 04 2B 6E F7 14 E2 F9 14 F8 9E 8A 99 28 AE B8 4B C0 D7 42 DA AD.

Для чего другие уникальные массивы байт, до и после необходимых для расшифровки пароля я не понял, но и не особо вникал. Подозреваю, что там какие то контрольные суммы…

А дальше уже дело за малым, преобразовать это в строку и распаковать с помощью этого пароля заветный .cdd архив. Небольшая проблема была еще в том, что полученную строку нельзя было через Ctrl+C -> Ctrl-V вставить в архиватор, т.к. символы «ломаются» в буфере обмена (особо в суть не вникал). Распаковать можно только программно. Благо есть некоторые знания C# (уровень которых в общем не на много отличается от уровня знания отладчика) и небольшой опыт в изучении принципа работы ранее упомянутого AMSUnpacker, который так же на C# написан и посмотреть, что он там и как делает не составляет труда.

Практически на коленке наваял утилиту, для проверки работоспособности ранее изученного алгоритма, и вуаля, оно работает.

Скачать можно тут.

image

Программа, аналогично упомянутому ранее AMSUnpacker, создает рядом с .exe папку extracted_cdd с содержимым .cdd архива.

Уже после удачной распаковки заветного .cdd файла узнал, что это «новая» версия (от конца 2018) AMS 8.5.3.0. И на сайте у них прочитал касательно новой версии: Feature: Enhanced the security of the commercial version's data file.. Ну как видно это не очень вышло…

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

P.S. Я знаю, что проще всего получить исходники программ на lua (который использует AMS) через патченный lua*.dll, которые гуляют по интернету и/или внешний хук функции lua_load() в том же lua*.dll. Это все я тоже когда-то делал. В данной ситуации был чисто спортивный интерес разобраться, как получить пароль для .cdd. И так же я прекрасно понимаю, что вряд ли это кому то понадобится и особо никакой практической ценности не несет.

Я вероятно утрировал касательно «чайника», т.к. небольшой опыт программирования и реверса имеется, но это всего лишь небольшое хобби «для себя» и нет особо ни времени ни желания в это глубоко вникать.

P.P.S. Это моя первая статья на Хабре, как и, наверное, вообще первая такого типа.

+13
2.9k 13
Comments 2
Top of the day