Что значит реверсить программу

Обратная разработка позволяет не только разобраться в существующих приложениях, но и модифицировать их. В этом смысле приложения на Android — клад для начинающего хакера и настоящий аттракцион для любителя. Сегодня мы разберем несколько приложений, чтобы потренироваться в реверс-инжиниринге и узнать о подлинных возможностях твоего смартфона.Какое приложение мы будем препарировать?

Я выбрал для своих целей VK Admin — программу для управления сообществами «ВКонтакте» со смартфона. В нем не предусмотрена темная тема, поэтому мы с тобой попробуем эту тему добавить.

Собираем и разбираем

Сначала извлечем все ресурсы приложения, используя утилиту apktool — она распаковывает и запаковывает файлы пакетов APK, которые хранятся в сжатом, бинарном виде, и дизассемблирует программный код, заключенный в них.Чтобы получить установочный пакет, можно воспользоваться Android Debugging Bridge — системой для отладки программ на устройстве. В *nix-подобных системах ADB ставится стандартно, с помощью пакетного менеджера, а в Windows — идет в составе Android Studio или Android SDK Platform Tools.В первую очередь установим приложение из Google Play Store на смартфон, подключим его к компьютеру с помощью USB, затем воспользуемся ADB для переноса пакета приложения на компьютер и извлечем его содержимое.

Как пользоваться IDA PRO. Как найти оффсеты в любой игре

Для создания подписи в первый раз нужно воспользоваться утилитой keytool (входит в Java Development Kit ):

Меняем цветовые схемы

Цвета в приложении можно настроить несколькими способами:

Все эти способы жизнеспособны и постоянно используются.

colors.xml

Цветовая палитра приложения содержится в файле com.vk.admin/res/values/colors.xml . Структура файла выглядит так:

styles.xml

В файле com.vk.admin/res/values/styles.xml заданы цвета, но только некоторые. Этот файл используется самими разработчиками, когда они хотят сделать несколько цветовых схем приложения. Если же этих схем нет, работать приходится нам с тобой.

Некоторые цвета текста и фона заданы именно здесь, поэтому их нужно изменить аналогично с colors.xml .

Layout

В папке com.vk.admin/res/ находятся описания экранов приложения.

  • com.vk.admin/res/layout/ — универсальное хранилище экранов для всех смартфонов. Если нет каких-то специальных указаний, то будут использованы эти ресурсы;
  • com.vk.admin/res/layout-v«XX (где XX — версия SDK смартфона, зависит от версии Android на устройстве) используются для работы с самыми передовыми элементами UI;
  • остальные com.vk.admin/res/layout-. задают специфичные экраны приложения для ориентации устройства, разрешения и так далее.

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

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

Smali

Внутри приложений на Android используется собственный формат файлов — .dex , или Dalvik EXecutable , и собственная виртуальная машина, чтобы эти файлы исполнять, — Dalvik .

ВВЕДЕНИЕ В РЕВЕРСИНГ С НУЛЯ С ИСПОЛЬЗОВАНИЕМ ИДА ПРО. ЧАСТЬ 1.

Как и с любым компилируемым языком, для .dex есть байт-код — smali — человекочитаемый и понятный с первого взгляда.

Машина Dalvik, в отличие от JVM , — регистровая, а не стековая. Регистры не имеют типов и могут хранить всё: числа, строки, экземпляры классов. При этом язык smali строго типизирован.

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

  1. const-string v1, «MyTag» — записать в регистр v1 строку «MyTag» .
  2. invoke-static , Ljava/lang/String;->valueOf(I)Ljava/lang/String; — вызвать функцию String.valueOf(v0) . Здесь static означает, что функция встроена в виртуальную машину; — список аргументов; L показывает, что сразу за ним идет название объекта, класса и так далее; java , lang , String; — тип строки; I — тип числа, Integer; а все вместе ( ->valueOf(I)Ljava/lang/String; ) говорит нам о том, что вызывается функция valueOf от одного аргумента и возвращает она строку.
  3. move-result-object v2 — записать результат предыдущей операции в v2 .
  4. invoke-static , Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I — залогировать содержимое v2 под тегом из v1 .

