Убедитесь, что 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.