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

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

-EXE-

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

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

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

Перед тем как начну, скажу несколько слов об ограничениях. В данном случае сам разработчик нам говорит о ограничениях программы.
Что она условно бесплатная и если перейти на сайт разработчика http://phpobfuscator.net/download.html и попробовать скачать, то Вас сразу ставят перед фактом что программа не бесплатная и имеются ограничения.

Рис1.jpg

В демонстрационном режиме программа может провести обфускацию кода только 5 файлов php - одновременно. Если у Вас не большой проект, то понятно что и
демонстрационной версии хватит и покупать ничего не нужно. А если у Вас большой проект то соответственно - купите :), лозунг разработчика. :smile50:

В данном случае нам известны ограничения программы что уже упрощает сам процесс, в принципе. Далее нам понадобится только внимание и немного знания структуры кода, на чем написана программа.

Для того что бы продолжить нам нужно:
  • Определить на чем написана наша программа (Среда программирования) и узнать защищена ли каким то протектором, упаковщиком, обфускатором программа. Что бы в итоге выбрать - подходящий отладчик для работы.
  • Узнать разрядность программы, (32-битное) или (64-битное) приложение. И уже в зависимости от этого использовать отладчик под нужную нам разрядность.

Эту информацию можно узнать используя утилиту ExeInfo PE. В двух словах это - что дает возможность смотреть информацию о файле. Как использовать эту программу, да очень просто. Нужно на форму программы перетащить исследуемый файл (пациент) и после этого, в окне ExeInfo PE Вы - получите всю информацию.
На примере нашей программы Src Protector. Устанавливаем программу, заходим в папку с установленной программой и после файл srcProtector.exe перетянуть на форму ExeInfoPE. После этого у Вас отобразиться информация

Рис2.jpg

  1. Имя анализируемого файла: srcProtector.exe
  2. Разрядность: 32 разрядное (32-битное) приложение Windows
  3. Упакован ли файл и на чем написан: В нашем случае MS Visual C#
  4. И последний пункт, это как рекомендация: использовать в роли отладчика Net Reflector 11

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

А в качестве отладчика я выбрал программу DnSpy, как для меня так очень удобная вещь для обратного проектирования net сборок. Можно использовать и другие инструменты для анализа и правок кода. Но в данном случае я показываю на примере DnSpy.

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

Рис3.jpg

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

Рис4.jpg


Запускаем DnSpy x32, поскольку Мы Выяснили выше что наше приложение 32-битное. Когда отладчик запуститься, поначалу для тех кто с ним не работал будет не привычно, полно всяких вкладок и что куда не понятно. Но все бывает первый раз, так что продолжаем работу. Понятно что для опытных людей мои слова звучат очень просто. Но для тех кто видит все в первую, будет очень полезно и познавательно ознакомиться с статьей. Сейчас я все как на пальцах покажу и расскажу максимально простыми словами, так что разобраться будет не сложно.

Рис5.jpg

После этого перетаскиваем файл программы srcProtector.exe на форму DnSpy.

Рис6.jpg

Обычно что бы проанализировать по какому принципу работает активация программы нам нужно найти, перейти на точку входа. Точка входа это адрес, именно с которого начинается выполнения программы. То есть запуск, инициализация функций, процедур (Говоря простыми словами). Для этого нажимаем правой кнопкой нашей мышки по нашему файлу в DnSpy и нажимаем перейти к точке входа. Далее у нас раскрывается дерево с разными функциями (назовем это так ;), для того что бы был понятен смысл проделанного, даже новичкам).

Рис7.jpg


И сейчас я покажу один из примеров поиска нужных функций и связывания их между собой. А также рассмотрим принцип поиска - проверки лицензии. В открывшемся списке мы замечаем интересный класс license.

Рис8.jpg


Кликнув по нему мы видим что поля Email и Serial используются в классе license, это уже первая зацепка, поскольку мы уже знаем что эти поля используются для активации программы . А строки public string email, public string serial и public string verification это просто значения (Условно говоря).

