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

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

-EXE-

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


Автор статьи: -EXE- (Профиль: https://xss.pro/members/275453/)
Статья для форума: xss.pro
В продолжении, цикла статей, по реверс-инжиниринг для начинающих, предлагаю ознакомится с 15 статьей. В этой статье мы рассмотрим не одну интересную защиту.
До этого мы сталкивались с разными защитами, но в этой есть свои особенности, которые я покажу. Скажем так, у каждой, из сегодняшних программ - не обычная реализация защиты. И в предыдущих статьях, мы не сталкивались с подобными алгоритмами, поэтому материал будет полезный. Для примера, бывают ситуации: когда, при анализе - вы уверены что защиту разобрали и осталось сделать несколько правок (изменений в коде). А после внесения, этих же, изменений - запускаете программу а она не запускается или выдает ошибки в виде сообщений, разного рода. При этом, система защиты построена так: Что сам вывод этих сообщений (об ошибке), настроен на то: что бы вас запутать. Конечно же, имея не большую практику, в подобных делах, вы начинаете путаться. После чего думать что, все таки, сделали что то не так и возвращаетесь к началу, снова анализируете, копаетесь в коде, что бы понять в чем причина.

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

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

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

st-15-0.jpg

Давайте рассмотри защиту первой программы NetSpot 2.16.822.0 (Официальный сайт: https://www.netspotapp.com/ru/netspotpro.html).
Это профессиональная программа для исследования беспроводных сетей: анализа Wi-Fi, улучшения сети для Windows и Mac OS X. С полным описанием вы
можете ознакомится на официальном сайте. А сейчас будем разбирать её защиту, так как она у нее, не стандартная (я бы сказал, забегая немного наперед).

Не смотря на то что: на программе нет дополнительной защиты (обфускатор, пакер, протектор), как показывает, вспомогательная утилита, ExeInfo PE - программа может показать зубы. ;)

st-15-1.jpg

Такого плана защиту мы еще не разбирали, так что сегодня будет интересно. Для начала перейдем на официальный сайт программы и посмотрим что там говорится о ограничениях бесплатной версии. Как я ранее говорил, такую информацию не пропускаем и всегда читаем, что бы на начальном этапе понимать с чем мы имеем дело. В итоге, нам удалось узнать, что в программе, имеется, несколько типов лицензии и все. А вот, информацию (какие то подробности) касательно принципа активации, нам (особо) - не предоставили.

st-15-2.jpg

Ничего страшного, тогда давайте запустим программу и посмотрим на последовательность событий, при запуске. А при запуске программы, загружается форма активации. В которой нам сообщают о том что: если мы хотим разблокировать следующие функции то нам нужно обновить лицензию. При этом, как мы обычно делаем, давайте проверим (сражу же) нет ли подключения программы к своему сайту (серверу), для проверки лицензии. Если нет то отлично, если есть то уже будем действовать выходя из ситуации. HTTP Analyzer, что производит мониторинг https \ http трафика в режиме реального времени, молчит при запуске программы. Также если, банально, отключить интернет то софт - запускается и просит активацию. Значит делаем вывод (предположительно) что: Никакой проверки, обращения, к своему сайту - нет. Можете это сами проверить, в предыдущих статьях я показывал как пользоваться программой HTTP Analyzer (Ничего сложного нет).

Обращаю ваше внимание: Все наши мысли строятся, только, на предположении, предварительно, проверив то что нам под силу, на данный момент. На предположении за того что: В любой момент ситуация может изменится. И веду это к тому что: бывают ситуации, когда софт не сразу обращается к своему серверу (сайту) а спустя определенный период времени. В таких ситуациях, все зависит, от фантазии разработчика, как он запрограммировал систему защиты. Так что, всегда нужно анализировать и разбирать все - индивидуально. С подобными ситуациями мы, также, будем сталкиваться. Ну и замечаем что при нажатии на кнопку "Activate" - нам предлагают ввести лицензионный ключ (Чего и стояло бы ожидать).
А мы продолжим.

st-15-3.jpg

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

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

А при выполнении (запуске) возможны условия (если они заданы программистом). То есть, например, если ключ лицензии неверный то, если нет подключения к сети то, если контрольная сумма не соответствует заданной то и так далее. Это я навел примеры (условия) что могут возникать при загрузке приложения, это не весь список, чисто для понимания логики. То есть: Если приложение запускается с условиями активации, значит мы начинаем копать с точки входа а там уже выходя из ситуации. Это один из возможных подходов.

Эти слова не просто так сказаны, я подсказываю по делу, что бы вы понимали логику происходящего. Переходим к точке входа, программы (Правой кнопкой, мыши, по программе в отладчике DnSpy - перейти к точке входа).

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

Для общего понимания, для простоты, если прямо сказать (Условные обозначения на картинке, ниже):
1. Точка входа у нас тут.
2. Список функций что, по разному, взаимодействуют между собой.
3. Функция, что нам интересна, судя по названию и предположению - отвечает за активация.
4. Функция ActivateLicense, что вызывается с - ReactivateLicense.

st-15-4.jpg

Небольшая зацепочка у нас есть. Теперь что же мы делаем ?. Ну естественно переходим в функцию ActivateLicense. Грех не перейти, выходя из названия :).
Давайте посмотрим что же мы видим, для пояснения всей картины. Функция ActivateLicense вызывается с динамической библиотеки NetSpot.Core.Policies.dll, что расположена возле исполняемого файла программы. А именно с класса KeyActivator, в котором присутствует также, список функций. А функция ParseResult (проверка, условно говоря), выходной результат, при активации лицензии получает - error. То есть, если условия не соблюдается, то мы имеем ошибку активации - типа лицензии.

