• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Реверс-инжиниринг для начинающих [Часть 6 \ -EXE-]

-EXE-

RAID-массив
Пользователь
Регистрация
07.08.2022
Сообщения
55
Реакции
349
lgp.jpg

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

Первая программа, которую мы будем анализировать, это SunnуPages (официальный сайт http://www.sunnypages.eu/). Это программа для распознавания текста, переводит отснятые изображения книг, документов или pdf файлы в электронные (редактируемые форматы). Особенностью данного софта есть то что он поддерживает 95 языков распознавания. И приятно то что присутствует русский языка интерфейса.

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

Запустив программу, открыв в ней тестовую картинку, мы увидим что меню "Регистрация" стало активным (до загрузки картинки оно было не активным). Нажав на кнопку Регистрация нам откроется форма с активацией программы. Ну и тут уже привычная картина, программа получает серийный номер пк и требует к нему ключ активации. А если нет ключа активации то в окне Описание выводится надпись что программа не лицензирована, то есть не активирована.

newxss-1.jpg


newxss-2.jpg



Ну а теперь давайте посмотрим что происходит внутри программы, под отладчиком. Но сначала посмотрим защищен ли исполняемый файл программы каким ни будь протектором, обфускатором. Закидываем исполняемый файл программы SunnyPage.exe в утилиту Exeinfo PE (Информация по этой утилите имеется в предыдущих моих статьях на форуме).

newxss-3.jpg


И получаем информацию
  1. Имя исполняемого файла, в нашем случае: SunnуPage.exe
  2. Разрядность: утилита определила что это 32 разрядное (32-битное) приложение Windows .
  3. Язык программирования и есть ли упаковка (сжатие), защита на исполняемом файле: В нашем случае ConfuserEx. То есть защита есть, на программе, обфускаторов для .net приложений.
  4. Ну и последний пункт: Тут идут всегда рекомендации по использованию инструмента по отладке, деобфускации. И сразу же рекомендация использовать de4dot v3.1.

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

Закидываем программу в отладчик DnSpy (x32) и сразу же переходим к точке входа программы. Для этого кликаем правой кнопкой мыши по исполняемому файлу и выбираем перейти к точке входа.

newxss-4.jpg


newxss-5.jpg

Что интересно и что можно сказать сразу так это то что не весь код под обфускатором ConfuserEx. Осмелюсь предположить что самые важные участки кода, места что отвечают за активацию лицензии, находятся под ConfuserEx. Если бы было все наоборот то мы бы сразу увидели кашу из не читаемого (запутанного кода). А теперь давайте попробуем разобрать логику активации программы и найти способ её зарегистрировать.

Совершенно очевидно вот тут Program.SunnyForm.MainLoad(); происходит запуск (инициализация) главной формы программы и всего что связано с ней. То есть при клике по .MainLoad мы сразу же переместимся SunnyPageForm. То есть в главную форму программы, по стандарту она может называться Form1, в нашем же случае разработчик назвал её так (Это информация чисто для совсем начинающих пользователей).

newxss-6.jpg


newxss-7.jpg

Ну и теперь давайте подумаем как действовать далее, покажу еще один стандартный способ что зачастую помогает и упрощает задачу. Можно попробовать поискать кнопку Регистрация и посмотреть где она используется. То есть в каких функциях вызывается, поищем взаимосвязь. Искать будем по всему коду SunnyPageForm.

newxss-8.jpg


newxss-9.jpg

То есть мы нашли текстовую переменную buttonItem_ProgramRegistration и теперь давайте посмотрим где она используется. Вводим в поиск ProgramRegistration и смотрим на список, нас интересует именно buttonItem_ProgramRegistration_Click. Почему ?, да именно потому что при нажатии на кнопку там явно что то происходит. Тем более что само название уже само за себя говорит.

newxss-10.jpg

Кликаем левой кнопкой мыши и переходим внутрь. При нажатии на кнопку у нас идет вызов формы регистрации (активации) программы SunnyPageForm_ShowRegistrationForm(). И выходя из логики, уже понятно, там происходят манипуляции с лицензией. Давайте посмотрим что именно и разберем принцип активации. Кликаем по ShowRegistrationForm.

newxss-11.jpg

И смотрим что проверка (вызов) активации идет уже из динамической библиотеки SPL.dll. Что расположена в той же папке что и исполняемый файл программы SunnyPage.exe. На картинке, в свойствах, я специально это показал. То есть логика уже примерно понятна, теперь продолжаем дальше анализировать.

newxss-12.jpg


Ну а теперь давайте посмотрим что за действия у наш происходят в Main в нашем SPL.dll. Первое что бросается в глаза что из реестра Windows читаются данные активации, ключ. То есть уже становится понятно что ключ активации программа записывает в реестр (в CodeForProgram). А если кликнуть по strRegKey и перейти то можно увидеть полный путь.

newxss-13.jpg


newxss-14.jpg

То есть ключ активации, в случае если он верный, записывается в реестр по такому адресу HKEY_CURRENT_USER\Software\DayLight\SunnyPage 3.0\CodeForProgram. Хорошо, это выяснили, идем далее. А если перейти в RegistrationComponent и подняться буквально на пару строк выше то мы увидим вот такую функцию как GetCode. Как вы думаете что это такое ?

newxss-15.jpg


newxss-16.jpg

Полный код функции GetCode
C#:
private void GetCode(object tB_Text)
{
    if (tB_Text == null)
    {
        return;
    }
    string text = (string)tB_Text;
    if (this.CodeStr[0].IndexOf("777888777") != -1)
    {
        this.CodeStr[1] = this.CodeStr[0];
        return;
    }
    if (this.PupleCode.IndexOf("777888777") != -1 && this.PupleCode.IndexOf("17425156722") == -1)
    {
        this.CodeStr[1] = this.PupleCode;
        return;
    }
    text = text.Replace('0', '5');
    text = text.Replace('1', 'e');
    text = text.Replace('2', '9');
    text = text.Replace('3', 's');
    text = text.Replace('4', '1');
    text = text.Replace('5', 'i');
    text = text.Replace('6', '3');
    text = text.Replace('7', 'w');
    text = text.Replace('8', '0');
    text = text.Replace('9', 'u');
    text = text.Replace('A', 'D');
    text = text.Replace('B', 'G');
    text = text.Replace('C', 'H');
    text = text.Replace('D', 'S');
    text = text.Replace('E', 'B');
    text = text.Replace('F', 'U');
    text = text.Replace('G', 'X');
    text = text.Replace('H', 'O');
    text = text.Replace('I', 'P');
    text = text.Replace('J', 'A');
    text = text.Replace('M', 'N');
    text = text.Replace('X', 'J');
    text = text.Replace('O', 'M');
    text = text.Replace('Y', 'R');
    text = text.Replace('L', 'V');
    text = text.Replace('V', 'I');
    this.CodeStr[1] = text;
}

Правильно!, это алгоритм по которому проверяется (генерируется) ключ активации для программы. Давайте же поставим точку останова в начале функции и
посмотрим (под отладчиком) как у нас отработает функция и какой результат выдаст в конце. Какой принцип работы функции, тут все очень просто.

Gif анимация не поместилась в тему, ОБЯЗАТЕЛЬНО скачать и посмотреть: ;)
Скрытый контент для зарегистрированных пользователей.
А именно:
В переменную tB_Text программа получает идентификатор компьютера. В мое случае это значение tB_Text = "30176294". После этого идут манипуляции с ID вашего компьютера, замена значений. И после того как функция отработала и завершила работу в this.CodeStr[1] = в переменную text мы получаем готовый ключ активации. В моем случае это siew3uu1

