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

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

-EXE-

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


Автор статьи: -EXE- (Профиль: https://xss.pro/members/275453/)
Статья для форума: xss.pro​

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

St-16-1.jpg

Ну и начнем мы с программы, под названием, Log View Plus версии: 3.0.19 (Официальный сайт программы: https://www.logviewplus.com).
Предназначение программы заключается в просмотре и анализе лог-файлов системы и различных приложений. В состав программы входит ряд инструментов для работы с логами. Еще, программа обладает приятным и удобным интерфейсом что поддерживает, различные, темы оформления. Более подробную информацию сможете почитать на официальном сайте программы. Мы же приступим к нашему основному делу: Анализ и Взлом.

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

Теперь, давайте посмотрим по какому принципу активируется программа. Как вы уже заметили что: форма активации программы расположена в Settings - About - Register User (Картинка выше).

St-16-2.jpg

Вот теперь и возникает вопрос, в зависимости от ответа, на который, мы выберем себе направление. Суть которого в чем: По какому принципу программа проверяет триал ?. Используя свой сайт или же записи в реестр Windows или же оба варианта (В данном примере, софте, это не маловажные факты).
Как вы уже знаете, с предыдущих статей, использовать, для проверки, можно Http Analyzer, что служит для мониторинга https \ http трафика в режиме реального времени.

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

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

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

Хорошо, некоторые детали, для начала у нас есть а теперь давайте посмотрим нет ли на программе дополнительной защиты в виде: обфускатора, упаковщика, протектора.

St-16-3.jpg

Утилита Exeinfo PE (Анализатор исполняемых файлов), показала что: программа написана на C#, разрядность программы (не определила) и в виде дополнительной защите на программе SmartAssembly (обфускатор), не самой старой версии.
Ну и собственно 4 пункт, утилита, дает совет по использованию de4dot для деобфускации кода программы. Давайте прислушаемся к совету и используем de4dot и посмотрим что произойдет.

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

Перетаскивает исполняемый файл программы на de4dot-x64.exe и получаем такой результат:

И так, теперь внимательно:
Как мы видим, de4dot не справился с деобфускацией кода. В итоге мы получили ошибку, хотя очищенный файл был создал. Но если попробовать после этого
запустить программу то мы получим ошибку в виде: Прекращена работа программы. Я веду это к тому что на программе 8-версия обфускатора и старые версии деобфускатора, конечно же, не справляться с поставленной задачей. Также обращаю ваше внимание на то что: При деобфускации, по мимо основного исполняемого файла, создается и файл Clearcove.LogViewer.dll (Динамическая библиотека). А точнее, не просто создается а перезаписывается, так как оригинальный файл, что уже был в папке с программой, после установи. На этот факт обращаем особое Внимание!

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

Для начала, делаем бекапы (в архив) основного, исполняемого, файла программы LogViewPlus.exe и динамической библиотеки Clearcove.LogViewer.dll (Тем более что после деобфускации библиотека перезаписывается), они нам еще пригодятся.

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

Закидываем программу в отладчик DnSpy(x64) и переходим к точке входа (Правой кнопкой, мыши, по программе - перейти к точке входа). И сразу же, в коде, мы видим загрузку настроек при запуске. А именно две функции: ExecuteQuickAction и ValidateSettings.

St-16-4.jpg

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

Чтобы ничего не упустить, обязательно посмотрите на видео, так будет понятней - весь процесс.

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


А если поискать, что нибудь, связанное с активацией, в нерабочем, исполняемом, файле. То мы там ничего не найдем (можете сами в этом убедится), тогда зацепимся за файл, динамической библиотеки, Clearcove.LogViewer.dll. Так как к нему идут корни от исполняемого файла, скажем так.
Но ведь измененный исполняемый, файл: после обфускатора не работает, как тогда быть и как с ним работать ?, спросите вы. Да никак, его можно отправить в корзину. Он нам был нужен всего лишь для анализа.

Далее мы делаем так: нерабочий исполняемый файл и перезаписанную, динамическую библиотеку - удаляем. И возвращаем оригинальные файлы из архива, на место.
Так они же под обфускатором ?, можете спросить вы. Именно так. А теперь, мы, все свое внимание, уделяем динамической библиотеке Clearcove.LogViewer.dll. Но, при анализе кода, файла: LogViewPlus-cleaned.exe (который мы отправили в корзину), делаем предположение что секрет активации, кроется, именно в нем.

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

Запущенный, по стандарту, de4dot не справится с этой задачей, можете сами попробовать, получите ошибку. То есть, очищенный файл,
вы получите, но вот как он будет работать ?, вот в чем вопрос.

Как сделать правильно:
  1. Для того, что бы корректно очистить динамическую библиотеку, запускаем de4dot с параметрами. А именно: de4dot --keep-types --preserve-tokens Clearcove.LogViewer.dll
  2. Бывают ситуации, когда нужно сохранить токены метаданных, в таком случае деобфускатор лучше запускать с параметрами. В нашем случае:
  3. Параметр "--keep-types" - не удаляет методы и типы обфускатора.
  4. Параметр "--preserve-tokens" - отвечает за сохранение всех, важных токенов.

А что случится если этого не сделать, использовав, по стандарту, de4dot: Когда вы внесете изменения в динамическую библиотеку то, при сохранении, получите ошибку вот такого плана. Собственно, это подтверждает то что я говорил выше.

St-16-4.1.jpg

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

На видео я показал, для сравнения, два варианта (Работа de4dot с параметрами и по стандарту). Советую посмотреть,

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


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

На картинке, ниже, показан что в итоге. Точнее, работа de4dot, с параметрами и по стандарту.
1. В первом случае ошибка, при деобфускации.
2. В втором случае все отлично сработало и нет никаких ошибок.

St-16-5.jpg

Но даже , с параметрами, de4dot не справляется, именно с исполняемым файлом. То есть тоже не может снять обфускатор, с кода (без ошибок). А нам этого и не нужно, как мы определились выше, сейчас наша цель это динамическая библиотека Clearcove.LogViewer.dll.

Теперь, перед нами, становится вопрос: Если будем работать с динамической библиотекой и код исполняемого файла нам не доступен (причины выше) то как нам действовать дальше ?.

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

Для начала, закинем нашу динамическую библиотеку (очищенную) и оригинальный исполняемый файл (что под обфускатором) в отладчик. Вы можете спросить меня: А зачем исполняемый файл, если на нем обфускатор, мы же говорили что он нам не нужен ?. Дело в том что: С исполняемого файла идут вызовы (подключения) функций, он будет полезный в случае когда нам нужно будет запустить программу (с под отладчика DnSpy) и проанализировать нужную нам функцию (поставив точку останова), в динамической библиотеке. Потому, исполняемый файл, также, должен быть в отладчике, он отвечает за последовательность вызовов функций (если проще сказать). Далее я продемонстрирую пример, что я имею в виду, а пока что закидываем нашу библиотеку в отладчик и ищем зависимости по коду, к примеру License.

St-16-6.jpg

И получаем вот такой список, тут главное не спешить, сейчас я опишу нюансы на которые стоит обратить внимание, обязательно. Как видите, в обозревателе ссылок, много различных файлов, они подгружаются когда вы переходите по коду (в разные функции). Так вот, на что нужно (Обязательно обратить внимание): Сейчас, нас интересует, конкретный файл а именно динамическая библиотека Clearcove.LogViewer.dll. Потому что бы не получилась каша, при поиске, настройка должна быть только: Выбранные файлы.

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

St-16-7.jpg

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

Но, я как обычно, не нахожу длинных путей а показываю как действовать правильней всего. Так вот, на картинке выше, я обратил внимание на первое условие if (Class113.smethod_1(true), особенно на smethod_1. Почему именно на него ?. Так как это главное условие в данной функции, что выдает результат или или, в зависимости от значений Enum2. Значения (Enum2) которого, вы можете посмотреть, на картинке (если перейти в него) выше, я специально отобразил их. Так, будет лучше понять картину происходящего. Давайте же перейдем в код smethod_1 и посмотрим что там за условия в коде, после этого уже будем делать выводы.

St-16-8.jpg

После перехода, мы видим вот такой код (Картинка выше). Сейчас я прокомментирую что тут происходит. Так как это еще не все, главные фишки впереди, гарантирую вам это.

1. Вызов smethod_1 происходит из другой вселенной. А именно с класса Class113, в котором также идет связка функций (Зависимые, между собой).
2. Условие if и далее File.Exists: говорит нам о том что если файла license.dat (Если перейти в smethod_2) нет то флаг @enum получает (присваивается) значение Enum2.const_0. Помните, через одну картинку выше, я специальном там также эти параметры выделил.
3. А если файл есть то далее идет условие else, но у нас файла лицензии нет. Поэтому на него мы не обращаем внимание. Но если файл есть то там идут различного вида проверки, это для справки.

И в финале функция принимает решение return @enum. А @enum получает значение в зависимости от условия If и Else. Так вот, выходя из прочитанного выше, можно 100% сказать что это флаги лицензии (Что отвечают за активацию лицензии). Давайте, в условии, где проверяется наличие файла лицензии на (существования) - изменим условие. А именно Enum2.const_0 на Enum2.const_3, сохраним изменения и посмотрим что произойдет.

St-16-9.jpg

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

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

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

Так вот, этот нюанс нужно показать на видео, после этого уже прокомментировать. Именно в этом случае, лучше всего так, потому смотрим ролик и после а прокомментирую.

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


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

St-16-10.jpg

Первое, самое важно что: Там где, на картинке, отмечено (ОТЛАДКА) - Помните, выше, я говорил что исполняемый файл (оригинальный), нам еще пригодится. То есть, по сути то дела: мы сейчас разбираем код динамической библиотеки. Но когда нам нужно запустить программу, с под отладчика DnSpy: то в отладчике, должен быть и исполняемый файл. Если его не будет там, то при запуске, функции из dll (при отладке) мы ничего не запустим. На картинке показано и я показал этот момент на видео (подробно).

А теперь по пунктам
1. Мы изменили Enum2.const_0 на Enum2.const_3 тем самым изменив статус лицензии.
2. Далее, мы поставили точку останова, в начало функции, которая проверяет файл лицензии на существования. И запускаем программу, с под отладчика.
3. Как только функция отработала, то она остановилась на return @enum;, то есть на принятию решения в зависимости от флага (значения что ей передалось).
4. Мы нажимаем кнопку F10 (Шаг через - в отладчике) и перемещаемся в класс LogViewer. И в этом классе, у нас, не мало функций, среди которых встречаются и проверочные (Что проверяют лицензию). Но программа остановилась на функции method_79.

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

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

St-16-11.jpg

Если пройтись по функциям method_79 (картинка выше) то smethod_14 - функции, где происходят манипуляции с триальным периодом, method_81 - проверка актуальной версии (то есть обновления софта), method_85 - вывод сообщения что триальный период истек и блокировка функций.
Вы можете сами убедится, посмотрев код. Также обращаю ваше внимание на то что флаг в Class113.smethod_1(false) - изначально стоит false (то есть запретить).

А далее, анализируя каждую функцию, я обратил внимание на конструкцию case (case Enum2.const_3 - те же значение что мы изменяли в функции (smethod_1) ранее). А именно в функции method_82(), ну это логично, выходя из действий и анализа, выше.

  • Мы видим что при условии If () - если условие не соблюдается то мы получаем сообщение. Именно то сообщение что появляется при запуске программы, при внесении нами изменений, ранее (как я выше показывал).
  • А далее статус лицензии устанавливает как Expired (Лицензия истекла). Expired - это всего лишь строковое значение (Текст) что добавляется к названию программы (показано на картинке).
  • А вот правит балом this.bool_0 и AppSettings.bool_0 у которых флаги false (то есть запрет). А это означает что: программа запускается, выводится это сообщение, вы его закрываете. Не смотря, на то что, в окне About, статус лицензии становится активирована, включается блокировка функций. Но нет данных на кого, мы это еще подправим (Немного позже). А когда вы открываете любой файл с логом то софт вам говорит что нет, ты не активирован и не дает открыть файл.

Для примера, посмотрите видео: Тут показано взаимодействия между функциями. Переход из одной функции в другую, под отладчиком, с установленными точками останова.
Все манипуляции, с кодом , Видео: LVPR-4.wmv (Имеется и в архиве, на всякий пожарный).


Так вот, продолжая тему, если значение this.bool_0 и AppSettings.bool_0 изменить на противоположенное, то есть true. А сообщение, в котором говорится что триал истек, превратить в рекламное. К примеру изменить текст, добавив копирайты форума и авторство.

Более подробней, по пунктам, мы добавляем копирайты (Авторство кряка и рекламу форума):
1. В главной форме, возле названия программы.
2. В заголовок сообщения, что запускается при запуске программы.
3. В текст сообщения.
4. Тестовый лог файл открывается, нет никаких ограничений.
5. Значение this.bool_0 и AppSettings.bool_0, мы изменили с false (Запретить) на true (разрешить).

St-16-12.jpg


И ключевую роль, благодаря чему сняты ограничения, у нас играли два флага, пункт 5 (Не считая изменений, что мы сделали выше). Теперь, при запуске программы, постоянно будет загружаться сообщение с рекламой форума xss.pro и авторства кряка (Картинка выше). То есть, это мы сделали для красоты, если не нужно так сообщение вообще можно убрать, удалив условие с сообщением (Class972.smethod_0). Тогда программа, сразу запустится и сообщения не будет.

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

Там же в списке, как мы искали, по слову License (4 пункт на картинке, ниже): Находим место где вызывается окно About (о программе). И ищем код функции которая отвечает за вывод регистрационной или триальной информации (В зависимости от условий).

St-16-13.jpg


После этого смотрим на код и замечаем такую особенность.
1. Обратите внимание на условие if (@class != null), его нужно убрать что бы информация отобразилась.
2. Информацию о пользователе нужно заполнить своими данными (либо оставить пустыми "" или же убрать ненужные), если уберете условие первого пункта.
Почему так: Потому что мы не имеем реального ключа активации. Данные подгружаются выходя из его параметров. И если убрать условие первого пункта то при просмотре информации о лицензии: вы получите ошибку а само окно не отобразится (пример окна ошибки , на картинке, выше).
3. Пример, как должен выглядеть код, после изменений.

Что бы укрепить материал, предлагаю посмотреть видео: Там показан полностью процесс изменений, динамической библиотеки Clearcove.LogViewer.dll.

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


То есть, еще раз, все изменения мы вносили именно в динамической библиотеке (что бы ничего не перепутать). После всех изменений, финальный вариант программы выглядит вот так.

St-16-14.jpg

То есть, если вкратце, подытожить:
Самое главное, программа у нас активирована, нет ограничений по времени и блокировки файлов (на открытия).
1. К названию программы добавляется наш текст с рекламой форума и авторства.
2. Отображаются нужные нам, регистрационные данные.
1. При запуске программы, загружается сообщение с рекламой форума и авторства.

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

По этой программе у меня все, нас ждет следующий пациент, поэтому, следуем далее.

St-16-15.jpg

А теперь рассмотрим, защиту программы, под названием, TablePlus версии: 5.4.2 (Build 236) (Официальный сайт программы: https://tableplus.com/pricing).

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

Для начала, как мы делали в предыдущих статьях: давайте проверим программу на присутствия дополнительной защиты: пакер, протектор, обфускатор кода.
Утилита Exeinfo PE (Анализатор исполняемых файлов), показала что (картинка выше): программа написана на C#, это 64-битное приложение и дополнительной защиты не обнаружено. Ну и не смотря на рекомендации (4-пункт на картинке, мы будем использовать, как обычно, отладчик DnSpy).

Начало есть, ну а теперь, ознакомимся с информацией касающиеся ограничений, на официальном сайте программы. А официальном сайте, информация о ограничениях, указана в пункте документации: https://docs.tableplus.com/utilities/licensingli. Собственно, в бесплатной версии имеется ограничение на использование не более: 2 активных вкладок, 2 активных окна и 2 дополнительных фильтра одновременно. По ограничениям информация имеется а этого говорит что, при любых раскладах, у нас имеется зацепка.

Теперь, давайте посмотрим на принцип активации и используя Http Analyzer, заодно, проверим не стучит ли программа на свой сайт, для проверки регистрационных данных.

St-16-16.jpg


Порядок действий и что получилось: Для начала, Запускаем анализатор, нажимаем на кнопку Start, после чего запускаем наше программу.
1. При запуске программы, анализатор обнаружил что она обращается на свой сайт. При этом проверяются данные лицензии: Срок окончания лицензи, ключ и так далее.
2. Если ключа нет, то естественно запускается триальная версия (с ограничениями) и появляется соответствующее сообщение об этом, в виде текста.
3 - 4. При нажатии на меню "License Key" и вводе неверного (выдуманного ключа, нажав кнопку "Activate") - программа, повторно, обращается на свой сайт для его проверки.
5. Если ключ неверный то мы получаем соответствующее сообщение, чего и стоило было ожидать.

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

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

St-16-17.jpg


Мы замечаем что свойство StаrtupUri служит для указания главного окна программы. Для нашего оконного приложения создаётся класс, что наследуемый от app.
Он разделён на xаml разметку и в этой разметке задаётся StаrtupUri. Выходя из этого MainWindow это и есть главное окно программы. В возле которого, предположительно, загружается наша проверка, при запуске. Давайте поставить точку останова, в начале InitializeComponent и посмотрим как отработает функция (нажимая F-10 Шаг через).

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


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

St-16-18.jpg


То есть, что мы сделали (Рисунок Выше):
1. Нашли главную форму (MainWindow), используя, поиск. Хотя, именно в сегодняшнем случае она не так далеко была запрятана (Говоря простыми словами). Даже без поиска, визуально можно было найти её, но я показываю сам процесс, как правильно сделать. Поэтому мы делаем все поэтапно.
2. Далее мы прошлись по коду (функций), нашей формы, используя поиск по ключевому слову License.
3. Первая функция на которую мы нашли UpdateDelegate. И тут у нас идет получение данных, загрузка ключа, триал дата (истечение) и так далее.

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

St-16-19.jpg

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

Для примера, что бы было понятней, предлагаю посмотреть видео

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


Так вот, ключа активации у нас нет и он нам не нужен. А логика такова что функция Check() диктует условия активации, так как вы заметили что с неё вызываются остальные проверочные функции, ну и там далее идут (разные) взаимодействия.


И мы видим что в функции Check, присутствуют два флага, что переключаются (получают статус) на True или False, в зависимости от ситуации (в коде). Ну, естественно False (запрет мы получаем по стандарту) так как ключика у нас нет. Ну и проверка идет на стороне сайта, разработчика. Тогда, что нам мешает изменить ситуацию, принудительно, заставить программу активироваться. А именно, изменить значение this.isValidLicense на True. Забегая, немого наперед, после этого наша программа
станет активированной.

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

Давайте вернемся к нашей функции Check и посмотрим на картинку, ниже.

St-16-20.jpg


Пояснение, того что я нарисовал на картинке (выше).

1. Отладчик DnSpy может отображать код не только в режиме С#. Если посмотреть на функцию Check То в режиме C# и IL кода она имеет разную конструкцию (Скажем так).
2. Флаг False в режиме IL кода будет иметь значение ldc.i4.0 и на против него мы видим hex значение 16 что передается по адресу 0x00111C05. Если перейти по этому адресу то мы увидим (Отладчик перенаправит нас в hex-редактор) эту же цифру (значение) в строке 4000062A02167D4E (Приветствует 16 (То есть False)).
3. А если в режиме IL кода изменить флаг на True то цифра 16 изменится на 17 (То есть True).

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

St-16-21.jpg

Какие действия мы производим, тут внимательно (картинка выше):
1. Нажимаем Проект и далее меню Новый. Тут у нас идет настройка внешнего вида, нашего будущего патчера. Просто заполняете все поля,
как Вам удобно. Тут ничего особенного. То есть при запуске, уже готового исполняемого файла, что будет вносить изменения в нашу программу, запустится окно с данными что вы заполняете (Это как реклама, авторство кряка.).
2. А теперь переходим к самому интересному. Нажимаем правой кнопкой мышки, по списку, и нажимаем добавить. Так как, мы будем делать изменения напрямую в исполняемом файле, то в меню выбираем "Search and Replace Patch". Потому как, мы видим, что программа поддерживает различные варианты изменений. Бывают случаи когда для запуска патча нужны права администратора, потому, если нужно, для этого есть специальная птичка (при надобности её можно отметить). Отключить резервное копирование: отвечает за сохранения бекапа, исполняемого файла, перед изменением патчером.

Далее нажимаем кнопку сохранить и у нас появляется вкладка: Search and Replace Patch, в списке. Двойным щелчком мышки переходим в форму "Патч поиска и замены" и теперь начинается самое интересное. Мы перешли в меню, где будем, настраивать патчер для внесения изменений в
исполняемый файл - нашего пациента
. А именно в TablePlus.exe. Демонстрация на картинке, ниже, после я все прокомментирую, так что все будет понятно.

St-16-22.jpg

Из пунктов меню, в этой форме мы использовали (Картинка ниже):
1. "Добавить" - отвечает за добавления значений оригинала и тех, на которые заменить оригинальные. Если в программу, вам нужно, внести список изменений, то
нажимаете кнопку добавить и вводите еще одно значения.
2. "Проверить наличие" - полезная функция, отвечающая за поиск последовательностей. К примеру мы делаем изменение, только в одном месте, в программе. В нашем случае ищем последовательность: 4000062A02167D4E. А бывают ситуации, что эта последовательность, может быть не одна. То в таком случае, мы сможем посмотреть адрес, после чего проанализировать - стоит вносить изменения или нет. Это технические моменты, с которыми мы, еще, будем встречаться.
"Строка в Hex" - переводит строковые значения в двоичное значение в шестнадцатеричной системе счисления. А настройка Unicode (Птичка) - присутствует тут не просто так. А потому что: двоичное значение различается. И в зависимости от кодировки символов, результат преобразования, в строку (16-ричных символов), также отличается.

А нам что с этого всего, можете спросить вы?. Так вот, что бы получить, желаемый, результат: Нам нужно эти значений прописать в нашем патчере.

Какие наши действия
1. Добавляем первую последовательность, значений, для замены. Так как выше, под отладчиком DnSpy, мы выяснили что (в функции Check): после того как мы изменили значения False на True, в последовательности (в Hex редакторе) 4000062A02167D4E - (16 изменилось на 17). То в настройке: Образец поиска (оригинал) будет: 4000062A02167D4E. А образец замены (на что заменить) будет: 4000062A02177D4E (С одним лишь отличием 16 = 17).
2. То есть в первом пункте, патчер, внесет изменения в исполняемый файл программы, активируя её. А в втором пункте, патчер: Добавит рекламу (Авторство кряка и рекламу форума xss.pro). То есть, заменить текст: Welcome to TablePlus на текст: Crack -EXE- | xss.pro. Тут главное уловить смысл, читаем далее. Для примера.

St-16-23.jpg

3. "Проверка наличия образца", тут мы убедились что последовательность (значений 1 пункта, что важно, что отвечает за активацию программы) - встречается один раз. Так и должно быть, так как под отладчиком (ранее), мы нашли место где патчить программу. И значение 2 пункта, что отвечает за рекламу (копирайты) - встречается, также, один раз.

Отлично, все параметры мы настроили. И что же делаем теперь ?. Остается только сохранить (создать) исполняемый файл патчера, запустить и опробовать его в работе.
1. Для создания патча нажимаем на меню "Проект" - "Создать Патч". После этого, возле исполняемого файла программы появится файл (название-patch.exe).
2. А при запуске, данного файла, вы увидите как выглядит ваш патчер. В окнет "About" выводится дополнительная информация.

St-16-24.jpg

Ну и теперь самое главное, что мы получаем при его использовании, финальный результат. Запускаем, исполняемый файл, нашего патчера и нажимаем кнопку Patch.
Если птичка "Macke Backup" установлена, то будет создана резервная копия, исполняемого файла, нашей программы, с расширением .BAK . А именно TablePlus.exe.BAK а в оригинальный файл, будут внесены изменения без сохранения резервной копии (заданные нами ранее, в настройках патчера). Ну и в логах указано что изменения внесены.

После этого, запускаем нашу программу TаblePlus и видим вот такую картину.

St-16-25.jpg


Собственно то, о чем мы говорили выше. Программа активирована, место стандарной надписи "Welcome to TablePlus" красуется надпись "Crack -EXE- | xss.pro".
Чего еще желать, вот таким способом, заранее анализируя защиту программы можно создавать собственные патчеры (исполняемых файлов). Причем это касается не только исполняемых файлов но и динамических библиотек, главное подход.

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

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


Вот теперь, вы узнали, каким способом создаются патчи к программам. В данном случае с применением утилиты dUP 2, но подобных программ полно. В этой полно функций и есть как разогнаться, потому я выбрали её.

:cool: Ну вот, в принципе и вся информация на сегодня, надеюсь было интересно. Всем хорошего Вечера. :cool:

В архиве:
Archivs.jpg


Инсталляторы программ Virustotal:
logviewplus_setup_3.0.19.exe \ Virustotal:
https://www.virustotal.com/gui/file/7cad9ae73473a40005788104bb78e157c929711125eddf650c327b532651d093
TablePlusSetup.exe \ Virustotal: https://www.virustotal.com/gui/file/62350ed959ec7c85faf42d5bdce25ca96c6c516416bdd10fe8ba0f61b8bd8384


Инструменты:
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/5981e6ebd3c3b9dc3b03fca119761960ab19f39fe45c3774eb94d54500ac0bfc
dUP 2 / virustotal:
Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
 
Блестяще, бро! Спасибо что поделился, это охуенная статья.
Блин искренне завидую тому, что человек не только умеет реверсить,
но все оформлять, писать текст, учить других людей.

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


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