st-15-5.jpg

Для того что бы проверить, мои слова, давайте перейдем в функцию ParseResult. Тем более, выходя из условий выше, эта же функция принимает финальные решения при активации лицензии. Это только предположения, но это, мы сейчас проверим. Чтобы наши предположения оказались правильными - давайте поставим точку останова, в начало функции. После этого запустим программу, под отладчиком и посмотрим как она отреагирует. А дальше я прокомментирую что у нас тут происходит.
Тем более что функция очень длинная и желательно, такие вещи, всегда анализировать. Тем более если Крошить Софт то - Красиво! ;).

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

st-15-6.jpg
И так, что произошло, по факту, у нас (Условные обозначения на картинке, ниже):
  1. После того как точка останова сработала, в локальных переменных (в отладчике) отобразился ключ активации (Но радоваться рано).
  2. Я запустил Http Analyzer (поставил в режим слежки за сетевым трафиком),
  3. Скопировал ключ что выдал нам отладчик.
  4. Запустил программу, не с под отладчика и ввел этот ключ, что бы проверить, чисто с любопытства.
Для полной картины, предлагаю, даже настаиваю посмотреть видео.

Все манипуляции, с кодом , Видео: Nt_Spot-1.wmv (Имеется и в архиве, на всякий пожарный).

И как вы думаете что произошло ? Активация ?, нет не угадали. Тут произошла не такая простая ситуация, случилось вот что:

  1. Программа приняла ключ, типа мы зарегистрированы и все такое.
  2. Но ключ, этот, от бесплатной лицензии, так как софт проверил его через интернет. Хотя до этого, я выше говорил, помните ? - даже никакого намека на проверку с сети не было (Именно при запуске).
  3. Почему так, а все за того что: Запрос отправляется, на сайт разработчика, в случае верного формата, последовательности, которой мы не знаем (Это в сегодняшнем случае).
  4. И только, после того, как мы выяснили правильный формат, кнопка активации стала активной и при вводе ключа - программа отправила его на проверку, на свой сайт.
  5. Ну а там уже пошла проверка других параметров: Версии, ID Системы, как заметно на картинке, выше (POST Запрос на сайт разработчика).

Так вот, мы выяснили что проверка через сеть, все же есть, именно ключа. Тогда возится в подбором ключа, или разбирать алгоритм генерации нет смысла. Так как, в нашем случае, ключ - сразу же проверяется (Хотя бывают ситуации что и не сразу). То есть, будем делать изменения в коде 100%. Вот такой подход к активации, у разработчика, но это еще цветочки - ягодки далее ;). Дочитайте статью до конца и убедитесь в этом сами.

st-15-7.jpg

