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. Это моя первая статья на Хабре, как и, наверное, вообще первая такого типа.

Комментарии (2)


  1. trolley813
    13.05.2019 11:36
    +1

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

    Этот "стандартный алгоритм" называется Security through obscurity (безопасность через неясность). Многие наивно полагают, что если криптоаналитик не знает алгоритм, то не сможет вскрыть и сам шифр.


    1. nerudo
      13.05.2019 11:55

      Каждый раз, когда вы придумываете свой собственный шифровальный велосипед, где-то плачет сотрудник АНБ, которому вместо готового эксплоита приходится расчехлять дебаггер ;)