newxss-17.jpg

Давайте проверим как поведет себя программа при вводе полученного ключа активации. Запускаем программу, переходим в меню активации и вводим полученный ключ с под отладчика, то есть siew3uu1. Как видим программа благодарит нас за покупку и в информации о лицензии у нас красуется надпись - Лицензирована.

newxss-18.jpg


newxss-19.jpg

То есть таким способом, не внося никаких изменений в структуру кода программы, мы с под отладчика сгенерировали ключ активации. Нам никто не мешает написать свой генератор ключей активации и я покажу как это можно сделать. Для примера KeyGen я напишу на Delphi (опишу логику, прикреплю к статье исходник и уже скомпилированный файл exe).

Написание KeyGen, логика действий.
  1. На форму программы мы разместим два компонента Edit и одну кнопку.
  2. В поле ID PC мы будем вводить наш идентификатор пк, тот что покажет программа.
  3. В поле Ключ нам будет генерироваться ключ активации программы.
  4. Ну и кнопка Generate key в которой будет размещен наш код.

newxss-20.jpg


Теперь давайте составим, аналогичный программе, алгоритм генерации ключа. Переходим к нашей кнопке Generate key и пишем код.

Пояснения к переменным
  1. в var - объявим список переменных. В нашем случае у нас использоваться будет только одна переменная типа String.
  2. s := idPC.Text - Копируем данные (в нашем случае это наш ID PC полученный в программе) из визуального компонента idPC : Edit в переменную S.
  3. В переменной S (строковой тип данных) - происходит генерация ключа, то есть замена символов.
  4. И в финале происходит вывод результат в визуальный компонент Key : Edit. То есть что бы мы увидели сгенерированный ключ.
  5. StringReplace - функция для замены первого или всех вхождения подстроки. В результате функции возвращает уже измененную строку.
  6. rfReplaceAll - замена все вхождений, то есть проход по всей строке. Если этот флаг убрать то тогда генерация ключа не будет соответствовать условию и мы получим неверные данные.