Если пройтись по коду функции ParseResult (Картинка выше), то мы замечаем, различные условия. При которых, в зависимости от ситуации, активируется лицензия (Тип лицензии). Ну и находим условие, что: если программа демо-версия то активируем LicenseType.Free. Так давайте же изменим её на максимальную и зарегистрируем программу. Причем изменения, правки, нужно будет делать в режиме IL, так как наш декомпилятор (в отладчике) разобрал не все методы. За чего, возникнет, список ошибок (при сохранении изменений в коде) и вы не сможете нормально изменить код. Можно, конечно же, в ручном режиме попробовать исправить косяки декомпилятора (отладчика), если их не много. А если их целый список, то это извращение ;) и только трата времени, поэтому правим в IL режиме.

Делается все это дело вот так: Изменить параметр Idc.i4.0 на Idc.i4.6 и получите лицензию: Unlimited (если значение Idc. другое то и тип лицензии будет другой, к примеру Idc.i4.5). Еще, меня уже спрашивали, уже не раз: Ну а почему Idc.i4.0,1,2,3,4,5, то есть как мы вообще определяем какой тип лицензии. Все просто, в функции ParseResult (в нашем примере) смотрите сколько типов лицензии и понятно что значение ноль (0) - это её нет (демо или триал), 1 - это следующий параметр лицензии и так далее. Я это поясняю для общего понятия, тут ничего сложного нет, но все же: Если вопросы возникают то - ответ выше.

Мы сделали все правильно и чтобы в этом убедится: Сохраняем изменения в исполняемый файл.

st-15-8.jpg

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

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

st-15-9.jpg

Сейчас мы находимся в динамической библиотеке NetSpot.Core.Policies.dll, там где делали патчинг (изменения в коде). Давайте подумаем логически: Поскольку, это исключение (а после вывод сообщения), происходит при запуске (старте) программы то и искать мы будем там же. То есть вернемся, в отладчике, в наш, исполняемый файл NetSpоt.exe и перейдем в точку входа. Ну перешли и что делать дальше ?, спросите вы ?.

А далее, поставим точку останова, в начало функции и посмотрим как она отработает. Таким способом мы пробуем отловить сообщение о ошибке (Это один из способов решения проблемы). Можно было поискать текст этого сообщения, по коду, но это вариант - намного дольше.

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

Все манипуляции, с кодом , Видео: Nt_Spot-2.wmv (Имеется и в архиве, на всякий пожарный).


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

st-15-10.jpg


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

  1. Из точки входа мы перешли в функцию CreateMainForm.
  2. Эта функция расположена в классе DsProtector.
  3. И тут же вызывается функция CheckForDigitalSignatures, предположительно, отвечающая за проверку сигнатуры файла или файлов.

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

st-15-11.jpg


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

st-15-12.jpg

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

  1. Проверяется сигнатура файлов (по какому принципу, далее рассмотрим). Мы видим список динамических библиотек, что расположены возле исполняемого файла программы, именно по ним и работает проверка.
  2. Условия (If), при которых осуществляется проверка, в зависимости от условия мы получаем результат return form;
  3. Решения принимаются выходя из проверки, еще одной функции, а именно CheckForDigitalSignature. Которая правит балом ;).
  4. Из списка файлов, мы видим нашу динамическую библиотеку, которую мы ранее - изменили (пропатчили).

st-15-13.jpg

Что бы проанализировать алгоритм полностью, ничего другого не остается, нужно перейти в функцию CheckForDigitalSignature и , также, проанализировать её код.
Так мы сможем оценить ситуацию, в полной мере и уже, после этого, делать выводы. Ну и тут у нас очень интересная картина, которую сейчас, разберем. Мы же должны понимать что мы делаем, в этом то и вся суть, а не просто так, инстинктивно, делать изменения. Я не просто так, все это показываю, мы разбираем логику работы алгоритма и тем самым - набиваем руку.

st-15-14.jpg


1. Мы перешли, в нашу функцию, что расположена в классе NetSpot.DsProtector (исполняемого файла, программы, NetSpоt.exe).
2. Мы видим строку, что напоминает нам контрольную сумму (можно подумать так), что же это за строка ? Это проверка цифровой подписи файла (отпечатка), скажу наперед и сейчас убедимся в этом.
3. Условия, проверка. Если отпечаток не совпадает то мы получаем отказ и программа не запуститься - выводя сообщение.
4. В конце, после проверки, функция принимает решение. То есть return flag.

