2012-05-10 39 views
9

Đối với phiên bản trả tiền của ứng dụng, tôi chọn tuyến đường ứng dụng trình mở khóa vì dễ dàng triển khai, cho phép thống kê riêng lẻ trong Developer Console nhưng chủ yếu là vì tôi không cần duy trì 2 cơ sở mã và phiên bản khác cho phiên bản trả tiền). Ngay cả khi tôi đã sử dụng CVS (mà tôi làm) nó vẫn sẽ là một cơn đau ở cổ để giữ cho các tính năng sáp nhập và sửa lỗi. Ứng dụng trình mở khóa dễ dàng hơn nhiều để thực hiện tổng thể ...Làm thế nào để ứng dụng 'android unlocker' an toàn hơn so với bánh quy giòn?

Nhưng điều này đi kèm với một bất lợi nghiêm trọng, nó thực sự dễ dàng để vượt qua kiểm tra bảo mật; trừ khi tôi đang thiếu một cái gì đó ở đây.

Không có vấn đề gì tôi làm, thực hiện như vậy sẽ luôn dẫn đến một đơn giản if, như thế này:

if(Program.isPremiumVersion()) { 
    // Remove ads... 
} 

Phương pháp isPremiumVersion() là kẻ chịu trách nhiệm cho tất cả các công việc trong việc kiểm tra cho quá trình cài đặt ứng dụng unlocker trả tiền, nếu chứng chỉ phù hợp và tất cả nội dung đó. Có, các ứng dụng unlocker được bảo vệ bởi các LVL (mặc dù tôi đã đọc một vài bài báo đề cập đến cách LVL không an toàn được, nhưng đó không phải là điểm ngay bây giờ). Nhưng cuối cùng, bất kể mã phức tạp bên trong isPremiumVersion() nhận được như thế nào, nó luôn mang lại giá trị true hoặc false.

Ghi đè tính năng bảo mật như vậy chỉ là vấn đề đảo ngược kỹ thuật mã và làm cho mã đó luôn trả về true. Không phải nó? Làm thế nào chúng ta có thể bảo vệ các ứng dụng Android của chúng tôi chống lại điều này? Và có, mã được làm rối loạn với ProGuard. Tuy nhiên, không nên quá khó đối với một người có tay nghề đủ.

Xin lưu ý rằng tôi không cố gắng để chống lại các bánh quy giòn, chúng tôi chỉ đơn giản là không thể giành chiến thắng. Tôi sẽ không mất ngủ vì điều này, lãng phí vô số giờ vào "giải pháp hoàn hảo". Tôi chỉ tìm cách làm cho nó an toàn hơn một chút. Điều này dường như rất đơn giản để crack, trong lý thuyết ít nhất. Tôi có sai không?

Bất kỳ ý tưởng nào để cải thiện tính bảo mật của tính năng này?

+0

Chỉ cần sử dụng tương đương java nếu 'IFDEF' hoặc tạo' isPremiumVersion' một hằng số và dựa vào trình biên dịch tối ưu hóa nó. – CodesInChaos

+3

Không phải là giải pháp cho vấn đề nứt của bạn, nhưng vấn đề sao chép mã nên được giảm nhẹ nếu bạn sử dụng dự án thư viện android (không thể khởi chạy). Đó là nhiều hơn hoặc ít hơn một thư viện chia sẻ của các lớp/bố trí/drawables có thể được gọi từ các ứng dụng có thể khởi động. Tạo hai phiên bản ứng dụng của bạn (Miễn phí, Trả phí) và tạo một thư viện với tất cả các mã chung. Trong các phiên bản miễn phí/trả tiền của bạn, bạn có thể ghi đè lên bố trí/chuỗi/drawables/etc nếu chúng cần phải khác với những gì trong thư viện được chia sẻ. Nên phục vụ nhu cầu của bạn: http://developer.android.com/guide/developing/projects/projects-eclipse.html – Gophermofur

+0

@Gophermofur Có, tôi biết về cách tiếp cận thư viện nhưng tôi không thích nó và nó đi kèm với các vấn đề khác". Không cần phải đi sâu hơn nữa, nó không liên quan đến câu hỏi. Tôi đã quyết định từ lâu rằng tôi đang đi với phương pháp "unlocker" và không có thảo luận ở đó. Tôi đánh giá cao đề nghị của bạn mặc dù :) –

Trả lời

1

Bạn có thể đã nhìn thấy điều này, nhưng đây là một số mã để thực hiện những gì bạn đang nói về:

http://groups.google.com/group/android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3?pli=1

Nó kiểm tra rằng chữ ký trên các ứng dụng miễn phí và unlocker đều giống nhau. Vì vậy, nó không phải là có thể cho một người nào đó để tạo ra một ứng dụng giả tạo với tên chính xác như các dấu hiệu sẽ khác nhau. Tuy nhiên, người dùng vẫn có thể tách gói ứng dụng ra khỏi điện thoại và phân phối nó. Cách duy nhất để chống lại điều đó sẽ là sử dụng một số loại xác thực máy chủ nhưng điều này làm tăng thêm chi phí và sự phức tạp.

+0

Điều này liên quan đến câu hỏi của tôi như thế nào? Nó không trả lời bất cứ điều gì ... –

7

Không có cách nào dễ dàng xung quanh việc này.

Bạn phải cố gắng che mặt nạ. Dưới đây là một vài mẹo:

Mẹo 1: Trả về boolean quá rõ ràng. Thử trả về một giá trị (ví dụ int). Sau đó, sử dụng so sánh để xem liệu đó có phải là giá trị trả về đã biết hợp lệ hay không.

Ví dụ: lấy md5 của chuỗi chứa nội dung nào đó mà bạn có thể biết đó có phải là cao cấp hay không. Giả sử bạn đã có chuỗi cuối cùng tĩnh trên mỗi ứng dụng. Có lẽ md5 của một bắt đầu với một 9 và bắt đầu với một 1. Trong trường hợp này, tính toán md5 và xem nếu nó lớn hơn một số "ngẫu nhiên" mà bạn biết nó ở giữa hai số khác. Giả sử rằng md5 của "premium" là 987 và md5 của "free" là 123. Bạn có thể tính md5 và so sánh nó với 456.

Mẹo 2 - Tốt hơn: sao chép một số mã và sử dụng các giá trị khác nhau mỗi lần (thay vì 456)! Hy vọng rằng điều này sẽ làm cho nó khó khăn hơn để giải mã mã obfuscated.

Tôi biết rằng tất cả các kiểm tra này cuối cùng sẽ được ánh xạ tới một boolean (if(1 > 2) sẽ được đánh giá là if(true)) nhưng sẽ khó hơn để đảo ngược thiết kế ứng dụng của bạn.

Mẹo 3: không chạy kiểm tra "isPremium" ở những vị trí rõ ràng nhất. Ví dụ: không thực hiện kiểm tra khi bạn khởi động ứng dụng vì đây là nơi rõ ràng nhất để thực hiện. Nó có thể là khó khăn để tránh một số điểm rõ ràng nếu bạn muốn có logic điều kiện tùy thuộc vào phiên bản của ứng dụng, nhưng làm tốt nhất của bạn ở đây!

Mẹo 4: xây dựng và làm xáo trộn ứng dụng của bạn. Chạy các công cụ kỹ thuật ngược lại với gói ứng dụng của bạn. Đọc nó và xem nó trông như thế nào.

Cuối cùng, xem Google IO bày hàng ngày này vào bữa sáng: Evading Pirates and Stopping Vampires using License Verification Library, In-App Billing, and App Engine

[EDIT - một vài lời khuyên chi tiết]

Mẹo 6: cố gắng sử dụng mã bạn sử dụng để kiểm tra ở những nơi hoàn toàn hợp lệ. Điều này có thể che giấu những gì bạn đang thực sự làm trong đó. Điều này có thể bao gồm việc gọi mã để kiểm tra xem phiên bản của ứng dụng này là gì, nhưng không làm gì có ý nghĩa với nó. Hoặc, trong ví dụ trước của tôi, so sánh md5 với 012 hoặc 999, chỉ để pha loãng việc sử dụng thực tế của các biến này.

Mẹo 7: thay vì dựa vào một chuỗi, bạn có thể cân nhắc việc tạo chuỗi tại thời gian chạy. Trận chung kết và thống kê có thể thu hút quá nhiều sự chú ý, vì vậy tránh những điều đó có thể là một điều tốt.

Mẹo 8: không bao giờ sử dụng mã LVL như được cung cấp trong hướng dẫn google. Sửa đổi nó. Rất nhiều!

Lưu ý: Tôi không chắc chắn nếu có những lời khuyên thực sự sẽ làm cho một sự khác biệt lớn, nhưng bạn nên có cơ hội tốt ít nhất là làm cho cuộc sống bánh một chút khó khăn hơn.

+2

Tôi đoán mã của tôi cần phải lộn xộn ... Tôi ghét mã lộn xộn, đó là vấn đề của tôi: ( –

Các vấn đề liên quan