Рис9.jpg


И что в такой ситуации делать далее ? Все очень просто, давайте попробуем через поиск DnSpy прописать license и посмотрим в каких функциях используется это строчка.
После завершения поиска у нас появится список функций.

Рис10.jpg


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

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

  1. С начала идет проверка файла лицензии if (File.Exists("license")) на существования.
  2. Если нет лицензии if (this.lic.verification == null) то по стандарту активируется Демонстрационный режим.
  3. Также есть проверка введенных данных HTTPRequest httprequest = new HTTPRequest - через сайт разработчика, как я и предпологал выше. Принцип действия таков - Введенные данные Email и Серийный номер отправляются на сервер и если данные верные, есть на сайте разработчика ТО и тут ОБРАТИТЬ ВНИМАНИЕ:

нам в в открытом виде показано что программа активируется, в случае если Ваши данные верны то лицензия становится полноценной, без ограничений .
C#:
this.mode = "full";
this.liclbl.Text = "License activated";

Рис11.jpg


Полностью функция для ознакомления:
C#:
private void LoadLicense()
        {
            if (File.Exists("license"))
            {
                Stream stream = File.Open("license", FileMode.Open);
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                this.lic = (license)binaryFormatter.Deserialize(stream);
                stream.Close();
                this.email.Text = this.lic.email;
                this.serial.Text = this.lic.serial;
            }
            if (this.lic.verification == null)
            {
                this.mode = "demo";
                this.liclbl.Text = "Demo mode";
            }
            else
            {
                try
                {
                    HTTPRequest httprequest = new HTTPRequest("http://p-encoder.com/licensing.php", "POST", "email=" + this.email.Text + "&serial=" + this.serial.Text);
                    if (httprequest.GetResponse() == this.genLicenseVerification(this.email.Text, this.serial.Text))
                    {
                        this.lic.verification = this.genLicenseVerification(this.email.Text, this.serial.Text);
                        this.mode = "full";
                        this.liclbl.Text = "License activated";
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("License verification failed! You have entered incorrect license information or your license has expired.");
                        this.lic.verification = null;
                    }
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("Your license cannot be verified, check your internet connection or firewall settings.");
                }
            }
        }


А вот теперь можно крутить кодом функции как угодно. И я сейчас Вам покажу способ как можно Выйти из ситуации. Самый простой способ, можно назвать, минимальное вмешательством в код. ;) А именно как Вы думаете что будет если проверку if (this.lic.verification == null) отредактировать так
что бы программа даже если не прошла проверку онлайн чувствовала себя как рыба в воде. А для этого мы правим параметр demo на full и Demo mode на License activated. Для этого нажимаем правой кнопкой мышки по функции. И выбираем Изменить инструкции IL.

Рис12.jpg


Рис13.jpg


И теперь что наша функция изменилась вот так. Та есть при старте, даже если нет ключа активации, программа уже активирована и на проверки со стороны сервера ей уже глубоко фиолетово.
C#:
private void LoadLicense()
        {
            if (File.Exists("license"))
            {
                Stream stream = File.Open("license", FileMode.Open);
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                this.lic = (license)binaryFormatter.Deserialize(stream);
                stream.Close();
                this.email.Text = this.lic.email;
                this.serial.Text = this.lic.serial;
            }
            if (this.lic.verification == null)
            {
                this.mode = "full";
                this.liclbl.Text = "License activated";
            }
            else
            {
                try
                {
                    HTTPRequest httprequest = new HTTPRequest("http://p-encoder.com/licensing.php", "POST", "email=" + this.email.Text + "&serial=" + this.serial.Text);
                    if (httprequest.GetResponse() == this.genLicenseVerification(this.email.Text, this.serial.Text))
                    {
                        this.lic.verification = this.genLicenseVerification(this.email.Text, this.serial.Text);
                        this.mode = "full";
                        this.liclbl.Text = "License activated";
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("License verification failed! You have entered incorrect license information or your license has expired.");
                        this.lic.verification = null;
                    }
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("Your license cannot be verified, check your internet connection or firewall settings.");
                }
            }
        }

