Приветствую всех пользователей данного форума. И сегодня начну цикл статей по реверсингу (исследованию) различных программ. А если Вам еще и понравиться статья то следующие Вы увидите очень скоро.
Сегодняшний наш пациент это Src Protector. Это программа для обфускации (защиты) кода PHP. Основной функционал программы - делает не читаемый
код (функции, переменные, классы) ну и еще несколько примочек от разработчика. Было бы все хорошо если бы софт был бесплатный, ведь каждый из нас любит шару, халяву по народному говоря.
Перед тем как начну, скажу несколько слов об ограничениях. В данном случае сам разработчик нам говорит о ограничениях программы.
Что она условно бесплатная и если перейти на сайт разработчика http://phpobfuscator.net/download.html и попробовать скачать, то Вас сразу ставят перед фактом что программа не бесплатная и имеются ограничения.
В демонстрационном режиме программа может провести обфускацию кода только 5 файлов php - одновременно. Если у Вас не большой проект, то понятно что и
демонстрационной версии хватит и покупать ничего не нужно. А если у Вас большой проект то соответственно - купите

В данном случае нам известны ограничения программы что уже упрощает сам процесс, в принципе. Далее нам понадобится только внимание и немного знания структуры кода, на чем написана программа.
Для того что бы продолжить нам нужно:
- Определить на чем написана наша программа (Среда программирования) и узнать защищена ли каким то протектором, упаковщиком, обфускатором программа. Что бы в итоге выбрать - подходящий отладчик для работы.
- Узнать разрядность программы, (32-битное) или (64-битное) приложение. И уже в зависимости от этого использовать отладчик под нужную нам разрядность.
Эту информацию можно узнать используя утилиту ExeInfo PE. В двух словах это - что дает возможность смотреть информацию о файле. Как использовать эту программу, да очень просто. Нужно на форму программы перетащить исследуемый файл (пациент) и после этого, в окне ExeInfo PE Вы - получите всю информацию.
На примере нашей программы Src Protector. Устанавливаем программу, заходим в папку с установленной программой и после файл srcProtector.exe перетянуть на форму ExeInfoPE. После этого у Вас отобразиться информация
- Имя анализируемого файла: srcProtector.exe
- Разрядность: 32 разрядное (32-битное) приложение Windows
- Упакован ли файл и на чем написан: В нашем случае MS Visual C#
- И последний пункт, это как рекомендация: использовать в роли отладчика Net Reflector 11
Думаю тут все предельно понятно, главное внимательно все читать и проблем не возникнет. После того как мы собрали нужную информацию можем приступить приручению нашего пациента.
А в качестве отладчика я выбрал программу DnSpy, как для меня так очень удобная вещь для обратного проектирования net сборок. Можно использовать и другие инструменты для анализа и правок кода. Но в данном случае я показываю на примере DnSpy.
Но сначала мы просто запустим нашего пациента (анализируемую программу) и попробуем в неё загрузить более 5 файлов, что бы посмотреть как поведет себя программа в живую, так сказать
Идем далее, посмотри на форму активации программы. Переходим на вкладку license и видим что для активации программы нужно ввести данные активации - Почтовый ящик и Ключ (Email + Serial). Обычно, это может говорить о том что программа проверяет регистрационные данные у себя на сервере. Но отчаиваться в таких ситуациях не стоит и думать что софт уже не ломаемый, если проверка идет с сервера. Основная масса разработчиков все равно допускает типичные ошибки в защите, так что двигаемся дальше.
Запускаем DnSpy x32, поскольку Мы Выяснили выше что наше приложение 32-битное. Когда отладчик запуститься, поначалу для тех кто с ним не работал будет не привычно, полно всяких вкладок и что куда не понятно. Но все бывает первый раз, так что продолжаем работу. Понятно что для опытных людей мои слова звучат очень просто. Но для тех кто видит все в первую, будет очень полезно и познавательно ознакомиться с статьей. Сейчас я все как на пальцах покажу и расскажу максимально простыми словами, так что разобраться будет не сложно.
После этого перетаскиваем файл программы srcProtector.exe на форму DnSpy.
Обычно что бы проанализировать по какому принципу работает активация программы нам нужно найти, перейти на точку входа. Точка входа это адрес, именно с которого начинается выполнения программы. То есть запуск, инициализация функций, процедур (Говоря простыми словами). Для этого нажимаем правой кнопкой нашей мышки по нашему файлу в DnSpy и нажимаем перейти к точке входа. Далее у нас раскрывается дерево с разными функциями (назовем это так
И сейчас я покажу один из примеров поиска нужных функций и связывания их между собой. А также рассмотрим принцип поиска - проверки лицензии. В открывшемся списке мы замечаем интересный класс license.
Кликнув по нему мы видим что поля Email и Serial используются в классе license, это уже первая зацепка, поскольку мы уже знаем что эти поля используются для активации программы . А строки public string email, public string serial и public string verification это просто значения (Условно говоря).
И что в такой ситуации делать далее ? Все очень просто, давайте попробуем через поиск DnSpy прописать license и посмотрим в каких функциях используется это строчка.
После завершения поиска у нас появится список функций.
Давайте рассмотрим первую LoadLicense, а после и остальные функции (Я это не просто так говорю, немного забегая наперед).
Ну я немного прокомментирую что тут происходит, в этой функции. А происходят тут очень простые вещи, я бы сказал, пример как не нужно защищать свою программу. Ну а теперь более подробно и по порядку опишу алгоритм действий.
- С начала идет проверка файла лицензии if (File.Exists("license")) на существования.
- Если нет лицензии if (this.lic.verification == null) то по стандарту активируется Демонстрационный режим.
- Также есть проверка введенных данных HTTPRequest httprequest = new HTTPRequest - через сайт разработчика, как я и предпологал выше. Принцип действия таков - Введенные данные Email и Серийный номер отправляются на сервер и если данные верные, есть на сайте разработчика ТО и тут ОБРАТИТЬ ВНИМАНИЕ:
нам в в открытом виде показано что программа активируется, в случае если Ваши данные верны то лицензия становится полноценной, без ограничений .
C#:
this.mode = "full";
this.liclbl.Text = "License activated";
Полностью функция для ознакомления:
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.");
}
}
}
А вот теперь можно крутить кодом функции как угодно. И я сейчас Вам покажу способ как можно Выйти из ситуации. Самый простой способ, можно назвать, минимальное вмешательством в код.
что бы программа даже если не прошла проверку онлайн чувствовала себя как рыба в воде. А для этого мы правим параметр demo на full и Demo mode на License activated. Для этого нажимаем правой кнопкой мышки по функции. И выбираем Изменить инструкции IL.
И теперь что наша функция изменилась вот так. Та есть при старте, даже если нет ключа активации, программа уже активирована и на проверки со стороны сервера ей уже глубоко фиолетово.
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.");
}
}
}
А теперь давайте сохраним файл, с нашими правками и посмотрим что у нас получилось. Нажимаем на пункт меню Файл и сохранить Все.
А получилось у нас то что программа запустилась уже в активированном виде и при загрузке больше 5 файлов нет никаких сообщений. И теперь можно хоть и 100 файлов загрузить.
Это все хорошо, замечательно и можно оставить как есть
Так как я Автор статьи то позволю себе вписать вот такие регистрационные данные: К примеру там где почтовый ящик Cracked by -EXE- xss.pro а ключ xss.pro-xss.pro-xss.pro а вот функцию проверки (лицензии) через интернет можно смело убрать, вырезать с кода, потому что от неё толку уже нет никакого. И в финале с громадной функции активации, которую я привел выше, у нас все сократилось до 4 строк
Сохраняем изменения снова и получаем результат, при запуске программа также активирована. А в информации о лицензии отображаются данные активации, в нашем случае - мои. Смотрится красиво, нет никаких ограничений
А еще в самом коде программы (Если поковырять) то имеются вот такие куски кода, причем встречается в двух местах так точно:
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 то и столько программа сможет обрабатывать файлов.
Или же просто убрать эти проверки. Тут главное включить фантазию а пример что я показал Вам Выше только учит думать логически.
Ну и теперь подведу итоги.
В целом подобные методы защиты программного обеспечения называются не защитой а просто красивой показухой. Тем более что разработчик софта не потрудился даже провести обфускацию кода. Но это ничего бы не изменило так как имея знания, время и это не спасет. Если Вам понравилась статья, то Я обязательно буду публиковать еще, делиться опытом. Всем хорошего настроения!
Файлы, к статье прилагаются (Хотя все эти инструменты есть на официальных источниках)
В архиве у нас, скриншот:
Наш пациент (Программа 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
Файлы к статье:
mega.nz
В архиве у нас, скриншот:
Наш пациент (Программа Src Protector)/ virustotal:
dnSpy x64 / virustotal: https://www.virustotal.com/gui/file/bc1c4e0fc49c138bbfc223d3e94231cd4884439c663646d91e48fa005df6704a
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd
Файлы к статье:
Скрытый контент для зарегистрированных пользователей.