Если не удается понять, что значит тот или иной регистр или что делает та или иная функция, используй декомпилятор smali в Java — Jadx .

Интуитивно понятный интерфейс Jadx

Использовать Jadx просто — нужно лишь выбрать файл и открыть его, код будет автоматически декомпилирован и показан.

Рекомендую ознакомиться с документацией по байт-коду Dalvik VM.

setBackgroundColor

Для некоторых экранов приложения используется параметр setBackgroundColor(I)V , который устанавливает цвет фона. Часто это не статичные экраны, а динамические: с поддержкой скролла, различные списки и карточки.

Читайте также:
Программа чтобы накачать тело

invoke-virtual , Landroid/webkit/WebView;->setBackgroundColor(I)V

Эта строка занимается изменением. Чтобы изменить цвет, нужно его записать в регистр, а затем передать в функцию вместо настоящего.

const v12, -0x1000000 #### Эквивалент 0xFF000000 — черного invoke-virtual , Landroid/webkit/WebView;->setBackgroundColor(I)V

Теперь пройдись по всем файлам и замени цвет.

Бывают случаи на порядок проще.

const v2, -0x1 #### Здесь -0x1 == 0xFFFFFFFF — белый цвет invoke-virtual , Landroid/support/v7/widget/CardView;->setBackgroundColor(I)V

Нужно просто изменить -0x1 на -0x1000000 , и приложение погрузится во тьму.

Стоит быть внимательным и пытаться разобраться в коде: иногда оптимизатор кода будет перемещать инструкции const вверх, и ты можешь их не заметить.

setTextColor

Иногда текст, который меняется в ходе работы с приложением, может менять свой цвет. За это отвечает параметр setTextColor(I)V , второй аргумент которого можно подменить на нужный, в нашем случае — белый.

#### Меняем цвет const p1, -0x1 #### на белый invoke-virtual , Landroid/widget/TextView;->setTextColor(I)V

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

Результат изменений

Меняем функциональность приложения

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

Возьмем другое приложение — ISS Detector . Оно показывает положение МКС над Землей. В нем можно купить расширения: показ комет, планет, Луны, телескопа «Хаббл».

При копировании приложения на компьютер может возникнуть проблема: в составе приложения не один и не два, а целых три файла apk !

$ adb shell pm path com.runar.issdetector
package:/data/app/com.runar.issdetector-dtgy8_hlf1y-cekrg1_W-A==/base.apk
package:/data/app/com.runar.issdetector-dtgy8_hlf1y-cekrg1_W-A==/split_config.en.apk
package:/data/app/com.runar.issdetector-dtgy8_hlf1y-cekrg1_W-A==/split_config.xxhdpi.apk

Копируем все. При переустановке приложения файлы split_config.en.apk и split_config.xxhdpi.apk потеряются, а без них приложение будет вылетать. Поэтому их нужно будет переподписать: зайти в них как в архивы ZIP, удалить папку META_INF и прогнать через стандартную процедуру утилиты jarsigner. Основной же файл мы будем препарировать с помощью apktool.

Покупками в приложении занимается интерфейс IInAppBillingService . Для него прописана обертка com.runar.issdetector.util : IabHelper, IabResult, Purchase, Security, Inventory.

В этом приложении можно не идти напролом, обманывая сервис покупок. Проще заставить приложение думать, что все уже куплено. В этом нам поможет Inventory.smali .

В особо сложных случаях такой трюк провернуть не удается, и тогда приходится подменять данные, заставляя сервис ложно сообщать о совершенных покупках. Подробнее об этом можно почитать в материале компании Securing Apps ( PDF ).

Открыв файл, ты увидишь поле mPurchaseMap , которое содержит в себе все покупки: номер товара, сопоставленный с покупкой, которую совершил пользователь.

.field mPurchaseMap:Ljava/util/Map; .annotation system Ldalvik/annotation/Signature; value = < «Ljava/util/Map;» > .end annotation .end field

Далее в коде мы видим строку hasPurchase(String sku) -> boolean , которая проверяет, совершал ли пользователь покупку. Для этого делается проверка на существование ключа sku в mPurchaseMap .

.method public hasPurchase(Ljava/lang/String;)Z .locals 1 .line 45 iget-object v0, p0, Lcom/runar/issdetector/util/Inventory;->mPurchaseMap:Ljava/util/Map; invoke-interface , Ljava/util/Map;->containsKey(Ljava/lang/Object;)Z move-result p1 return p1 .end method

А что будет, если в любом случае отдавать true ?

.method public hasPurchase(Ljava/lang/String;)Z .locals 1 const p1, 0x1 return p1 .end method

Собираем приложение и устанавливаем его.

$ adb install-multiplie com.runar.issdetector.apk split_config.xxhdpi.apk split_config.en.apk
Success

Результат изменения кода

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

Источник: teletype.in

Препарируем P-Code. Как реверсить старый софт на Visual Basic

Что­бы нем­ного раз­нооб­разить свою жизнь, сегод­ня мы сно­ва зай­мем­ся раз­боркой антиква­риата. Мно­гие уже забыли о сущес­тво­вании такого инс­тру­мен­та, как дав­но похоро­нен­ный P-Code, в который тран­сли­рова­лись прог­раммы на Visual Basic. Тем не менее соз­данные с его помощью при­ложе­ния до сих пор сущес­тву­ют, и сегод­ня мы с тобой акку­рат­но сло­маем одно из них.

warning

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

Читайте также:
Программа приема иностранной делегации пример

К сожале­нию (или счастью?), Microsoft поэтап­но похоро­нила P-Code, спер­ва перей­дя на ком­пиляцию пи‑кода в натив, от чего, на мой взгляд, он стал силь­но более неук­люжим, а затем и Wow­се пол­ностью переве­ла VB на плат­форму .NET. Тем не менее из‑за сво­ей прос­тоты и популяр­ности в былые вре­мена соз­данные на P-Code про­екты весь­ма мно­гочис­ленны и про­дол­жают работать по сей день.

Что­бы ты не испу­гал­ся, если вдруг в твои руки попадет подоб­ный раритет, знал, что с ним делать и с какой сто­роны к нему подой­ти, рас­смот­рим спе­цифи­ку и внут­реннее устрой­ство P-Code на при­мере доработ­ки неболь­шой гра­фичес­кой прог­раммы. Усло­вия задачи таковы: у нас есть соф­тина, в текущей пос­тавке которой отклю­чены некото­рые полез­ные фун­кции (нет свя­зан­ных с ними пун­ктов меню). Но сама чер­ная кош­ка в тем­ной ком­нате при­сутс­тву­ет, то есть в модуле име­ются и нуж­ные нам пун­кты меню, и код отве­чающих за них фун­кций. Прос­то они невиди­мы для нашей лицен­зии, и открыть их — наша задача.

Для начала опре­деля­ем тип прог­раммы и ее защиту при помощи DetectItEasy.

DIE определил компилятор программы как Microsoft Visual Basic 6.0

По­пыт­ка заг­рузить иссле­дуемую прог­рамму в IDA, к сожале­нию, не при­нес­ла никако­го полез­ного резуль­тата.

IDA считает, что нативный код отсутствует или зашифрован

Нас­тало вре­мя для нашего любимо­го отладчи­ка x64dbg. Нем­ного повозив­шись в нем, обна­ружи­ваем, что основной код кру­тит­ся внут­ри модуля msvbvm60. dll .

Программа в отладчике

На­лицо клас­сичес­кая вир­туаль­ная машина. В ней интер­пре­тиру­ется поток дан­ных, текущий ука­затель коман­ды находит­ся в регис­тре esi . Из потока выбира­ется байт кода опе­рации, и по его индексу из таб­лицы адре­сов обра­бот­чиков ( 6909AA24 в дам­пе) выбира­ется адрес обра­бот­чика сле­дующей коман­ды, на которую дела­ется переход. По счастью, это не злоб­ный про­тек­тор типа Enigma или Themida, никаких обфуска­торов и анти­отладчи­ков в коде нет. Более того, нам даже не тре­бует­ся изоб­ретать велоси­пед, раз­бирая вир­туаль­ную машину самос­тоятель­но — за вре­мя сущес­тво­вания VB за нас это сде­лали дру­гие доб­рые люди.

Итак, мы наконец вплот­ную подош­ли к понятию P-Code. Этот тер­мин был при­думан еще пол­века назад одним из осно­вопо­лож­ников сов­ремен­ного прог­рамми­рова­ния Ник­лаусом Вир­том для любого аппа­рат­но‑незави­симо­го псев­докода вир­туаль­ной машины. Одна­ко с лег­кой руки Microsoft при­жилось оно при­мени­тель­но к теперь уже мер­тво­му байт‑коду Visual Basic, пре­иму­щес­твен­но 6-й вер­сии.

Схе­ма фун­кци­они­рова­ния P-Code пре­дель­но прос­та и вид­на на скрин­шоте выше. Из стран­ных осо­бен­ностей мож­но отме­тить наличие целых шес­ти таб­лиц обра­бот­чиков байт‑кодов. Это зна­чит, что не все опко­ды псев­докоманд одно­бай­товые, каж­дый из пос­ледних пяти опко­дов глав­ной таб­лицы ( FB-FF ) — «сос­тавной» двух­бай­товый. То есть обра­бот­чик каж­дого из этих кодов счи­тыва­ет сле­дующий байт и переда­ет управле­ние по его индексу на обра­бот­чик из дру­гой таб­лицы адре­сов, в которой тоже содер­жится 256 воз­можных зна­чений. Непонят­но, зачем исполь­зует­ся такой хит­рый спо­соб, а глав­ное — для чего пре­дус­мотрен такой запас опко­дов, ведь из 1531 воз­можно­го задей­ство­вано все­го 822, при­чем некото­рые дуб­лиру­ют друг дру­га.

Я не буду при­водить здесь пол­ную таб­лицу опко­дов P-Code, жела­ющие могут най­ти ее на сай­те DotFix или даже в более информа­тив­ном виде в ис­ходни­ках про­екта Semi-VB-Decompiler. Там же при­водят­ся аргу­мен­ты и при­мер­ный смысл каж­дого опко­да.

Во­ору­жив­шись дан­ной информа­цией, гораз­до про­дук­тивнее раз­бирать и отла­живать прог­рамму даже в x64dbg. Одна­ко сущес­тву­ют и еще более прод­винутые инс­тру­мен­ты для отладки и деком­пиляции пи‑кода. Два из них ты уже, навер­ное, уви­дел по при­веден­ным выше ссыл­кам: сво­бод­ный деком­пилятор Semi-VB-Decompiler и ком­мерчес­кий VB Decompiler. Еще один незаме­нимый инс­тру­мент для работы с пи‑кодом — сво­бод­ный ди­зас­сем­блер‑отладчик VBDec.

На­до ска­зать, что эти про­екты весь­ма сырые и име­ют мас­су недоче­тов (к при­меру, Semi-VB-Decompiler у меня вооб­ще не деком­пилиро­вал ни одно­го фай­ла и не смог най­ти валид­ную сиг­натуру), но их воз­можнос­ти допол­няют друг дру­га. К при­меру, VB Decompiler уме­ет с более‑менее перемен­ным успе­хом не толь­ко дизас­сем­бли­ровать, но и вос­ста­нав­ливать VB-код. При­чем не толь­ко из P-Code, но и из ском­пилиро­ван­ного из него натива, и даже из .NET. А хоть VBDec это­го и не уме­ет, зато его дизас­сем­блер на нес­коль­ко поряд­ков более пря­мой и без­глюч­ный, а глав­ное, у него есть пол­нофун­кци­ональ­ный дебаг­гер с воз­можностью трас­сиров­ки P-Code.

Вер­немся к нашей задаче и поп­робу­ем решить ее уже с помощью этих чудес­ных инс­тру­мен­тов. Для начала откры­ваем иссле­дуемую прог­рамму в VB Decompiler и ищем глав­ное окно. В VB Decompiler для это­го име­ется инс­тру­мент Tools-Search string (он, прав­да, вре­мена­ми под­глю­чива­ет, но потер­петь мож­но). Хоть прог­рамма и обфусци­рова­на, но мы находим и глав­ное окно MDIForm1, и пер­вый пункт меню из скры­тых из‑за отсутс­твия лицен­зии.