Ну а теперь, более подробней, давайте посмотрим что же имеется в виду под - Цифровая подпись и в общем, по какому принципу происходит проверка.

st-15-15.jpg

Выше, мы выяснили, что программа, проверяет цифровую подпись у списка файлов, эта проверка происходит из исполняемого файла программы.
Если посмотреть на оригинал, динамической библиотеки NetSpot.Core.Policies.dll. Именно оригинал, без наших изменений, то она имеет цифровую подпись.
То есть если посмотреть на свойства файла: Мы увидим вкладку - Цифровые подписи. После чего заходим в: Сведения - Просмотр сертификата - Состав. И в списке находим, значение, отпечаток. Его значение: 0ce8a20586e6680c6ac3f0e793d8e136ef7e1a98 (Если убрать пробелы). А если посмотреть на значение в функции проверки: CheckForDigitalSignature то мы убедимся что значение - идентичные (Одинаковые).

Так вот, функция проверяет эти значения, если они не совпадают или их нет то мы получим значение флага flag = false. То есть, запретить запуск софта и показать сообщение с ошибкой. Именно то сообщение, что мы получили, после патчинга (изменения ранее) динамической библиотеки NetSpot.Core.Policies.dll.

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

st-15-16.jpg

Конечно же, после запуска, функция смотрит что значений не совпадают и говорит нам False (Запрет). И после этого выводит сообщение, что якобы, файл испорчен.
Но заметьте, как я говорил ранее, что никакой логики для подсказки это сообщение не дает. Сам текст, составлен так что бы не дать нам никакого логического объяснения.

Ну и теперь, перед нами, возникает вопрос: Как быть в такой ситуации ?. Поскольку мы разобрали алгоритм полностью, то я покажу несколько вариантов решения вопроса. Каждый по своему пригодится и будет полезный, для общего понимания.

Вариант - 1: Изменения функции проверки сигнатуры.

Возвращаемся в нашу функцию и смотрим код (Что бы не запутаться и для уточнения: Она расположена в исполняемом файле программы - NetSpot.exe).

st-15-17.jpg

Тут, у нас, картина состоит в следующем: Идет проверка отпечатка подписи, как я ранее говорил. И в случае, любого исключения, мы получаем флаг flag = false.
А если исключения нет, оно не произошло то функция принимает решения выходя их параметров флага, то есть return = flag. Но так как мы вносили изменения в динамическую библиотеку то мы получим значения флага false (в любом случае).

Потому, что бы это исправить, нужно его изменить на противоположенное значение, на true ,принудительно заставив программу не сопротивляться ;). Или вообще убрать эту проверку подписи, почистить весь код и оставить только: return true. Тут уже как Вам удобно, мое дело показать, выбор я оставляю за вами.

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

st-15-18.jpg


При любом, из этих вариантов, программа должна запуститься (Заведется 100% ;)). Ну давайте это проверим, сохранив изменения в исполняемый файл программы.
Чего и стояло бы ожидать, софт запустился, функционал доступен, карту помещения можно создавать (Ранее нас просили купить лицензию для того что бы это сделать). У нас активировалась - Unlimited Enterprise лицензия. Если захотите другой тип лицензии, выше я показал, как это сделать (дело 1 секунды).

st-15-19.jpg


Чтобы закрепить материал я предлагаю посмотреть видео: Там я все показал от а до я.

Все манипуляции, с кодом , Видео: Nt_Spot-3.wmv (Имеется и в архиве, на всякий пожарный).


Вариант - 2: Тоже интересный вариант, в том случае если возможности, изменить, функцию проверки, нет.
Причин может быть масса, в следующих статьях мы еще рассмотрим и такие варианты. Поэтому, если возможности нет, то можно пойти следующим путем.
А именно, вернуть подпись файлу NetSpot.Core.Policies.dll - обратно. Мы уже знаем, после патчинга подпись испортилась, исчезл. Конечно, при таком подходе, сертификат будет не действительный, у программы.Но она все равно запуститься (А нам это и нужно), так как программа проверяет только отпечаток с подписи. Нас такой вариант тоже устроит, делается это вот так.

На GitHub: Есть скрипт (с исходным кодом), что написанный на Python: https://github.com/secretsquirrel/SigThief. Если у Вас установлен Python, если нет то его стоит установить.Как это сделать, в сети сотни уроков. Там дела то на 2 минут.