newxss-21.jpg

В итоге мы видим что для Id компьютера: 30176294 мы сгенерировали такой же ключ активации siew3uu1 как и с под отладчика. То есть созданный алгоритм работает правильно, но это еще не все.

Теперь давайте перейдем в реестр Windows и посмотрим куда записывает данные программа. Выше мы выяснили что по адресу HKEY_CURRENT_USER\Software\DayLight\SunnyPage 3.0\CodeForProgram программа записывает ключ активации и там же его проверяет. Давайте это посмотрим, заходим в мею Вуск - Выполнить и вводим команду Regedit. И после переходим по указанному пути в реестре Windows. Теперь мы можем посмотреть где записывается ключ активации программы. Если это значение удалить или изменить то Вы получите сообщение о том что что программа не зарегистрирована, что логично.

newxss-22.jpg


newxss-23.jpg


newxss-24.jpg

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

Вторая программа, которую мы будем анализировать, это TimеSnaрper (http://www.timesnapper.com/).
Это программа для записи действий на вашем компьютере, создавая при этом скриншоты (может воспроизводить записанное в виде видео). Для кого то будет полезная программа. В двух словах рассказал для чего программа и теперь приступим к анализу защиты.

Сначала, по стандарту, как и с предыдущей программой, закинем её в утилиту Exeinfo PE что бы посмотреть информацию по исполняемому файлу программы.

И получаем информацию
  1. Имя исполняемого файла, в нашем случае: TimeSnapper.exe
  2. Разрядность: утилита не определила, но установка программы идет по стандарту в C:\Program Files (x86)\TimeSnapper. Значит это 32 разрядное (32-битное) приложение Windows .
  3. Язык программирования и есть ли упаковка (сжатие), защита на исполняемом файле: В нашем случае MS Visual C# / Basic.NET. То есть защиты в виде обфускатора для .net приложений нет.
  4. Ну и последний пункт: Тут идут всегда рекомендации по использованию инструмента по отладке, деобфускации. Нам советуют использовать NET Reflector, но будем мы DnSpy.
Info2.jpg


Запуская программу, у нас, зразу же загружается форма с выбором триального периода и возможность активировать программу колючем (в том случае если мы купили этот ключ у разработчика). Ясное дело что ключ никто покупать не будет а форма активации поможет нам понят принцип регистрации программы. Ну и снова же, нужно выяснить активация офлайн или онлайн ?. Для этого давайте, параллельно, проверим не стучит ли в интернет (на сайт разработчика), наша программа, при вводе ключа активации.

В этом нам поможет HTTP Analyzer что производит мониторинг http \ https трафика, в режиме реального времени. Можно использовать и другой инструмент кому как удобно.

Порядок действий такой
  1. Сначала запускаем HTTP Analyzer, когда он запуститс то нажимаем кнопку Start.
  2. После этого запускаем нашего пациента TimеSnaрper.exe. И в форму активации вводим (Любой, выдуманный) ключ активации, но определенного формата.
  3. Почему так, да потому что программа нам подсказывает (показывает пример ключа) и проверяет введенный ключ по правилам. Если ключ ввести просто 111111 то запроса не сервер разработчика не будет а мы получим сообщение с ошибкой.
newxss-25.jpg

После того как ввели ключ активации (я ввел такой ASDE 2323 SDFR 4567) и нажали на кнопку Activate! у нас сработал наш сниффер. То есть HTTP Analyzer
отловил обращение программы к сайту разработчика . Ну и что мы замечаем и какой вывод можно сделать ?. Все просто, от сервера идет ответ что этот ключ
не распознан
, то есть программа нам говорит до свидание. :cool:

newxss-26.jpg

Но программу можно запустить в режиме триал, по истечении которого она перестанет работать.

newxss-27.jpg

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

newxss-28.jpg

Тут у нас инициализируются предстартовые настройки программы. Проще говоря - подготовка работы программы.

newxss-29.jpg


А далее, сразу же, идет функция CheckLicenseFile() - проверка файла-лицензии, которого у нас нет.

newxss-30.jpg

И сразу же после неё идет функция TrialInProgress в которой и решается судьба нашей программы. То есть активация триала или лицензии, ну и
становится понятно что пробный период, в программе, предоставляется только на 30 дней.

newxss-31.jpg


Мы можем конечно же заморозить trial (пробную версию), то есть перейти в ActiveTrialRemaining и изменить код функции. Но смысла этого делать не вижу, так как наша цель сделать программу полнофункциональной (убрав все лишние окна и предупреждения). Для этого переходим в ActiveLicense (клик левой кнопки мыши) и смотрим код внутри функции.

newxss-32.jpg

А у нас тут ничего особенного а просто присутствуют проверка: Ключа активации, ID, ну и даты. И эта функция вызывается с TrialInProgress и
является основной. То есть она принимает решение быть активации или нет, тогда её можно отредактировать. Как именно ?. Да все очень просто,
что бы она всегда говорила остальным кускам кода все ОК, то есть True. А если поточнее то изменить весь код на "return true;". То есть не зависимо от условия программа должна быть активированной и точка.

newxss-33.jpg

Давайте это проверим, сохраним изменения и запустим программу и посмотрим что получилось. А получилось то что все триальные окна и проверки просто исчезли, как и меню активации лицензии.

newxss-34.jpg

Желаемого успеха мы добились , но остался еще небольшой приятный момент. А именно давайте же вмонтируем авторство кряка и кликабельную
ссылку на форум xss.pro в программу. К примеру отредактируем окно About в программе.

newxss-35.jpg

Для этого ищем где используется About и после ищем ссылку на "timesnapper.com". Первое что правим это название ссылки и второе это адрес ссылки на свои. В моем случае я исправил на:
  • this.linkWebsite.Text = "Статья 6 - xss.pro";
  • Common.StartDefaultWebBrowser("
    https://xss.pro/
    ");
newxss-36.jpg


newxss-37.jpg

Сохраняем результат, запускаем программу, заходим в About и смотрим на результат. И теперь при нажатии на "Статья 6 - xss.pro" нас перебросит по ссылке
xss.pro. Думаю для общего познания, особенно для новичков, будет очень даже полезно. Ну и по этой программе также все разобрали, ничего сложного, главное внимание и упорство.

newxss-38.jpg

В итоге:
Анализируя программу не нужно никогда спешить и делать правки бездумно, так вы потратите только время, в некоторых случаях, не добьетесь даже результата. Нужно
тренироваться и делать ошибки, главное понимать что именно вы делаете, какую функцию или часть кода правите. И тогда удача будет на Вашей стороне а опыт придёт со временем.

Всем спасибо за внимание, продолжение следует. :)

В архиве, скриншот:
newxss-39.jpg


Наши пациенты / virustotal:
SunnyPage.exe / virustotal:
https://www.virustotal.com/gui/file/b9e43ae9bfab321fe5b17ace11d03b460f1d7857d23e1aaba203f89680c8ff44
HelpCreator / virustotal: https://www.virustotal.com/gui/file/327d8c80c064c7c2a0cd75a61c6f245809641d7c960904f1e8bcd4f9f6b80dbd
Project1.exe (KeyGen) / virustotal:
Инструменты для анализа:
HttpAnalyzer / virustotal:
https://www.virustotal.com/gui/file/f25541dee8f859b62c642d2e6e835c247900b5bc94a00cdbc4d894bab83796dd
dnSpy x32 / virustotal: https://www.virustotal.com/gui/file/7ce05f1aafaaa87d046bbad1b07801777e724251b084bc7f70cef71c98b08105
dnSpy x64 / virustotal: https://www.virustotal.com/gui/file/cc15f3f7836f5c976e058aabdd55af8635b484a6b9a5e94a2cb048856965f9e2
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd

Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
 
Сейчас я двигаюсь в направлении реверса одного языка программирования - это С# не за того что это проще а за того чтобы у всех новичков была основа. Если же начать с самого сложного то и смысла бы в цикле статей бы не было. В будущем еще рассмотрим много направлений и языков программирования (на практике) а также напишем не одну вспомогательную утилиту. Надеюсь моя цель понятна, поэтому усаживайтесь поудобней и начнем.
Вот просто большое человеческое спасибо за Вашу работу! :) Удачи и, думаю, как и многие жду продолжения!
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх