Реверс-инжиниринг чужого приложения
Dolgo.polo Dev x Coffee&Code
#cross_post
💎 iOS
➖
в .ipa-файл, а в нем код в формате unix executable file (бинарь, скомпилированный код)
➖
да, если у вас есть доступ до .ipa файла (как его получить), можно с легкостью дойти до ассемблерного кода (используя Hopper, можно получить даже псевдо код)
приложения из AppStore шифруются и без jailbreak будет сложно достать что-то полезное из обфусцированного бинаря, но добрые (или не очень) люди создают сайты, где выкладывают незашифрованные бинари популярных приложений
➖
да, например тулза sideloadly позволяет пересобрать .ipa файл с дополнительным фреймворком (который мы можем написать сами)
этот фреймворк, к примеру, может случайно посвиззлить (подменить реализацию метода в рантайме) функцию начисления количества внутриигровой валюты и сделать нас миллионерами
➖
🔵 источник приложений только один — AppStore (уже нет)
🔵 подпись .ipa-файла, связанная с аккаунтом разработчика
🔵 DeviceCheck — фича, позволяющая сгенерировать токен оригинальность приложения и проверить его на бэкенде
➖
только если она в публичном доступе
в остальном, также декомпилировать и смотреть ассемблер или дампнуть хедеры (интерфейс либы)
еще есть возможность изучить библиотеку прямо в рантайме, если она написана на Objective-C, используя инструменты дебага
например можно:
🔵 запринтить все методы объекта (подробнее)
🔵 переопределить любой (да да, любой, даже приватный) метод
🔵 подменить класс в рантайме, создать класс в рантайме
🔵 вызывать любой метод (даже не объявленный)
🔵 подключить любую библиотеку (даже системные фреймворки Apple) и много чего еще
💎 Android
➖
в .apk-файл, в котором лежит java-байткод (Java/Kotlin-код компилируется в java-байткод на этапе сборки .apk)
➖
да
получить .apk-файл можно из любого приложения, установленного на устройстве
дальше достаточно использовать любую программу, умеющую превращать байткод обратно в Java-код
единственная защита от этого — обфускация кода. но она лишь усложняет читаемость кода, а не защищает от считывания
➖
да, поскольку после декомпиляции мы получаем обычный Java-код, который можем изменить его и заново собрать .apk
➖
🔵 подпись приложения
подпись — грубо говоря, уникальная строка, которая формируется на основе хэша от кода приложения и пароля, который знает только разработчик приложения
если изменить исходный код приложения, то подпись потеряет актуальность, и система не даст установить такое .apk
🔵 Play integrity API — фича, позволяющая сгенерировать токен оригинальность приложения и проверить его на бэкенде
➖
да, у нас есть доступ к исходникам любой либы, написанной на Java/Kotlin (в том числе системных/гугловских) прямо из Android Studio
💎 Выводы
все секреты, попавшие в .apk/.ipa-файл (токены/алгоритмы шифрования/пароли/протоколы...), могут быть вытащены и подменены с помощью реверс-инжиниринга на обоих платформах
на iOS изучить/подменить чужое приложение сложнее, но тоже реально
так что все что попало в .apk/.ipa-файл — считай open-source
спасибо Coffee&Code и в частности @gronzeisl за экспертизу по iOS
Dolgo.polo Dev x Coffee&Code
#cross_post
во что собирается приложение? в .ipa-файл, а в нем код в формате unix executable file (бинарь, скомпилированный код)
можно ли декомпилировать чужое приложение?да, если у вас есть доступ до .ipa файла (как его получить), можно с легкостью дойти до ассемблерного кода (используя Hopper, можно получить даже псевдо код)
приложения из AppStore шифруются и без jailbreak будет сложно достать что-то полезное из обфусцированного бинаря, но добрые (или не очень) люди создают сайты, где выкладывают незашифрованные бинари популярных приложений
можно ли пересобрать чужое приложение, изменив его исходники, и поставить себе на устройство?да, например тулза sideloadly позволяет пересобрать .ipa файл с дополнительным фреймворком (который мы можем написать сами)
этот фреймворк, к примеру, может случайно посвиззлить (подменить реализацию метода в рантайме) функцию начисления количества внутриигровой валюты и сделать нас миллионерами
что защищает от хакнутых приложений?можно ли посмотреть исходники любой библиотеки?только если она в публичном доступе
в остальном, также декомпилировать и смотреть ассемблер или дампнуть хедеры (интерфейс либы)
еще есть возможность изучить библиотеку прямо в рантайме, если она написана на Objective-C, используя инструменты дебага
например можно:
во что собирается приложение?в .apk-файл, в котором лежит java-байткод (Java/Kotlin-код компилируется в java-байткод на этапе сборки .apk)
можно ли декомпилировать чужое приложение?да
получить .apk-файл можно из любого приложения, установленного на устройстве
дальше достаточно использовать любую программу, умеющую превращать байткод обратно в Java-код
единственная защита от этого — обфускация кода. но она лишь усложняет читаемость кода, а не защищает от считывания
можно ли пересобрать чужое приложение, изменив его исходники?да, поскольку после декомпиляции мы получаем обычный Java-код, который можем изменить его и заново собрать .apk
что защищает от хакнутых приложений?подпись — грубо говоря, уникальная строка, которая формируется на основе хэша от кода приложения и пароля, который знает только разработчик приложения
если изменить исходный код приложения, то подпись потеряет актуальность, и система не даст установить такое .apk
можно ли посмотреть исходники любой библиотеки?да, у нас есть доступ к исходникам любой либы, написанной на Java/Kotlin (в том числе системных/гугловских) прямо из Android Studio
все секреты, попавшие в .apk/.ipa-файл (токены/алгоритмы шифрования/пароли/протоколы...), могут быть вытащены и подменены с помощью реверс-инжиниринга на обоих платформах
на iOS изучить/подменить чужое приложение сложнее, но тоже реально
так что все что попало в .apk/.ipa-файл — считай open-source
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍9👏9🎉2 2
Тут Play Market пообещал вычистить мусорные приложения, которые не имеют полезного функционала
А я вспомнил историю, рассказываю
Наверное, все слышали от стримеров/блогеров, насколько казики платят выше рынка за рекламу
Но мало где говорят, что такая же ситуация и в мобильной разработке
Лет 5 назад, когда только начинал заниматься фрилансом и постоянных заказчиков не было, часто натыкался на объявления:
Сделать приложение, которое открывает википедию в WebView. А если потрясти телефон и покричать в микрофон, открывается однорукий бандит. Оплата 10к
А 10к за приложение, которое пишется за несколько часов по шаблону — это много
Но, очевидно, делать и распространять такие приложения абсолютно незаконно ни с юридической, ни с моральной, ни с гуглплеевской точки зрения
Не брал такие заказы, и вам не советую
Есть миллион приложений, которые zip-архивы со скинами/модами кидают через Intent и ContentResolver в приложение Minecraft, тем самым устанавливая моды. Парочка из них мои)
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😁18 8👍4❤1☃1🤩1👾1
Собрал тут кажется самую большую коллекцию:
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥38❤5🆒2 2
Пошла волна 🌊 хейта в сторону кросс-платформы (раз, два), а у меня на эту тему давно черновик лежит)
Давайте так:
Все последнее время топят за кросс-платформу
А какие в ней плюсы для разработчиков?
Вы куда воюете?
Нет, я понимаю все плюшки для бизнеса — человеко-зарплат меньше, тайм ту маркет короче...
А для простых работяг:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍50💅6🤡3
Наткнулся тут на интересный стандарт хранения выбранного в системе языка:
Казалось бы, достаточно сохранить код языка (
ru, en, fr...). И возможно зарезервировать место для диалекта и бульку для "слева-направо или справо-налево"А на самом деле может быть так:
he-IL-u-ca-hebrew-tz-jeruslmчто означает
Hebrew as spoken in Israel, using the traditional Hebrew calendar, and in the "Asia/Jerusalem" time zone as identified in the tz database
а теперь представьте, сколько там еще интересного, если прочитать все 83 страницы BCP 47
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Представьте, запускается приложение
В каком порядке будете инициализровать эти 4 библиотеки?
Sentry SDK — логирует ошибки, краши и ANR-ыAuth SDK — хранит данные о юзереUserTracker SDK — логирует действия юзера, в том числе события запускаFeatureFlags SDK — стягивает фича флаги для А/Бпобедителю —
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1 10🦄4🤯2
Гугл в начале мая анонсировал фичу Android Theft Protection
Если вор выхватит у вас телефон из рук и начнет с ним убегать, то экран автоматически заблокируется
Работает это на основе Google AI, который вероятно анализирует датчики акселерометра, gps и, возможно, камеры/микрофона (это уже мои догадки)
Вопросов эта фича вызывает больше чем ответов:
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
9🤯14😁12👍5 4
Обратил внимание, что после обновления на Android 14 в списке запущуенных приложений начали отображаться запущенные процессы
"1 активный фоновый элемент"
Подозреваю, что туда попадают запущенные Service и, возможно, воркеры WorkManager-а
так что теперь у юзеров появляется дополнительная более явная возможность остановить фоновую работу
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍14🦄6 4🤔1
This media is not supported in the widget
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
32 16👍3🦄2👎1🔥1👏1
Но еще сложнее следить за жизненным циклом
Одна из самых сложных штук в мобилке, хотя казалось бы
Во-первых, ЖЦ отличается у:
Добавим влияние диалогов/шторок, частично перекрывающих экран
Дальше умножаем это на сложные экраны современных девайсов — раскладушки, двойные экраны, режимы окна к окне...
Складываем с рекомпозицией от Compose, если используете AndroidView внутри Compose или наоборот
И добавляем кейсы, когда быстро прокручиваешь навигацию вперед-назад, и все методы жизненного цикла от разных экранов-элементов вызываются не друг за другом, а в рандомном порядке
Готово, стало сложно
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Выступал тут на DevFest, у меня оттуда остался один полезный слайд про OkHttp-клиент
Коротко:
OkHttp-клиент — самый популярный сетевой клиент на Android, поверх которого часто используют Retrofit
Главное — он умеет много всего из коробки
А возможно это все благодаря Interceptor-ам — цепочке колбеков, позволяющих прочитать/изменить запрос и ответ
Вы можете написать кастомные Interceptor-ы и добавить их в список appInterceptor-ов или networkInterceptor-ов
Или можете залезть в исходники OkHttp и посмотреть на его стандартные Interceptor-ы, в которых как раз и реализована вся вышеперечисленная магия
На картинке:
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍31🔥15⚡3 3
Нашел для себя еще одну крутую комманду adb:
adb shell dumpsys window windows | grep 'mActivityRecord' // в Windows grep можно заменить на find
Она показывает имя открытой Activity
сделал для нее alias:
adbAStack = "adb shell dumpsys window windows | grep 'mActivityRecord"Например, с помощью нее вычислил название активити со списком свернутых приложений в системном лаунчере:
com.sec.android.app.launcher/com.android.quickstep.RecentsActivity Теперь могу открыть это меню прямо через adb (зачем?) или сделать в приложении кнопку "открыть список свернутых приложений" (зачем??)
А если серьезно команда имба, так как по внешнему виду UI не всегда понятно, с какой Activity работаешь
еще про adb:
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍32 8
Dolgo.polo Dev | Денис Долгополов
кстати напоминаю про эти папочки
список там постепенно пополняется📝 , как натыкаюсь на новые каналы
и хожу агитирую шарить по возможности)🪐
список там постепенно пополняется
и хожу агитирую шарить по возможности)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12 3
Многие вероятно слышали про фингерпринт браузера:
-> сложив пару десятков открытых данных о браузере/компьютере пользователя, можно с большой вероятностью идентифицировать пользователя
Такой же фингерпринт без труда можно собрать в мобильном приложении
Недавно узнал два интересных факта:
и заодно выводит значения всех параметров, из которых формируется фингерпринт
Например, в него входят настройки WebGL, высота системных UI-панелей, список установленных плагинов и поддерживаемых видеокодеков
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥9 4
Вместо флагмана новых поколей стоит взять в руки старенький инфиникс с поцарапанным экраном
Находиться нужно в положении полулежа, чтобы поворот экрана срабатывал в самый неожиданный момент
На часах должно быть около 17:00-19:00 вечера, когда устройство в рандомный момент переключается с темной темы на светлую
Язык системы — персидский или японский, время системы строго не московское
При этом стоит переместиться из уютного офиса куда-нибудь в область подвала, иначе сверхскоростной офисный Wi-Fi исказит пользовательский опыт
В идеале в этот момент батарея должна быть практически разряжена, а в списке запущенных приложений обязан находиться Cyberpank 2077, открытый через эмулятор Windows 10, и десяток свернутых браузеров
Также нужно не забыть выдать всем остальным приложениям права на показ всплывающих уведомлений в любом момент времени, чтобы они тоже вставили свои пять копеек
Гугл сервисы отключаем, хуавей кстати тоже
Версия ОС должна быть либо достаточно старая, либо последняя — работать будут одинаково непредсказуемо
Память устройства при этом должна быть забита на 97%. Оставшиеся 3% нужны, чтобы ПЗУ закончилось в случайный момент
Подготовка на этом завершена, можно начинать тестирование
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁78👍14🍾9 7🏆4👏1🦄1
Наливал тут кипяток из автомата с водой. Режим "экстра горячая вода для чая" на нем включался только после выполнения сложного ритуала — покрутить колесико, зажать кнопку, пару секунд подумать, и только после этого кипяток начинал литься
Давайте подумаем, где такой же подход стоит использовать в приложении
Если действие потенциально опасно для юзера, нужно его когнитивно нагрузить, чтобы не удалось выполнить это действие на автомате
Как минимум — показать предупреждающий экран и попросить ввести пин-код
Хотя эти действия настолько обыденные, что обычно выполняешь их с той же легкостью, как открытие двери и выключение утюга
Пора придумывать дополнительные усложнения. Ведь пользователь должен чувствовать себя безопасно в нашем приложении, понимать, что мы не дадим ему сделать глупость случайно:
Хороший пример кстати это флоу отмены подписки в яндексе. Случайно точно не нажмешь
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27🦄9 6👍3
Интересный небольшой факт — WebView может загружать страницы без отображения самой WebView на экране
Можно вызывать
WebView(context).loadUrl(url) не отображая WebView на экране и не добавляя ее в версткуС помощью этого можно:
....
еще по теме:
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥32❤🔥6👍4❤1
Старая история, которая уже чут-чут перебродила, но от того не стала менее увлекательной
Немного контекста:
android.webkit.* (WebView) — это java-классы, которые мы используем для взаимодействия с WebView. Являются частью Android SDKChromium — это нативный движок, к которому обращаются java-классы WebView через JNI (Java Native Interface) и который выполняет всю основную работуДело было в 2021 году:
Google выпустил обновление движка Chromium на пользователей. А он сломанный
И у всех гигантов (Gmail, Amazon...) стала крашится WebView в приложении
Помогало одно — откатить WebView через Play Market (или ждать обновления от гугла)
Конец
Кстати, если вам мало боли с WebView в жизни, то в Play Market можно скачать Canary и Beta сборки WebView (Chromium) и переключиться на них. На картинке отзыв на Сanary сборку. Она обновляется, внимание, ежедневно
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😎8🔥6🤣5👍1
Возможно я проспал этот момент на начальных уроках по Android, но
Application.onCreate() вызывается чаще, чем пользователь запускает приложениеТо есть прям гораздо чаще
Например, если приходит пуш, приложение запускает фоновую работу или система решает прогреть приложение для быстрого запуска — вызовется Application.onCreate()
Вывод:
Application.onCreate(), а первый вызов Activity.onCreate() (если эта логика нужно только для кейсов, когда юзер действительно открыл приложение)Например, возможно ваше приложение логирует открытие приложения в
Application.onCreate(), а по факту пользователь его не открывал, и у вас совершенно фейковые представления о DAU Или, возможно, из Application.onCreate() можно выкинуть инициализацию части библиотек, который не нужны без фактического открытия приложения пользователем
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥14😎5❤🔥1🦄1
Судьба заставила поразбираться в лицензиях на опенсурс, сейчас расскажу, что узнал
Не буду давать названия конкретных лицензий, так как сто процентов в чем-нибудь вас обману. Вместо этого опишу основные моменты, на которые стоит обратить внимание:
- да | нет | в каких случаях да, в каких нет
- да, если авторы хотят попиариться
- нет, если авторы не хотят разрешать пиариться на своем имени
- да | нет | частично да, частично нет
- например, ваш опенсурс проект распространяется по лицензии "А". и вы хотите в нем использовать другой опенсурс проект, распространяемый по лизенции "Б". нужно проверить, совместимы ли лицензии "А" и "Б". если нет, то нужно связываться с автором и решать вопросики
- тут как с правилами использования сайта — для внесения изменений нужно согласие от всех, кто уже успел на них посмотреть
Бонусный факт:
все мы слышали про copyright (копирайт, авторское право) ©
но сущесвуте еще и copyleft (копилефт, авторское лево) — он изображен на картинке поста. если коротко, копилефт лицензиями называют те, которые "заражают" ваш проект и накладывают на него некоторые обязательства (например, выложить все внесенные изменения в опенсурс)
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍4✍1❤🔥1
#рекомендация
@rutheniumos — частный канал об андроид-разработке с упором в безопасность
там выходят лонгриды о дырах в системе и посты о внутреннем устройстве андроида
С чего можно начать:
🔵 Webview в Android 15 — взгляд в будущее
🔵 Как Android могут угрожать вашей конфиденциальности — как использовать обои Android для слежки за пользователями
🔵 Бесшовные обновления в OS Android
@rutheniumos — частный канал об андроид-разработке с упором в безопасность
там выходят лонгриды о дырах в системе и посты о внутреннем устройстве андроида
С чего можно начать:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8🥰2❤🔥1🤡1