Убедитесь, что APK был создан из данного исходного кода


10

Для того же приложения у меня есть:

  • APK из магазина приложений,
  • что называется исходным кодом для той же версии. С довольно обычным скриптом и структурой Gradle.

Я хочу проверить, действительно ли APK был построен из этого исходного кода или нет.
Как это проверить?

Заметки:

  • APK не запутывается.
  • У меня нет оснований доверять чьей-либо подписи. Я доверяю только исходному коду.
  • Я уже создал приложение для себя, но теперь я хочу знать, был ли APK в порядке или нет.
  • Желательно с инструментами командной строки Linux, но любой инструмент в порядке.

2
Я не пробовал этого, но вы должны иметь возможность использовать Apktool для этой цели: перепроектировать оба .apkфайла, а затем запустить diff для получающихся каталогов. Единственной разницей тогда должна быть подпись (которая не может совпадать по понятным причинам). Подумайте об этом: просто разархивируйте .apkфайлы и сделайте бинарный diff, сделайте то же самое. И то и другое, разумеется, потребовало бы использования одинаковых версий библиотеки и т. Д. При компиляции :)
— Иззи

@Izzy: " одинаковые версии библиотек ": версия API написана в манифесте и версии библиотек в скрипте Gradle, так что эта часть должна быть в порядке, я думаю. Список файлов / папок, которые можно игнорировать, мог бы стать отличным ответом (бонус для реальных командных строк).
— Николас Рауль

1
Я мог бы сделать это, если бы я был на моем компьютере дома, который я не в настоящее время. Но для того, чтобы это было «честным ответом», мне нужно было бы сначала попробовать его самому :) В случае, если я забуду (и никто не делал это до меня), не стесняйтесь отправить мне еще один пинг (например, в чате) о 8..10h :)
— Иззи

@Izzy diffМетод кажется изящным ... но что, если ребята из магазина приложений запутывают APK при компиляции?
— Гримуар

ИМХО, вот где Apktool вступает в игру. Вы проверили ссылку? Также взгляните на LibRadar, который использует это. AFAIR это помогает в обфусцировании (что-то должно, или LibRadar будет трудно найти эти библиотеки).
— Иззи

Ответы:


2

Вы можете сделать это только с воспроизводимыми сборками:

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

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

Одним из примеров разработчика, который в настоящее время делает это, является Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds


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

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

«точно воссоздать среду сборки»: можно ли догадаться? Например, если по какой-то причине сборка на Mac или Linux приводит к другому APK, могу ли я догадаться, был ли APK магазина приложений создан на Mac или Linux?
— Николас Рауль

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

1

Одна из замечательных особенностей Java и APK - вы можете полностью декомпилировать APK в исходный код Java.

Тем не менее, результирующий исходный код не обязательно будет идентичным.

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

Для декомпиляции используйте dex2jar и JD-Gui .

редактировать Я просто заметил , что вы хотели Linux инструментов. Мой единственный опыт работы с Windows, но я уверен, что аналогичные инструменты существуют для Linux.


Если я правильно понимаю, ваш метод состоит в том, чтобы проверить, каким было последнее изменение в репозитории исходного кода, затем декомпилировать APK и вручную проверить, не обнаружены ли последние изменения в декомпилированном коде, верно? Интересный подход, но это не скажет мне, была ли добавлена ​​call-home или встроенная реклама в версию APK, верно?
— Николас Рауль

1
Это подход, который я использовал в офисе, чтобы попытаться сопоставить неизвестный APK с исходной версией, что было достаточно, если вы знаете, что можете доверять разработчикам. Но, как вы говорите, для ненадежной стороны, вероятно, все еще возможно проникнуть в что-то. Я надеюсь, что кто-то предоставит более определенный ответ, будет также полезно для меня.
— Марк Ch

Как насчет того, чтобы скомпилировать исходный код в APK самостоятельно, затем декомпилировать его обратно в исходный код и сравнить его с декомпилированным исходным кодом из Play Store APK? Кто-нибудь пробовал это?
— Сергей Белозоров

1
@SergiyBelozorov Извините, я не могу ответить на этот вопрос, я больше не работаю с Android, но это звучит как очень хорошая идея.
— Марк Ч
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.