Порядок действий
  1. Сначала сделали резервную копию оригинала динамической библиотеки, для примера, с названием NetSpot.Core.Policies_Original.dll.
  2. Потом вносим изменения, про которые я говорил выше, в эту динамическую библиотеку.
  3. Качаем скрипт и закидываем в папку с программой (где установлена программа) - скрипт под названием sigthief.py.
  4. Запускаем CMD в папке где расположен наш скрипт. Команда, для того что бы скрипт вернул сигнатуру обратно, в динамическую библиотеку будет вот так выглядеть: python sigthief.py -i NetSpot.Core.Policies_Original.dll -t NetSpot.Core.Policies.dll
  5. Скрипт вернет обратно цифровую подпись - уже пропатченому файлу (Единственное что она будет не действительна в свойствах, но для нас это погоды не меняет).
  6. После этого, программа запуститься и также будет работать, без всяких сообщения о ошибке (поврежденном файле).

Вот так это будет выглядеть на картинке.


st-15-20.jpg


А что бы было понятней на все 100% то предлагаю посмотреть видео: Там я показал все от и до.

Все манипуляции, с кодом , Видео: Nt_Spot-4.wmv (Имеется и в архиве, на всякий пожарный).


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

Переходим к анализу следующей программы.

st-15-21.jpg

