Переконайтеся, що 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.