Xác minh rằng APK đã được xây dựng từ mã nguồn đã cho


10

Đối với cùng một ứng dụng, tôi có:

  • một APK từ một cửa hàng ứng dụng,
  • những gì được tuyên bố là mã nguồn cho cùng một phiên bản. Với một kịch bản và cấu trúc xây dựng Gradle khá thông thường.

Tôi muốn kiểm tra xem APK có thực sự được xây dựng từ mã nguồn đó hay không.
Làm thế nào để kiểm tra điều đó?

Ghi chú:

  • APK không bị xáo trộn.
  • Tôi không có lý do để tin tưởng chữ ký của bất cứ ai. Tôi chỉ tin tưởng mã nguồn.
  • Tôi đã tự xây dựng ứng dụng cho mình, nhưng bây giờ tôi muốn biết liệu APK có ổn hay không.
  • Tốt hơn là với các công cụ dòng lệnh Linux, nhưng bất kỳ công cụ nào cũng được.

2
Tôi đã không thử điều đó, nhưng bạn sẽ có thể sử dụng Apktool cho mục đích này: Kỹ sư đảo ngược cả hai .apktệp, sau đó chạy một khác biệt so với các thư mục kết quả. Chỉ khác biệt sau đó phải là chữ ký (không thể phù hợp vì lý do rõ ràng). Suy nghĩ về nó: chỉ cần giải nén các .apktệp và thực hiện một nhị phân khác cũng nên làm như vậy. Cả hai tất nhiên sẽ yêu cầu phải sử dụng cùng một phiên bản thư viện, v.v. khi biên dịch ở vị trí đầu tiên :)
Izzy

@Izzy: " cùng phiên bản thư viện ": Tôi đoán phiên bản API được viết trong tệp kê khai và phiên bản thư viện trong tập lệnh Gradle, vì vậy phần đó sẽ ổn, tôi đoán vậy. Một danh sách các tệp / thư mục có thể bị bỏ qua sẽ làm cho câu trả lời tuyệt vời (phần thưởng cho các dòng lệnh thực tế).
Nicolas Raoul

1
Tôi có thể làm điều đó nếu tôi ở trên máy tính của tôi ở nhà, mà hiện tại tôi không có. Nhưng để đó là một "câu trả lời danh dự", tôi sẽ cần tự mình thử nó trước :) Trong trường hợp tôi quên (và không ai khác làm điều đó trước tôi), vui lòng gửi cho tôi một ping khác (ví dụ như trong trò chuyện) trong 8..10h :)
Izzy

@Izzy diffPhương thức này có vẻ gọn gàng ... nhưng điều gì sẽ xảy ra nếu những kẻ của cửa hàng ứng dụng làm xáo trộn APK trong khi biên dịch nó?
Grimoire

IMHO là nơi Apktool phát huy tác dụng. Bạn đã kiểm tra các liên kết? Ngoài ra hãy xem LibRadar sử dụng điều này. AFAIR nó giúp khử nhiễu (một cái gì đó phải, hoặc LibRadar sẽ có một công việc khó khăn để phát hiện các thư viện đó).
Izzy

Câu trả lời:


2

Bạn chỉ có thể làm điều này với các bản dựng có thể lặp lại:

"Bản dựng có thể tái tạo nếu được cung cấp cùng mã nguồn, môi trường xây dựng và hướng dẫn xây dựng, bất kỳ bên nào cũng có thể tạo lại các bản sao giống hệt nhau từng bit của tất cả các tạo phẩm được chỉ định."

Vì vậy, nhà phát triển ứng dụng hoặc cửa hàng ứng dụng cần phải ở trên tàu để nó hoạt động.
Nếu không, lựa chọn duy nhất của bạn là tự xây dựng nó.

Một ví dụ về một nhà phát triển hiện đang làm điều này là Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Rep sinhible -Builds


Rất thú vị! Vì vậy, bạn có chắc chắn không thể thực hiện so sánh mà không có nhà phát triển trên tàu không? Thật không may (nhưng có thể hiểu được) hầu hết các ứng dụng nguồn mở không sử dụng Docker hoặc tương tự cho các bản dựng, chúng chỉ được xây dựng trên bất kỳ hệ thống nào mà nhà bảo trì tình cờ chạy.
Nicolas Raoul

Không phải là nhà phát triển, miễn là bất cứ ai xây dựng ứng dụng từ nguồn đều có thể tạo lại chính xác môi trường xây dựng của họ. Sự phụ thuộc có thể là một nỗi đau lớn khi thiết lập các loại bản dựng này.
andDevW

"Tái tạo chính xác môi trường xây dựng của họ": Có thể đoán được không? Chẳng hạn, nếu vì một lý do nào đó, việc xây dựng trên Mac hoặc Linux tạo ra một APK khác, tôi có thể đoán liệu APK của cửa hàng ứng dụng đã được xây dựng trên Mac hoặc Linux không?
Nicolas Raoul

Không thể đoán và có kết quả có ý nghĩa. Cuối cùng, điều này sẽ trở nên dễ thực hiện hơn và bạn sẽ thấy ngày càng nhiều dự án nguồn mở thực hiện nó.
andDevW

1

Một điều tuyệt vời về java và APK là bạn hoàn toàn có thể dịch ngược APK sang mã nguồn java.

Tuy nhiên, mã nguồn kết quả không được đảm bảo giống hệt nhau.

Một cách tốt để thử và đối chiếu mã nguồn kết quả với một sửa đổi đã biết là kiểm tra những sửa đổi nào được thực hiện trực tiếp trước và sau cam kết đã biết trong kho lưu trữ, và xem liệu những sửa đổi đó cũng có trong nguồn dịch ngược hay không.

Để dịch ngược, sử dụng dex2jarJD-Gui .

chỉnh sửa Tôi chỉ nhận thấy bạn muốn các công cụ linux. Kinh nghiệm duy nhất của tôi là với windows, nhưng tôi chắc chắn các công cụ tương tự tồn tại cho linux.


Nếu tôi hiểu chính xác, phương pháp của bạn là kiểm tra xem thay đổi mới nhất trong kho lưu trữ của mã nguồn là gì, sau đó dịch ngược APK và kiểm tra thủ công xem có thay đổi mới nhất trong mã dịch ngược không? Cách tiếp cận thú vị, nhưng điều đó sẽ không cho tôi biết liệu quảng cáo nhúng hoặc quảng cáo nhúng đã được thêm vào phiên bản APK, phải không?
Nicolas Raoul

1
Đây là một cách tiếp cận tôi đã sử dụng trong văn phòng để thử và kết hợp APK không xác định với bản sửa đổi nguồn, đủ tốt nếu bạn biết bạn có thể tin tưởng các nhà phát triển. Nhưng như bạn nói, có lẽ vẫn có thể một bên không đáng tin cậy lẻn vào một cái gì đó. Tôi hy vọng ai đó sẽ cung cấp một câu trả lời dứt khoát hơn, cũng sẽ hữu ích cho tôi.
Đánh dấu

Còn về việc tự biên dịch nguồn vào APK, sau đó dịch ngược lại thành mã nguồn và so sánh với nguồn được dịch ngược từ APK của Play Store? Có ai đã thử nó chưa?
Sergiy Belozorov

1
@SergiyBelozorov xin lỗi tôi không thể trả lời điều này, tôi không thực sự làm việc với Android nữa, nhưng có vẻ như đó là một ý tưởng rất tốt.
Đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.