Давайте рассмотри защиту следующей программы PDF Unlockert 5.3.0.0 (Официальный сайт: http://www.systoolsgroup.com/pdf-unlocker.html).
Программа предназначена для разблокирования (снятие паролей) с файлов pdf. Более подробную информацию, по функционалу, сможете почитать на официальном сайте программы. Ну а мы переходим к нашему, основному, делу.

Сразу же, что бы не терять время, используя анализатор исполняемых файлов (утилита ExeInfo PE) - проверим нет ли на программе дополнительной защиты в виде: обфускатора, пакера, протектора.

st-15-22.jpg


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

Первый: Когда вы установили программу, то в папке, где она установлена, расположены несколько исполняемых файлов. А именно: Startup.exe и SysTools PDF Unlocker.exe. Какая взаимосвязь, между этими файлами, мы еще выясним.
Второй: Утилита ExeInfo PE показала что оба x64-битные исполняемые файлы. Также отобразила нам информацию что на этих файлах нет дополнительной защиты. Но это не совсем так, сейчас я поясню почему. Подобным утилитам свойственно ошибаться, в нашем случае случилось именно так. Забегая немного на перед (что бы вам было понятно и статья получилась - удобно читаемая):

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

st-15-23.jpg

Что бы подобного избежать, лучше всего, очистить код от обфускатора. А так как, по признакам, чутье мне подсказывает что это Net Reactor - мы используем деобфускатор, под это дело. И как раз проверим мои предположения. Для начала мы очистим первый файл Startup.exe, так как предположительно (судя по названию) он может отвечать за запуск программы. А второй пока что не трогаем.

Делается это все просто
1. Исполняемый файл Startup.exe перетащить на файл de4dot-x64.exe.
2. После чего мы получим очищенный файл Startup-Cleaned.exe
3. Оригинальный, исполняемый файл, удаляем, а очищенный переименовываем, делая название как и у оригинала.

Кстати, обратите внимание: Почему именно заменяем оригинальный - очищенным, переименовывая. Так вот, у некоторых программ (не у всех) - есть зависимости от файла с расширением .exe.config.
В нашем случае это Startup.exe.config для файла Startup.exe. Где хранятся различные настройки и когда имена не совпадает с оригиналом то софт просто не запустится и выдаст ошибку. Для справки, подчеркнул информацию.

Выглядит все это дело вот так

st-15-24.jpg

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

Отлично, файл очистили от обфускатора. А теперь переходим на официальный сайт программы и смотрим есть ли информация о ограничениях софта, от разработчика.
Да, на сайте программы, указаны ограничения: Программа обрабатывает только 5 файлов и на каждый из них ставит водяной знак. Отлично, то что нам было нужно. Давайте закинем тестовые файлы в программу, посмотрим как она отработает и после будем приступать к анализу.

st-15-25.jpg


Я закинул 7 файлов и нажал на кнопку Unlock. После чего получил сообщение что софт (демо версия) обработает только 5 файлов и на каждый вставит водяной знак "SysTools".Собственно так и случилось, но убедится нам нужно было. А вот теперь переходим к самому интересному - визуальному осмотру активации программы.

st-15-26.jpg

Какие нюансы были замечены, начиная с запуска, программы
  1. При запуске программы, запускается и форма регистрации.
  2. В программе, после её запуска, нет формы активации.
  3. При нажатии на кнопку Activate нам дают выбор: Активировать Онлайн (Через интернет) или Офлайн.

Какие, из этого, можно сделать выводы.
  1. Если есть оффлайн активация и программа при запуске не стучит в сеть, значит и проверки ключа активации (через интернет) нет. Я проверял, через Http Analyzer, при запуске в сеть нет траффика а вот если ввести ключ активации то есть. Собственно это - логично.
  2. Если форма активации есть только при запуске то и проверка активации осуществляется, также, при запуске. Если выбрать режим активации офлайн то у нас запросят лицензионный файл. Алгоритм активации нам понятен а теперь приступаем к анализу.

Для начала, давайте перейдем к точке входа и посмотрим что там происходит и какие функции вызываются. А в точке хода у нас идет вызов класса GPLSManager, в котором список функций. И эти функции, явно отвечают за активацию. Визуально, на картинке, это заметно, но давайте же разбираться. Изначально я обратил свое внимание на функцию init. Так как сначала функции загружаются различные параметры, значение которых null.

st-15-27.jpg


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

А уже в самой функции init, мы видим полную картину и с самого начала вызовы проверки лицензии. ID продукта (условно говоря), получение контрольных сумм загрузчика (это наш Startup.exe) и непосредственно самой программы (это наш исполняемый файл SysTools PDF Unlocker.exe). Тут идет километровый код проверок :D, можно разбирать все функции. Но имейте в виду что: функций там не мало, вспомните как я показывал и говорил в предыдущих статьях ?
Главное что ?
(кто еще не читал почитаете в предыдущих статьях).

st-15-28.jpg


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

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

Все манипуляции, с кодом , Видео: PDF-1.wmv (Имеется и в архиве, на всякий пожарный).


Подытожим перед тем как перейти к действиям. Только сначала посмотрите видео. А только потом читаем то что написано ниже. Обязательно видео!

Так вот, место где вызывается это сообщение мы вычислили. Понятное дело что оно вызывается при условии. А если все хорошо то программа запускается активированной, где вычисляется id продукта.

st-15-29.jpg


То есть, за запуск, отвечает функция this.StarMainProcess("FULL", this.ProductID) а что бы получить значение Id нужно поставить точку останова вначале функции, там где он вычисляется. Я имею в виду вот это:

st-15-30.jpg

Поле того, как мы получили это значение, хотя его можно было и так в коде увидеть, пролистывая его. Но я вам показываю логику работы алгоритма. Показать абы как, это называется - что бы было, нужно в таких ситуациях пояснить. Все кажется просто, потому что вы читаете эту статью, это я себе не хвалю :D, а представьте ситуацию что пробовали сами ?.

Как я выше говорил, что все эти проверки в функции init, это только как стена, скажем так - которую можно перепрыгнуть или разрушить. Тогда, нам ничего не мешает, убрать 99% кода и прописать одну строку this.StarMainProcess("FULL", "21"). После этого сохранить результат, в исполняемый файл и запустить программу. Что мы и делаем, выглядит измененная функция будет вот так:

st-15-31.jpg


То есть, запуск полной версии (Лицензии), несмотря ни на что. А все остальные функции что мы убрали, что отвечали за проверку, они играли роль - фильтра. Так как наша функция init - принимает финальное решение, правит балом :cool:. Если есть сомнение, то после сохранения, запускаем программу и пробуем обработать список файлов.

st-15-32.jpg

Что мы получили в итоге:
1. Версия программы стала Full то есть полная, то есть активированная.
2. При запуске программы нет, никаких окон, с напоминаниями активировать программу.
3. Программа спокойно обработала 7 файлов, хотя ограничение демо-версии 5 файлов.
4. Водяных знаков, после обработки, на файлах нет.

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

Ну а для того что бы закрепить материал я предлагаю посмотреть видео.

Все манипуляции, с кодом , Видео: PDF-2.wmv (Имеется и в архиве, на всякий пожарный).


Что еще хотел отметить: выше я показал что: в папке, с программой, находилось два исполняемых файла: один лаунчер (загрузчик Startup.exe, так сказать) а второй сама программа. И вот как раз лаунчер решал судьбу какую версию запускать (Демку или Лицензию). Так вот, мы пропатчили только один, а второй даже и не тронули ;). Вот такой принцип защиты.

