Переконайтеся, що APK створений з даного вихідного коду


10

Для цього ж додатка я маю:

  • APK з магазину додатків,
  • що вважається вихідним кодом для тієї ж версії. З досить звичним сценарієм і структурою побудови Gradle.

Я хочу перевірити, чи дійсно APK створений з цього вихідного коду чи ні.
Як це перевірити?

Примітки:

  • АПК не затуманений.
  • У мене немає підстав довіряти нікому підпис. Я довіряю лише вихідному коду.
  • Я вже створив додаток для себе, але тепер я хочу знати, чи добре було APK чи ні.
  • Переважно з інструментами командного рядка Linux, але будь-який інструмент добре.

2
Я цього не пробував, але ви повинні мати можливість використовувати Apktool для цієї мети: Зворотний інженер обох .apkфайлів, а потім запустіть розрізник у відповідних каталогах. Єдиною різницею тоді повинен бути підпис (який не може збігатися з зрозумілих причин). Думаючи про це: просто розпакуйте .apkфайли та виконайте двійковий розмін. Обидва, звичайно, вимагають використання однакових версій бібліотеки тощо, коли компілюється в першу чергу :)
Izzy

@Izzy: " однакові версії бібліотеки ": версія API записується у маніфест, а бібліотеки - у сценарії Gradle, тому ця частина повинна бути в порядку, я думаю. Перелік файлів / папок, які можна ігнорувати, дозволить зробити це чудовою відповіддю (бонусом за фактичні командні рядки).
Ніколя Рауль

1
Я міг би це зробити, якби вдома знаходився за комп’ютером, якого я зараз не є. Але, щоб це була "почесна відповідь", мені потрібно було б спробувати це спершу :) Якщо я забуду (і ніхто інший цього не робив до мене), не соромтеся надіслати мені ще один пінг (наприклад, у чаті) приблизно 8..10h :)
Izzy

@Izzy diffМетод здається акуратним ... але що робити, якщо хлопці магазину програм заблукали APK під час його компіляції?
Grimoire

IMHO саме тут грає Apktool. Ви перевірили посилання? Також погляньте на LibRadar, який цим користується. ПІСЛЯ це допомагає знезаражувати (щось повинно, або в LibRadar було б важко знайти цю бібліотеку).
Izzy

Відповіді:


2

Це можна зробити лише за допомогою відтворюваних збірок:

"Збірка може відтворюватися, якщо надавати один і той же вихідний код, середовище збирання та інструкції щодо збирання, будь-яка сторона може відтворити побітні ідентичні копії всіх зазначених артефактів."

Тому розробник додатків або магазин додатків повинні бути на борту, щоб він працював.
Інакше ваш єдиний варіант - це створити його самостійно.

Одним із прикладів розробника, який зараз це робить, є Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds


Дуже цікаво! Отже, ви впевнені, що порівняння неможливо виконати без того, щоб розробник не був на борту? На жаль (але зрозуміло), що більшість програм з відкритим кодом не використовують Docker або подібні для збірок, вони просто побудовані на будь-якій системі, в якій запускається сервіс.
Ніколя Рауль

Не обов'язково бути розробником, доки той, хто створює додаток з джерела, дає змогу точно відтворити своє середовище збирання. Залежності можуть бути величезним болем при налаштуванні таких типів конструкцій.
andDevW

"відтворити їхнє середовище побудови точно": Чи можна здогадатися? Наприклад, якщо з якоїсь причини будівництво на Mac чи Linux виробляє інший APK, чи можу я здогадатися, чи створено APK магазину додатків на Mac чи Linux?
Nicolas Raoul

Не можна здогадуватися та мати результати, які мають значення. Врешті-решт це стане простішим у здійсненні, і ви побачите все більше та більше проектів з відкритим кодом, які роблять це.
andDevW

1

Одним із чудових моментів щодо Java та APK є те, що ви можете повністю декомпілювати APK у вихідний код Java.

Однак отриманий вихідний код не гарантовано є ідентичним.

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

Для декомпіляції використовуйте dex2jar та JD-Gui .

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


Якщо я правильно розумію, ваш метод полягає в тому, щоб перевірити, якою була остання зміна у сховищі вихідного коду, потім декомпілюйте APK і вручну перевірити, чи є остання зміна також у декомпільованому коді, правда? Цікавий підхід, але це не скаже мені, чи додано оголошення до дому або вбудовану рекламну версію до версії APK, правда?
Ніколя Рауль

1
Це підхід, який я використовував в офісі, щоб спробувати встановити невідому APK до версії джерела, яка була досить хорошою, якщо ви знаєте, що можете довіряти розробникам. Але, як ви кажете, напевно, все ж можливо, ненадійний учасник щось підкраде. Я сподіваюся, що хтось дасть більш чітку відповідь, був би корисним і для мене.
Марк Ч.

Як щодо того, щоб самостійно скласти джерело в APK, потім декомпілювати його у вихідний код і порівняти його з декомпільованим джерелом з Play Store APK? Хтось пробував це?
Сергій Бєлозоров

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