Читайте также:
Можно ли восстановить удаленную программу на ПК

Форма основного окна, вид из VB Decompiler

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Источник: xakep.ru

Простой реверсинг и защита .NET приложений.

DEEPSIDE

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

Эти действия могут включать в себя нахождение алгоритма генерации/проверки кода, пароля, алгоритма организации защиты и т.д. Совокупность этих действий, как я уже сказал, и называется Reversing.

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

  • Сегодня мы будем реверсить .NET приложение.

Начало. Инструментарий.

Для реверса нам необходимы программы:

  1. ExeInfoPE / RDG Packer Detector
  2. dnSpy
  3. UnConfuserEx

ExeInfoPE и RDG Packer Detector выполняют одну (из) важную функцию для реверса — Узнать ЯП на котором написана программа.

dnSpy — Инструмент для дизассемблирования, говоря простым языком эта утилита позволит нам доставать весь код из exe файла.

DnSpy включает в себя декомпилятор, отладчик и редактор сборки (и т. д.) Он может быть легко расширен путем написания собственного расширения.

UnConfuserEx — утилита позволяющая снимать протектор ConfuserEx (о нём чуть позже).

Теперь представим, вам методом СИ скинули exe файл в котором содержится вирус, стиллер к примеру , но мы ведь не глупые и во всём видим подвох, пробуем открыть файл в ExeInfoPE (файл брал с этой статьи)

Видим, что программа написана на C#, в Lamer Info написано, что файл не накрыт никаким протектором, код чист.

Теперь запускаем dnSpy и выбираем наш файл, после Декомпиляции видим это:

Здесь можем увидеть следующую информацию:

  • Версия фреймворка, у меня это 4.5
  • Название проекта

Перейдём в точку входа, кликнув по «Точка входа: ИмяПроекта.Program.Main». Перейдя в точку входа видим весь код класса Program.cs / Main.cs:

Пролистав чуть ниже видим операции с почтой:

В коде можно заметить логин и пароль от почты хакера. Теперь можем зайти на почту хозяина стиллера и украсть все его логи!

Защита кода.

Для защиты кода используются обфускаторы / протекторы для ЯП на котором написана программа. Как пример защитим код стиллера при помощи обфускатора ConfuserEx (далее конфузер)

Открываем конфузер, добавляем наш файл, во вкладке «Basic Settings» выставляем нужную защиту, каждая защита имеет свой ряд функционала:

  • Minimum:

  • Normal:

В методе Maximum используется все функции для защиты кода. После выбираем вкладку «Confuse!» и наш обфуцированный файл появляется в папке «Confused»:

Стоит заметить, чем выше защита, тем выше размер защищённого файла. Теперь когда мы откроем файл с защищённым кодом в ExeInfoPE, мы увидим чем накрыт файл и с какими параметрами защищён код:

В поле «Lamer Info» показывается информация о методах снятия данного протектора или обфускатора.

Попробуем закинуть в dnSpy обфусцированное приложение:

Основная информация не изменилась, НО поменялась точка входа, попробуем открыть её:

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

Ещё нужно запомнить вот что:

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

Снимаем защиту ConfuserEx

Для снятия конфузера нам потребуется ConfuserExSwitchKiller. Открываем ConfuserExSwitchKiller.exe в поле «Browse For Assembly» выбираем наш файл:

Далее тыкаем «Deobfuscate» и видим, что наш файл успешно деобфусцирован:

Защита ConfuserEx снята. Закидываем чистый файл в dnSpy:

Уже видим знакомую точку входа, переходим и видим, код абсолютно чист:

Все строки декодированы, а программа реверснута.

Итог.

Сегодня мы разобрали базовые методы реверса .NET приложений. Научились узнавать на каком языке программирования написана программа. Также научились реверсить C# приложения, защищать код, снимать ConfuserEx.

На этом статья заканчивается, удачи каждому начинающему реверсеру)

Еще больше интересных статей на канале DEEPSIDE

Источник: telegra.ph

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru