Автор статьи: -EXE- (Профиль: https://xss.pro/members/275453/)
Статья для форума: xss.pro
Ну а в сегодняшней статье будет также интересно, мы разберем три программы. Первая программа имеет свои особенности в защите, я бы сказал даже зависимости. Я максимально подробно описал события что там будут происходить. При этом, как обычно, выбрал и показал максимально простой и красивый способ патчинга. Потому как все знают (кто еще нет то придет время, опыт и сами поймете) что каждую программу можно покрошить по разному и если есть опыт то только Вы решаете как Вам это сделать. Мое же дело максимально доступная и понятная подача информации для Вас.
А следующие две программы - это программы одного и того же разработчика, при этом на одной есть дополнительная защита в виде обфускатора а на второй нет. Вот, как раз, имеется возможность показать Вам: как эту информацию можно использовать в благих целях, упростив себе работу. По мимо этого, мы напишем собственный, универсальный патчер и запрограммируем его на основе полученной информации при анализе этих, двух, программ. Также, в этот раз, на видео - я разжую все до мелочей, будет показана каждая мелочь для предоставление подробной информации. А еще вы убедитесь в том что: если на программе обфускатор то не всегда нужно его снимать что бы её активировать. Имеется в виду то что: Если знаете и понимаете что патчить то успех Вам гарантирован.
А теперь приступаем к делу и начинаем наш анализ, всем хорошего настроения.
Программа что предназначена для контроля сетевого трафика. Она следит за активностью каждого приложения, использующего доступ в интернет, при этом управляет
трафиком, контролируя скорость потока данных. Что приятно, в программе имеется русский интерфейс.
Как заметно, картинка выше, если посмотреть информацию о программе, то нам предоставляют пробный период на использования программы - 28 дней.
А если перейти на официальный сайт, программы, и почитать там информацию о ограничениях то нам говорят что: По истечении подписки программа переключается в ограниченный режим . В этом режиме вы можете отслеживать трафик в режиме реального времени, но такие функции, как правила или статистика , не работают. А это говорит о том что нам дают полнофункциональную версию программы на 28 дней. Отлично, информацию о лицензии мы получили.
Также при проверке (картинка выше), исполняемого файла программы, на дополнительную защиту в виде пакера, протектора, обфускатора (Используя утилиту Exeinfo PE): Мы узнали что дополнительной защиты нет, это у нас x64 битное приложение, программа написана на C#. Ну и по стандарту мы будем использовать отладчик DnSpy x64.
Перед тем как начнем, укажу вам еще несколько нюансов на которые нужно обратить внимание.
1. При установке установки программы - устанавливается и служба NetLimiter Service. Ну и естественно эта служба сразу же запускается. На это тоже стоит обратить внимание, это я говорю не просто так. Далее эта информация будет полезна и я поясню почему (в процессе анализа).
2. Если посмотреть на исполняемый файл программы NLClientApp.exe то можете заметить что он имеет размер - 594 килобайта. А это говорит о том что основной функционал программы расположен в других файлах. Где именно мы пока не знаем, а сам исполняемый играет роль загрузчика, не более того. Говорю эту информацию для того что бы: при анализе вы, всегда, обращали внимание на такие вещи.
данные (лицензии), предположительно в зашифрованном виде и сохраняет у вас на компьютере.
Все манипуляции, с кодом , Видео: NTLM-1.wmv (Имеется и в архиве, на всякий пожарный).
Основа у нас есть, а теперь давайте закинем программу в отладчик DnSpy x64 и начнем анализ. Переходим к точке входа, программы ((Правой кнопкой, мыши, по программе в отладчике DnSpy - перейти к точке входа). В точке входа, код у нас длинный, мы видим вызов различных функций. Но пролистав код немного ниже, 162 строка, мы замечаем вызов App.Main(). Что в свою очередь делает переход в класс .App. Где также идет список функций, но тут минуточку, на что нужно обратить внимание. Если поставить точки останова в начало: App() и перед вызовом App.Main(), то мы увидим взаимодействия между функциями. И когда они отработают мы увидим вызов app.Run() где идет запуск программы (Главной формы).
Все манипуляции, с кодом , Видео: NTLM-2.wmv (Имеется и в архиве, на всякий пожарный).
Так вот, для того что бы проверить мое предположение давайте посмотрим на код этих функций. К примеру, для начала я взял первую функцию RegisterContextCommands. Тут не маленький код и много зависимостей. В любом случае, любопытно будет проверить как отработает функция под отладчиком. Тем самым мы можем посмотреть на локальные переменные что передаются или возвращаются и сделать выводы. Вспомните, вначале статьи мы выяснили, исходя из информации на официальном сайте, что после того как триал закончится (у программы 28 дней) - перестанут работать такие функции как правила или статистика. Я это не просто так говорю а сейчас поясню в чем дело. Если поставить точку останова в начало функции RegisterContextCommands, и посмотреть как она отработает в пошаговом режиме то мы находим интересный участок кода, там где идет вызов статистики. Именно той которая перестанет работать как только в программе закончится количество дней. И в этом же коде видим класс NLLicense. Как я говорил ранее: На такие вещи всегда нужно обращать внимание.
Но, для укрепления материала, предлагаю посмотреть видео. Так вам будет понятна суть происходящего.
Все манипуляции, с кодом , Видео: NTLM-3.wmv (Имеется и в архиве, на всякий пожарный).
Давайте перейдем в NLLicense и посмотрим что же там происходит. При переходе мы сразу же замечаем, я это показал на третьем видео (выше), что NLLicense вызывается с динамической библиотеки NetLimiter.dll. Также в этом же классе присутствует список функций (связанных с лицензией) и параметров которые получает программа. И сейчас мы разберем логику происходящего, так как тут уже не все так просто как может показаться (Забегая немного наперед). Первое, на что нужно обратить внимание, что в классе NLLicense, условно говоря, что бы было легче понять:
- Это, у нас, 4 функции что получают параметры с блока номер два.
- Наш второй блок с параметрами.
Как видим что она получает параметры, значения (типа лицензии), на сколько пользователей зарегистрирована программа и также флаг у IsRegistered стоит как false.
А в самом конце вызывается функция InitTestingVersion(). Если посмотреть на её код то можем увидеть что в зависимости от условий функция решает истек ли испытательный срок, у программы. Так вот, в этом коде, основную роль играют параметры даты this.Expiration и this.IsRegistered. Но это еще не все, я знаю о чем вы можете подумать, исходя из моих предыдущих статей: Что флаг this.IsRegistered изменить на true, да и все
а нет не совсем так. Конечно же его нужно так изменить, но помимо этого нужно отредактировать полностью код. Также обратите внимание на параметры, нужные нам, я специально выделил и показал код каждого.
И так, правильно отредактировать код это сделать вот так, посмотрите на картинку (ниже) а после я прокомментирую.
- Мы изменили параметр даты так как нам удобно, то есть установили (принудительно) срок истечения лицензии до 2050 года.
- Добавили параметр, для отображения в окне о программе, с регистрационным именем. То есть на кого зарегистрирована лицензия.
- Добавили тип лицензии, что будет выводится в окне о программе (Там где информация о лицензии).
- Добавили информацию о текущем плане лицензии.
- Изменили количество пользователей лицензии.
- Активировали программу, изменив параметр c false на true.
- Добавили IsCancelled что отвечает за активацию с флагом false, тем самым деактивировали его.
- Так как из кода функцию InitTestingVersion (выше мы про неё говорили) мы убрали, то добавили IsTestingVersion равно false, то есть запрет, отключить.
Но и это еще не все, так как мы переходим к следующей функции NLLicense(DateTime expiration) и смотрим на её код.
- Так как мы знаем, из анализа выше, что программа проверяет параметры через интернет то конечно же срок окончания лицензии программа получает исходя из значения expiration.
- А мы в свою очередь принудительно установим в программе свою дату окончания лицензии. Как это сзелать вы уже заметили expiration заменить на код что на картинке.
- А функцию InitTestingVersion() убрать из кода она нам уже не нужна вообще.
Но и это еще не все так как мы переходим к следующей функции NLLicense(RegData regData), как мы видим регистрационные данные загружаются (и проверяются) в программу используя regData.Параметр. Понятное дело что так как мы патчим софт, то их там не будет. А если их там нет то и активации тоже не будет. Но нас интересует не все строки кода а только важные что отвечают за триал и активацию, поэтому изменяем код вот так. Сначала посмотрите на картинку а после я прокомментирую что мы сделали.
На картинке ниже пункты (1,2):
- Это, у нас, оригинальный код, до изменения.
- А это код после изменения.
Первое что замечаем что: У оригинального кода все параметры загружаются с класса regData.Параметр. Если посмотреть на код одного из параметров (Хотя, у всех трех что мы изменили, он одинаковый), вы можете убедится что программа загружает значение используя параметр = value. Ну так вот, ну и естественно там идет проверка, это понятно така как программа сотрудничает (проверяет лицензионные данные) с собственным сайтом.
А мы, собственно, что сделали:
1. Принудительно подставили свою дату когда заканчивается срок лицензии.
2. Принудительно прописали параметр "pro", выше я показывал.
3. this.IsCancelled отключили, добавив флаг false;
4. И добавили this.IsTestingVersion с флагом false;
5. А функцию InitTestingVersion мы вообще не смотрим так как мы вырезали её с кода и зависимости от неё уже нет. Выше я про это говорил.
Такие выше лучше всего показать на видео, посмотрите, так будет более понятней.
Все манипуляции, с кодом , Видео: NTLM-4.wmv (Имеется и в архиве, на всякий пожарный).
Я думаю с этим разобрались, я пытался пояснить как можно подробно. Но и на этом наши правки не заканчиваются. Сейчас поясню в чем проблема, точнее какая логика действий. Так как мы внесли основные изменения то остаются не решенные вопросы, в нескольких местах, именно:
1. В функции ExtendedExpiration убрать условие проверки регистрации программы.
2. В функции IsExpired убрать весь код и прописать return false;
3. В функции IsExtendedExpired убрать весь код и прописать return false;
Ну и теперь перейдем к сохранению изменений в нашу динамическую библиотеку NetLimiter.dll (в которой мы проделывали все манипуляции с кодом). И тут, при сохранении, у нас возникает неприятная ситуация. А именно: При сохранении, в отладчике DnSpy, выскакивает окно с ошибкой. В котором сказано что невозможно сохранить изменения так как файл занят другим процессом. А помните, в начале статьи, я говорил что: при установке программы устанавливается и служба NetLimiter Service. Так вот, после того как вы установили программу эта служба автоматически запускается и работает. Вот почему мы не можем сохранить изменения в файл. А для того что бы изменения сохранились нужно, просто, остановить эту службу, что мы и сделаем. После этого изменения успешно сохраняются в динамическую библиотеку NetLimiter.dll. Я думаю все знают где находятся службы Windows ?
После этого давайте запустим нашу программу и посмотрим что у нас получилось. Запускаем программу, заходим в меню "Cправка" и и далее в меню "О программе и регистрация". Как видите программа успешно зарегистрирована, срок лицензии истекает в далеком 2050 году, добавлено мое авторство и реклама форума xss.pro. Мы добились желаемого результата. Как видите, вроде бы казалось все просто, но на самом деле без знаний и практики, логики, результата не добится. С этой программой мы закончили и теперь переходим к следующему пациенту.
Во второй части этой статьи, забегая немного наперед, мы разберем две программы, одного и того же разработчика. При этом минимизируем патчинг, сведя количество изменений до минимума. После этого напишем собственный патчер что будет вносить изменения автоматически в исполняемый файл. Исходники и готовый, исполняемый, файл патчера я приложу к файлам статьи.
И так приступим, следующий наш пациент это программа NimbleText (Официальный сайт программы: https://nimbletext.com ).
Более подробную информацию можно узнать на официальном сайте программы. Мы же сегодня собрались тут для основной цели: Анализ и взлом этой программы.
Если посмотреть через утилиту Exeinfo PE нет ли дополнительной защиты в виде протектора или пакера на программе то мы может убедится что её нет и программа написана на С#, картинка выше. На официальном сайте написано что демонстрационная версия имеет ограничения по функционалу. А если посмотреть на принцип активации, запустив программу, при этом открыв меню Help - Register Upgrade, мы видим форму активации программы. Тут есть несколько моментов на которые я обратил внимание (картинка ниже).
1. Если ввести код активации от фонаря (выдуманный) то программа выдаст вам сообщение что, мол, формат ключа активации неверный.
2. В форме активации, нам подсказывают какой формат ключа должен быть. И если отключить интернет, и ввести именно пример ключа что нам подсказывают то программа скажет нам что: мы должны быть подключены к интернету что бы она смогла проверить ключ. Так вот, к чему я виду: Даже не используя Http Analyzer (Анализатор трафика) мы уже знаем что для активации программе нужен интернет. Также если формат ключа верный то только тогда она проверяет его через свой сайт, делая запрос туда. А если формат не верный то тогда пункт 1, выше.
Теперь, давайте посмотрим визуально что же имеется в виду под ограничением функционала. Иногда ограничения сразу видны и нет никаких подводник камней. В нашем случае так и есть: открываем, к примеру, меню "Result" и видим на против функции "Sort" и "Remove Duplicates" установлен замок (условное обозначение что функция заблокирована). А если по любой из этих функций кликнуть мышкой то у нас выскочит форма активации. Вот мы и выяснили, визуально, в чем суть этих ограничений а именно часть функций (где стоит замок) заблокирована. Для чего я вообще это показываю: Изначально, мы должны быть в курсе всех нюансов активации и всем что с ней связано (максимально на сколько это возможно) так как бывают ситуации разные. К примеру если имеется обфускатор, на программе, который не удается снять полностью или частично и участки кода что отвечают за активацию под обфускатором то зная ограничения - мы можем пойти другим путем и поискать их. Это так для справки, в нашем деле, все способы хороши - чем больше знаем тем мы сильнее, при анализе. В этом вся суть.
Переходим к точке входа программы (Правой кнопкой, мыши, по программе в отладчике DnSpy - перейти к точке входа). Сейчас, покажу еще один, пошаговый, способ как можно добраться участка кода где происходит активация. Так как уже понятно, что при запуске, программа проверяет свой ключ активации то мы можем сделать вывод что в какой то из функций находится эта проверка. А в точке входа мы видим конструкцию кода. Где, в финале, у нас идет запуск AppContext, если перейти внутрь конструкции то мы сразу же попадаем на функцию public AppContext(string[] args). Так вот, что я предлагаю: Поставить точку останова в точке входа и на эту функцию и посмотреть как отработает программа под отладчиком. И в пошаговом режиме посмотреть на локальные переменные. Так мы получим еще больше информации, что поможет нам в дальнейшем анализе. Для наглядного примера что я имею в виду картинка ниже.
Все манипуляции, с кодом , Видео: NTT-1.wmv (Имеется и в архиве, на всякий пожарный).
Что же мы выяснили и что произошло на видео. В функции public AppContext сначала идет загрузка каких то настроек, что там мы пока что не знаем. А далее программа
пишет (какую то) информацию в лог. Если перейти и посмотреть что она записывает в лог то становится очевидно и понятно что: это ничто не иное как проверка обновлений. Но так как доступ в интернет я умышленно выключил то конечно же идет запись ошибок. Так вот, выходя из этой ситуации, будет, очень даже логично посмотреть что же это за настройки такие. Почему ? Но если есть проверка обновлений, то где то крутится и проверка активации. Тем более что нам ничего не мешает перейти в IOUtils.LoadSettings() и посмотреть что же там за функции вызываются.
Хотя бы посмотреть на названия и становится все понятно. А самое интересно что мои предположения оказались правильными, почему ?: Среди этих функций есть функция CheckForUpdates(). Так вот если поставить точку останова в начале этой функции то в "Локальных переменных" вы увидите то же сообщение что мы видели в логе (картинка Выше). Для того что бы понять полную картинку посмотрите на картинку ниже.
Но речь идет сейчас не об этом, а мы:
Делаем небольшую паузу, так как сегодня мы будем писать патчер на две программы (одного и того же разработчика) то делаем мы так:
1. Ставим курсор на флаг return flag и переходим, в отладчике, в IL режим.
2. Видим что по адресу 0x00012D52 06 , в Hex редакторе идет последовательность 062A133004007B00
3. Если в режиме C#, в отладчике, изменить return flag на return true и перейти снова в режим IL то адрес измениться на 0x0000002C 17
4. И в Hex редакторе последовательность 062A133004007B00 изменится на 172A133004007B00. То есть первое значение было 06 а стало 17
Все манипуляции, с кодом , Видео: NTT-2.wmv (Имеется и в архиве, на всякий пожарный).
С этой программой запомнили значения и переходим ко второй программе, этого же разработчика. Имейте терпение, в финале все станет понятно.
Следующая программа под названием NimbleSET по предназначению имеет некоторые отличие по функционалу от предыдущей. Но мы здесь собрались не функционал обсуждать а защиту так что приступим к делу.
Так вот, в чем же разработчик этих программ допустил ошибку.
1. Имена функций, проверок лицензий, совпадают. И только, немного, отличается код. К примеру функция CheckLicense была в предыдущей программе.
2. Применяя обфускатор: название функции CheckLicense осталось в открытом виде. А сам код - частично зашифрован.
О чем я говорю, ну давайте закинем программу в отладчик и воспользуемся банально поиском по слову "CheckLicense" и посмотрим найдет ли эту функцию отладчик в этой программе. Результат на лицо
, в виде картинки ниже.
Что мы имеем
1. Нашли функцию по ключевому слову "CheckLicense".
2. Видим её расположение и все функции что связаны с ней.
3. Да, не спорю, часть кода функции иероглифы, это же очевидно, мы же не снимали обфускатор. Да и не нужно, сейчас покажу Вам фокус
Чего только стоит сказать если обратить внимание на вызов IsLocked. Снова же, помните я говорил Вам, всегда о предположениях. Что все мы делаем предположительно а после уже, выходя из ситуации действует наверняка. Далее я расскажу Вам логику происходящего. То что на софте обфускатор это еще ничего не означает и бояться не стоит.
Как мы видим что в режиме IL кода (в отладчике) при просмотре содержимого кода: Идет вызов функции get_ActivationCode. А далее следует флаг ldc.i4.0 (). А это говорит о том что изначально функция имеет флаг False (то есть запрет, нет лицензии и все такое).
Так вот, если заменить значение ldc.i4.0 на ldc.i4.1 то программа будет активирована. Смотрим рисунок ниже.
Но мы, сегодня, преследуем другую цель а именно написание собственного патчера. Но сначала, также: как и с предыдущей программой, этого разработчика, нам нужно получить последовательность hex значений (байтов). Делаем также как и с предыдущей программой (Но с минимальным отличием).
А именно:
1. Переходим, в отладчике, в IL режим.
2. Видим что по адресу 0x000215DC 16 в Hex редакторе идет последовательность: 060628CE00000A16
3. Если в режиме IL, в отладчике, изменить ldc.i4.0 на ldc.i4.1 то адрес измениться на 0x000204A0 с значением 17
4. И в Hex редакторе последовательность 060628CE00000A16 изменится на 060628CE00000A17. То есть последнее значение было 16 а стало 17
Что было белее понятней то вся схема выглядит вот таким образом. Особо ничего сложного нет, главное вникнуть в суть дела.
1(Что заменить): 060628CE00000A16
2(На что заменить): 060628CE00000A17
А для 100% укрепления материала предлагаю посмотреть видео. Там подробно показано от куда берутся эти значения.
Все манипуляции, с кодом , Видео: NTT-3.wmv (Имеется и в архиве, на всякий пожарный).
Как видите, с этой программой, оказалось проще справится по ряде причин. Первая из которых это то что мы разобрали защиту предыдущей программы. А у этой программы алгоритм защиты аналогичный, с отличием только в том что на ней обфускатор. Но, не смотря на это, разработчик допустил ряд ошибок в защите этой программы, выше я говорил о них. Ну а теперь приступаем к написанию нашего патчера. Теперь вы поймете смысл полученных значений, то есть для чего мы получали последовательность hex значений (байт).
Заранее я запрограммировал патчер (Написанный на Delphi), исходный код + скомпилированный (в исполняемый файл) вариант вы найдете в архиве, к статье. Ну а теперь давайте посмотрим что у нас получилось. Как мне кажется, подобные разработки, будут интересны многим пользователям. Выглядит все это дело вот так, полный код кнопки Patch.
Что у нас происходит:
- Патчер должен находится в папке с нашей программой, там где расположен исполняемый файл программы.
- Как вы заметили на картинке, там где отмечено цифрами 1 и 2 - это наши значения (последовательности байт 1 и второй программы). То есть Что заменить \ На что заменить. Программа ищет последовательность, если она есть делает замену на указанную. Если нет то выводит сообщение с ошибкой.
- Ну и предусмотрено создание резервной копии, на тот случай если оригинальный исполняемый файл - нужен. Если птичка установлена то оригинальный файл сохранится с разширением .BAK.
В боевом состоянии все это дело выглядит так.
Ну и конечно же, демонстрация работы патчера, на видео. Показана работа сразу с двумя программами. Советую, после проделанной работы, ознакомится с видео.
Все манипуляции, с кодом , Видео: NTT-4.wmv (Имеется и в архиве, на всякий пожарный).
Как видите, свою работу патчер делает, программы прекрасно активируются и не просят никаких ключей. Наша цель достигнута, что запланировали то и получили.
На сегодня у меня все, всем хорошего настроения и до следующих статей. 
В архиве:
В архиве:
Программы Virustotal:
netlimiter-5.2.8.0.exe \ Virustotal: https://www.virustotal.com/gui/file/f22d8ae76bd43808d7d7c528f0a555211c6321a8db97b15b526d39b85e79a0af
NimbleSet.exe \ Virustotal: https://www.virustotal.com/gui/file/9a150c2d193ab6a7e83e44279ce6f005ebdc8efffeec0e25b39298f4a23439e5
NimbleText.exe \ Virustotal: https://www.virustotal.com/gui/file/6eb9409d42992e4631a6c1ef3fd557a196ad225450072f3b14e76331999387bd
Инструменты для анализа:
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:
Файлы к статье:
Скрытый контент для зарегистрированных пользователей.