С этой программой разобрались, потренируйтесь и все у Вас получится. Но у меня сегодня еще есть бонус, как и в предыдущих (некоторых статьях). Помните, в начале статьи, я говорил: что ми рассмотрим несколько программ одного и того же разработчика ?. Так вот я не врал, у этого же разработчика SysTools, на официальном сайте - огромнейший список программ. Причем программы разного направления, и ценовой категории. Есть даже программы, ценник которых превышает - 1000$. защита у всех, практически одинаковая, но не совсем.

Сейчас я продемонстрирую взлом программы SysTools SQL Server Recovery Manager (Ссылка на официальный сайт: https://www.systoolsgroup.com/sql-server-recovery-manager.html) (я думаю с название понятно что за софт ?, если нет то на официальном сайте есть описание) - ценник которой 1499$, космическая цена ;), но разработчик уверен что она того стоит. Это решать не мне, мое дело показать вам, вкратце, принцип её защиты.

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

И так, начнем.

st-15-33.jpg

1. Установили программу, запустили и могу сказать что при запуске, загружается такая же форма активации.
2. В папке с программой, также расположены два исполняемых файла загрузчик и программа.
3. Также, как я показывал с предыдущей программой, снимаем, частично, обфускатор. Что бы после сохранения, после изменений, не было ошибок.
4. Вроде бы алгоритм активации, можно подумать, такой же. А нет, отличия (очень и очень незначительные) есть и сейчас я их покажу и расскажу.

Так вот, что бы программа завелась, заработала можно удалить условия проверки и оставить только this.StartProcess("100") - что отвечает за условия запуска лицензии.


st-15-34.jpg

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

Все манипуляции, с кодом , Видео: PDF-3.wmv (Имеется и в архиве, на всякий пожарный).

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

st-15-35.jpg

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

Несколько слов от себя, скажу в финале.
  • Как видите, в сегодняшней статье, у каждой программы своя защита. С своей стороны я старался показать и рассказать все, свести к минимуму диалог. Тем ребятам, кому интересно, практикуйте и далее. Статей будет не мало, постепенно увидите как ваш уровень вырастет, главное не ленится. Не получилось что, пробуете снова и снова.​

Сегодня мне больше нечего добавить. Всем хорошего настроения. ;)

В архиве:
Arch_ST_15.jpg


Инсталляторы Virustotal:
NetSpot.exe \ Virustotal:
https://www.virustotal.com/gui/file/8367b0bd47141b0809367b6a22b7142a8c9add69dc06ce0646e98e8469f53e89
pdf-unlocker.exe \ Virustotal: https://www.virustotal.com/gui/file/f95c1355503ce87f19ccf47512c2e9f832b8e6d7e819507bb32a400ecb404e1a
sql-server-recovery-manager.exe \ Virustotal: https://www.virustotal.com/gui/file/3461d609dae20b2f3f4a2c696e8e86cbfc0455a2b5d21f0cfe4f32a1e971ab75


Инструменты для анализа:
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
de4dot(x32).exe / virustotal: https://www.virustotal.com/gui/file/1ef4d880b16efb49271463e1b9c0de68e637320c1be40f1e7f1603538f3e289d
de4dot(x64).exe / virustotal: https://www.virustotal.com/gui/file/89582c764c5cdeb58656a60f8419fdcd8c5eb6caa2e5f332d2658e89555693cb

Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
 
А как насчет снятие протекторов? ENIGMA к примеру более высокой версии?
Это тоже будет, вскоре (Не только Enigma). Там есть свои наработки, в будущих статьях я поделюсь (прикреплю к файлам статьи).
 
Это тоже будет, вскоре (Не только Enigma). Там есть свои наработки, в будущих статьях я поделюсь (прикреплю к файлам статьи).
а как ты находишь пациентов?
 


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