Verifikasi bahwa APK telah dibangun dari kode sumber yang diberikan

10

Untuk aplikasi yang sama, saya punya:

  • sebuah APK dari sebuah toko aplikasi,
  • apa yang diklaim sebagai kode sumber untuk versi yang sama. Dengan skrip dan struktur bangun Gradle yang cukup biasa.

Saya ingin memeriksa apakah APK benar-benar dibuat dari kode sumber itu atau tidak.
Bagaimana cara memeriksanya?

Catatan:

  • APK tidak dikaburkan.
  • Saya tidak punya alasan untuk mempercayai tanda tangan siapa pun. Saya hanya mempercayai kode sumber.
  • Saya sudah membuat aplikasi sendiri, tetapi sekarang saya ingin tahu apakah APKnya OK atau tidak.
  • Lebih disukai dengan alat baris perintah Linux, tetapi alat apa pun tidak apa-apa.
Nicolas Raoul
sumber
2
Saya belum mencobanya, tetapi Anda harus dapat menggunakan Apktool untuk tujuan ini: Membalik-rekayasa kedua .apkfile, lalu menjalankan diff terhadap direktori yang dihasilkan. Hanya perbedaan yang harus menjadi tanda tangan (yang tidak dapat cocok karena alasan yang jelas). Berpikir tentang itu: cukup membuka ritsleting .apkfile dan melakukan diff biner harus melakukan hal yang sama. Keduanya tentu saja harus menggunakan versi perpustakaan yang sama dll ketika mengkompilasi di tempat pertama :)
Izzy
@Izzy: " versi pustaka yang sama ": Versi API ditulis dalam manifes dan versi pustaka dalam skrip Gradle, jadi bagian itu harus OK, kurasa. Daftar file / folder yang dapat diabaikan akan membuat jawaban yang bagus (bonus untuk baris perintah yang sebenarnya).
Nicolas Raoul
1
Saya bisa melakukan itu jika saya menggunakan komputer di rumah, yang saat ini saya tidak. Tetapi untuk itu menjadi "jawaban terhormat", saya harus mencobanya sendiri terlebih dahulu :) Jika saya lupa (dan tidak ada orang lain yang melakukannya sebelum saya), jangan ragu untuk mengirim saya ping lain (misalnya dalam obrolan) di sekitar 8..10j :)
Izzy
@Izzy diffMetode ini kelihatannya rapi ... tapi bagaimana jika orang-orang di app store mengaburkan APK saat mengompilasinya?
Grimoire
IMHO di situlah Apktool berperan. Sudahkah Anda memeriksa tautannya? Lihat juga LibRadar yang menggunakan ini. AFAIR membantu menghilangkan kebingungan (sesuatu harus, atau LibRadar akan sulit mendeteksi perpustakaan-perpustakaan itu).
Izzy

Jawaban:

2

Anda hanya dapat melakukan ini dengan bangunan yang dapat direproduksi:

"Sebuah bangunan dapat direproduksi jika diberi kode sumber yang sama, lingkungan pembuatan dan instruksi pembuatan, pihak mana pun dapat menciptakan salinan identik sedikit demi sedikit dari semua artefak yang ditentukan."

Jadi pengembang aplikasi atau toko aplikasi harus ada di papan agar bisa berfungsi.
Kalau tidak, satu-satunya pilihan Anda adalah membangunnya sendiri.

Salah satu contoh pengembang yang saat ini melakukan ini adalah Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds

andDevW
sumber
Sangat menarik! Jadi, apakah Anda yakin perbandingan tidak dapat dilakukan tanpa pengembang berada di papan? Sayangnya (tetapi dapat dimengerti) sebagian besar aplikasi open source tidak menggunakan Docker atau serupa untuk build, mereka hanya dibangun pada sistem apa pun yang dijalankan oleh pengelola.
Nicolas Raoul
Tidak harus menjadi pengembang, asalkan siapa pun yang membangun aplikasi dari sumber memungkinkan untuk menciptakan kembali lingkungan build mereka dengan tepat. Ketergantungan bisa sangat menyebalkan saat memasang jenis bangunan ini.
andDevW
"Menciptakan ulang lingkungan build mereka dengan tepat": Apakah mungkin untuk menebak? Misalnya, jika karena alasan tertentu membangun di Mac atau Linux menghasilkan APK yang berbeda, dapatkah saya menebak apakah APK app store dibuat di Mac atau Linux?
Nicolas Raoul
Tidak mungkin menebak dan mendapatkan hasil yang bermakna. Pada akhirnya ini akan semakin mudah diimplementasikan dan Anda akan melihat semakin banyak proyek open source melakukannya.
andDevW
1

Satu hal hebat tentang java dan APK adalah Anda dapat sepenuhnya mendekompilasi APK ke kode sumber java.

Namun, kode sumber yang dihasilkan tidak dijamin sama.

Salah satu cara yang baik untuk mencoba dan mencocokkan kode sumber yang dihasilkan dengan revisi yang diketahui adalah untuk memeriksa modifikasi apa yang dilakukan secara langsung sebelum dan setelah komit yang diketahui dalam repositori, dan melihat apakah modifikasi tersebut juga ada di sumber yang dikompilasi.

Untuk mendekompilasi, gunakan dex2jar dan JD-Gui .

sunting Saya baru saja memperhatikan bahwa Anda menginginkan alat linux. Satu-satunya pengalaman saya adalah dengan windows, tapi saya yakin ada alat serupa untuk linux.

Markus Ch
sumber
Jika saya mengerti benar, metode Anda adalah untuk memeriksa apa perubahan terbaru dalam repositori kode sumber, kemudian mendekompilasi APK, dan memeriksa secara manual apakah perubahan terbaru juga ditemukan dalam kode yang didekompilasi juga, kan? Pendekatan yang menarik, tetapi itu tidak akan memberi tahu saya apakah panggilan-rumah atau iklan tertanam telah ditambahkan ke versi APK, kan?
Nicolas Raoul
1
Ini adalah pendekatan yang saya gunakan di kantor untuk mencoba mencocokkan APK yang tidak diketahui dengan revisi sumber, yang sudah cukup baik jika Anda tahu Anda bisa mempercayai pengembang. Tetapi seperti yang Anda katakan, mungkin masih mungkin bagi pihak yang tidak dapat dipercaya untuk menyelinap sesuatu. Saya berharap seseorang akan memberikan jawaban yang lebih pasti, akan berguna bagi saya juga.
Mark Ch
Bagaimana dengan mengkompilasi sumber ke dalam APK sendiri, kemudian mendekompilasi kembali menjadi kode sumber dan membandingkannya dengan sumber yang di-dekompilasi dari Play Store APK? Adakah yang pernah mencoba ini?
Sergiy Belozorov
1
@SergiyBelozorov maaf saya tidak bisa menjawab ini, saya tidak benar-benar bekerja dengan android lagi, tapi sepertinya ide yang sangat bagus.
Mark Ch