Рис14.jpg



А теперь давайте сохраним файл, с нашими правками и посмотрим что у нас получилось. Нажимаем на пункт меню Файл и сохранить Все.

Рис15.jpg


А получилось у нас то что программа запустилась уже в активированном виде и при загрузке больше 5 файлов нет никаких сообщений. И теперь можно хоть и 100 файлов загрузить.

Рис16.jpg


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

Рис17.jpg

Так как я Автор статьи то позволю себе вписать вот такие регистрационные данные: К примеру там где почтовый ящик Cracked by -EXE- xss.pro а ключ xss.pro-xss.pro-xss.pro а вот функцию проверки (лицензии) через интернет можно смело убрать, вырезать с кода, потому что от неё толку уже нет никакого. И в финале с громадной функции активации, которую я привел выше, у нас все сократилось до 4 строк ;). Первые две строки активируют полную лицензию, а вторые две строки это поле Email и Ключ активации что отображаются в информации о лицензии, для красоты, скажем так.

Рис18.jpg


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

Рис19.jpg

А еще в самом коде программы (Если поковырять) то имеются вот такие куски кода, причем встречается в двух местах так точно:

Рис20.jpg


C#:
if (this.mode == "demo" && this.files.Items.Count + list.Count > 5)

    {

        this.files.Items.Clear();

        int num = list.Count - 5;

        if (num > 0)

        {

            list.RemoveRange(5, list.Count - 5);

        }

        else

        {

            list.Clear();

        }

        System.Windows.MessageBox.Show("Demo mode is limited to analyze and encode only maximum number of 5 files. Buy a license to process more files.");

Понимаете о чем это говорит ? Тут все очень просто, если изменить число 5 на 50 или 50 000 то и столько программа сможет обрабатывать файлов.
Или же просто убрать эти проверки. Тут главное включить фантазию а пример что я показал Вам Выше только учит думать логически.

Ну и теперь подведу итоги. ;)

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

Файлы, к статье прилагаются (Хотя все эти инструменты есть на официальных источниках)
В архиве у нас, скриншот:
Рис21.jpg


Наш пациент (Программа Src Protector)/ virustotal: dnSpy x32 / virustotal: https://www.virustotal.com/gui/file/937de02ba7a3522404b82fa09acece6a3063c40df760ba4fc6a3344083d5eb12
dnSpy x64 / virustotal: https://www.virustotal.com/gui/file/bc1c4e0fc49c138bbfc223d3e94231cd4884439c663646d91e48fa005df6704a
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd

Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
 
Спасибо за статью, понравилось
На этом не останавливаюсь, будет продолжение курса, это только первая статья.
годно. но все же хотелось бы пример с обходом каких-нибудь .net протекторов
Планирую и в этом направлении выпустить статьи. Постараюсь показать, разжевать все предельно понятно.

В каждой части курса будет рассмотрена определенная программа, и варианты крякинга. Благодарен за отзыв ребята. :smile10:
 
Спасибо за статью! Новичкам в самый раз! Кстати dnspy как по мне намного удобнее чем дотпик или ilspy
 
Хорошая статья. Видно, что автор в теме, поэтому и излагает просто и понятно.
Только зачем рекомендовано использовать в роли отладчика .NET Reflector,
если в статье описан реверс с DnSpy ?
 
Хорошая статья. Видно, что автор в теме, поэтому и излагает просто и понятно.
Только зачем рекомендовано использовать в роли отладчика .NET Reflector,
если в статье описан реверс с DnSpy ?
Тут имеется в виду что утилита ExeInfo PE рекомендует, по стандарту советует использовать Net Reflector. Я же показываю в DnSpy, он удобней и новичкам будет проще разобраться.
 
Посмотрел я на эту программу... При нажатии на кнопку Activate лицензия сама по себе активируется... Фиг знает, скорее всего за полгода они там забили на это.
 


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