Làm cách nào để tránh kỹ thuật đảo ngược của tệp APK?


764

Tôi đang phát triển một ứng dụng xử lý thanh toán cho Android và tôi muốn ngăn chặn tin tặc truy cập bất kỳ tài nguyên, tài sản hoặc mã nguồn nào từ APK .

Nếu ai đó thay đổi phần mở rộng .apk thành .zip thì họ có thể giải nén nó và dễ dàng truy cập tất cả tài nguyên và tài sản của ứng dụng và sử dụng dex2jar và trình dịch ngược Java, họ cũng có thể truy cập mã nguồn. Thật dễ dàng để thiết kế đảo ngược tệp APK Android - để biết thêm chi tiết, xem câu hỏi Stack Overflow Kỹ thuật đảo ngược từ tệp APK sang dự án .

Tôi đã sử dụng công cụ Proguard được cung cấp cùng với SDK Android. Khi tôi đảo ngược một tệp APK được tạo bằng kho khóa đã ký và Proguard, tôi nhận được mã bị xáo trộn.

Tuy nhiên, tên của các thành phần Android vẫn không thay đổi và một số mã, như giá trị khóa được sử dụng trong ứng dụng, vẫn không thay đổi. Theo tài liệu của Proguard, công cụ không thể làm xáo trộn các thành phần được đề cập trong tệp Manifest.

Bây giờ câu hỏi của tôi là:

  1. Làm thế nào tôi có thể ngăn chặn hoàn toàn kỹ thuật đảo ngược của APK Android? Điều này có thể không?
  2. Làm cách nào tôi có thể bảo vệ tất cả tài nguyên, tài sản và mã nguồn của ứng dụng để tin tặc không thể hack tệp APK theo bất kỳ cách nào?
  3. Có cách nào để làm cho việc hack trở nên khó khăn hơn hoặc thậm chí là không thể? Tôi có thể làm gì hơn nữa để bảo vệ mã nguồn trong tệp APK của mình?

120
Có vẻ như bạn có thể đang sử dụng "bảo mật bằng cách che khuất" nếu sơ đồ xử lý thanh toán của bạn phụ thuộc vào hoạt động của bí mật khách hàng còn lại.
PeterJ

43
Bạn đã xem xét việc viết các phần quan trọng của mã trong C / C ++ và thêm chúng dưới dạng thư viện được biên dịch chưa? Chúng có thể được phân tách thành mã lắp ráp, nhưng kỹ thuật đảo ngược một thư viện lớn từ lắp ráp là cực kỳ đúng lúc.
Leo


60
Chào mừng bạn đến vấn đề cơ bản của việc tạo ra bất kỳ tài sản kỹ thuật số. Tin tặc có thể xuống cấp độ hướng dẫn của máy, vì vậy nếu một máy tính có thể đọc tệp thì nó có thể bị hack mở / sao chép, không một lượng obfuscation hoặc DRM nào có thể ngăn chặn hoàn toàn một hacker đã xác định. Nếu bạn cần bảo mật thì hãy chắc chắn rằng các khóa riêng không bao giờ có trong nguồn và biết ở giai đoạn thiết kế chỉ có cách ly (phần cứng từ xa và / hoặc chuyên dụng) mới có thể bảo vệ chúng.
Keith

16
Lưu ý rằng tùy thuộc vào ứng dụng xử lý thanh toán của bạn làm gì, có thể có chính sách pháp lý và pháp lý ảnh hưởng đến ứng dụng của bạn và có thể khiến bạn bị phạt nặng: xem tuân thủ PCI, bắt đầu với pcicomplianceguide.org/pcifaqs.php#11 .
bloopletech

Câu trả lời:


372

 1. Làm cách nào tôi có thể tránh hoàn toàn kỹ thuật đảo ngược của APK Android? Điều này có thể không?

AFAIK, không có bất kỳ mẹo nào để tránh hoàn toàn kỹ thuật đảo ngược.

Và cũng được nói rất rõ bởi @inazaruk: Bất kể bạn làm gì với mã của mình, một kẻ tấn công tiềm năng có thể thay đổi nó theo bất kỳ cách nào cô ấy hoặc anh ấy thấy nó khả thi . Về cơ bản, bạn không thể bảo vệ ứng dụng của mình khỏi bị sửa đổi. Và bất kỳ sự bảo vệ nào bạn đặt vào đó đều có thể bị vô hiệu hóa / loại bỏ.

 2. Làm cách nào tôi có thể bảo vệ tất cả tài nguyên, tài sản và mã nguồn của ứng dụng để tin tặc không thể hack tệp APK theo bất kỳ cách nào?

Bạn có thể làm các thủ thuật khác nhau để làm cho việc hack khó hơn. Ví dụ: sử dụng obfuscation (nếu đó là mã Java). Điều này thường làm chậm đáng kể kỹ thuật đảo ngược.

 3. Có cách nào để khiến việc hack trở nên khó khăn hơn hoặc thậm chí là không thể? Tôi có thể làm gì hơn nữa để bảo vệ mã nguồn trong tệp APK của mình?

Như mọi người nói, và như bạn có thể biết, không có bảo mật 100%. Nhưng nơi để bắt đầu cho Android, mà Google đã tích hợp, là ProGuard. Nếu bạn có tùy chọn bao gồm các thư viện chia sẻ , bạn có thể bao gồm mã cần thiết trong C ++ để xác minh kích thước tệp, tích hợp, v.v. Nếu bạn cần thêm thư viện gốc bên ngoài vào thư mục thư viện APK của mình trên mỗi bản dựng, thì bạn có thể sử dụng nó theo gợi ý dưới đây.

Đặt thư viện trong đường dẫn thư viện riêng mặc định là "libs" trong thư mục dự án của bạn. Nếu bạn đã xây dựng mã gốc cho mục tiêu 'armeabi' thì hãy đặt nó dưới libs / armeabi . Nếu nó được chế tạo với armeabi-v7a thì đặt nó dưới libs / armeabi-v7a.

<project>/libs/armeabi/libstuff.so

1
Đối với giao dịch Thanh toán tôi đã sử dụng tiêu chuẩn ISO 8585, ngay bây giờ lược đồ cho tiêu chuẩn này nằm trong cặp giá trị khóa sử dụng bộ sưu tập HashMap của Java và khi tôi thực hiện kỹ thuật đảo ngược trên apk Tôi sẽ nhận được tất cả lược đồ. tiếp xúc thông qua kỹ thuật đảo ngược.? Đề nghị cuối cùng của bạn về thư viện chia sẻ có thể hữu ích trong trường hợp này? Bạn có bất kỳ liên kết nào để tôi có thể tiếp xúc với các thư viện chia sẻ trong Android.
sachin003

4
Làm thế nào về việc mã hóa chuỗi của bạn trong mã và giải mã chúng khi chạy? Nếu bạn thực hiện giải mã trên một máy chủ từ xa, như những người khác đã đề xuất, bạn sẽ không gặp phải vấn đề là khóa giải mã có trong các nguồn.
kutschkem

vâng, mã hóa là cách, nhưng nó không chắc chắn sẽ không bị tấn công. Nếu tôi đang mã hóa String để giải mã chúng, tôi cần một id duy nhất trong mã. và nếu bất cứ ai có thể dịch ngược nó thì sẽ rất dễ dàng để có được Id duy nhất.
Bhavesh Patadiya

Tại sao bạn thêm Công cụ chỉnh sửa ? tất cả đều đặn
Mohammed Azharuddin Shaikh

@hotveryspicy: vâng, hiện tôi đã xóa dấu "đã chỉnh sửa" khỏi câu trả lời. Tôi đã chỉnh sửa câu trả lời của tôi vì anh ấy muốn biết thêm về cách chia sẻ thư viện hữu ích trong trường hợp này.
Bhavesh Patadiya

126

AFAIK, bạn không thể bảo vệ các tệp trong thư mục / res nữa vì chúng được bảo vệ ngay bây giờ.

Tuy nhiên, có những bước bạn có thể thực hiện để bảo vệ mã nguồn của mình hoặc ít nhất là những gì nó làm nếu không phải là tất cả.

  1. Sử dụng các công cụ như ProGuard. Những thứ này sẽ làm xáo trộn mã của bạn và làm cho nó khó đọc hơn khi dịch ngược, nếu không nói là không thể.
  2. Di chuyển các phần quan trọng nhất của dịch vụ ra khỏi ứng dụng và vào dịch vụ web, ẩn đằng sau một ngôn ngữ phía máy chủ như PHP. Ví dụ: nếu bạn có một thuật toán, bạn phải mất một triệu đô la để viết. Bạn rõ ràng không muốn mọi người đánh cắp nó khỏi ứng dụng của bạn. Di chuyển thuật toán và yêu cầu nó xử lý dữ liệu trên một máy chủ từ xa và sử dụng ứng dụng để cung cấp dữ liệu. Hoặc sử dụng NDK để ghi chúng nguyên bản vào các tệp .so, ít có khả năng dịch ngược hơn so với apks. Tôi không nghĩ rằng trình dịch ngược cho các tệp .so thậm chí còn tồn tại cho đến bây giờ (và ngay cả khi có, nó sẽ không tốt như trình dịch ngược Java). Ngoài ra, như @nikolay đã đề cập trong các nhận xét, bạn nên sử dụng SSL khi tương tác giữa máy chủ và thiết bị.
  3. Khi lưu trữ giá trị trên thiết bị, không lưu trữ chúng ở định dạng thô. Ví dụ: nếu bạn có một trò chơi và bạn đang lưu trữ số lượng tiền tệ trong trò chơi mà người dùng có trong SharedPreferences. Hãy giả sử đó là 10000tiền. Thay vì lưu 10000trực tiếp, hãy lưu nó bằng thuật toán như thế nào ((currency*2)+1)/13. Vì vậy, thay vì 10000, bạn tiết kiệm1538.53846154 vào SharedPreferences. Tuy nhiên, ví dụ trên không hoàn hảo và bạn sẽ phải làm việc để đưa ra một phương trình sẽ không mất tiền tệ cho các lỗi làm tròn, v.v.
  4. Bạn có thể làm một điều tương tự cho các nhiệm vụ phía máy chủ. Bây giờ là một ví dụ, hãy thực sự lấy ứng dụng xử lý thanh toán của bạn. Giả sử người dùng phải thanh toán $200. Thay vì gửi một $200giá trị thô đến máy chủ, hãy gửi một loạt các giá trị nhỏ hơn, được xác định trước, cộng vào $200. Ví dụ: có một tệp hoặc bảng trên máy chủ của bạn tương đương các từ với các giá trị. Vì vậy, chúng ta hãy nói rằng Charlietương ứng với $47, và Johnđể $3. Vì vậy, thay vì gửi $200, bạn có thể gửi Charliebốn lần vàJohnbốn lần. Trên máy chủ, giải thích ý nghĩa của chúng và thêm nó lên. Điều này ngăn chặn tin tặc gửi các giá trị tùy ý đến máy chủ của bạn, vì chúng không biết từ nào tương ứng với giá trị nào. Là một biện pháp bảo mật bổ sung, bạn cũng có thể có một phương trình tương tự như điểm 3 cho điều này và thay đổi từ khóa mỗin số ngày.
  5. Cuối cùng, bạn có thể chèn mã nguồn vô dụng ngẫu nhiên vào ứng dụng của mình để tin tặc tìm kiếm kim trong đống cỏ khô. Chèn các lớp ngẫu nhiên có chứa đoạn trích từ internet hoặc chỉ các hàm để tính toán những thứ ngẫu nhiên như chuỗi Fibonacci. Đảm bảo rằng các lớp này biên dịch, nhưng không được sử dụng bởi chức năng thực tế của ứng dụng. Thêm đủ các lớp sai này và tin tặc sẽ gặp khó khăn trong việc tìm mã thực sự của bạn.

Nói chung, không có cách nào để bảo vệ ứng dụng của bạn 100%. Bạn có thể làm cho nó khó hơn, nhưng không phải là không thể. Máy chủ web của bạn có thể bị xâm phạm, tin tặc có thể tìm ra từ khóa của bạn bằng cách theo dõi nhiều số tiền giao dịch và từ khóa bạn gửi cho nó, tin tặc có thể đi qua nguồn và tìm ra mã nào là giả.

Bạn chỉ có thể chiến đấu trở lại, nhưng không bao giờ chiến thắng.


136
Thay vì thực hiện các thủ thuật với các giá trị bạn gửi đến máy chủ của mình, hãy sử dụng SSL và xác thực hợp lệ chứng chỉ máy chủ. Bảo mật bằng cách tối nghĩa nói chung là một ý tưởng tồi.
Nikolay Elenkov

48
bạn có thể chèn mã nguồn vô dụng ngẫu nhiên vào ứng dụng của mình . Điều này thực sự không thể giúp được gì. Điều này sẽ chỉ làm phồng ứng dụng của bạn lên, đồng thời làm cho nó khó bảo trì hơn.
Anirudh Ramanathan

4
Bạn cũng có thể giả mạo sử dụng mã vô dụng và gửi dữ liệu đến máy chủ sẽ loại bỏ nó. Bảo mật sai có thể, nhưng một nỗi đau cho các hacker tiềm năng, phải không?
Benoit Duffez

19
Nếu thuật toán của bạn đáng giá một triệu đô la, thì chỉ vì không có trình dịch ngược cho .socác tệp không có nghĩa là tôi không thể đọc được phần mềm :) Hầu hết những thứ này rơi vào cùng một cái bẫy, chỉ che giấu thay vì bảo vệ chính mình. Obfuscation chỉ hoạt động nếu không có thời gian để kẻ tấn công theo dõi, vì vậy nếu bạn xây dựng một cái gì đó trên các kỹ thuật này, bạn sẽ hy vọng chúng không trở nên phổ biến, nếu không, bạn sẽ cảm thấy khó chịu vì cơ sở mã hóa của bạn không thể nhận ra được và nó cần những thay đổi rất lớn.
Phoshi

23
Tôi không hiểu tại sao câu trả lời này lại có điểm cao như vậy. 3. và 4. đối với một người chỉ là ngớ ngẩn đơn giản và sẽ không có bảo mật nào cả.
Matti Virkkunen

117

Không có điểm nào trong lịch sử điện toán có thể ngăn chặn kỹ thuật đảo ngược của phần mềm khi bạn đưa một bản sao hoạt động của nó cho kẻ tấn công của bạn. Ngoài ra, trong nhiều khả năng, nó sẽ không bao giờ có thể .

Với sự hiểu biết đó, có một giải pháp rõ ràng: đừng đưa bí mật của bạn cho kẻ tấn công của bạn. Mặc dù bạn không thể bảo vệ nội dung của APK, nhưng những gì bạn có thể bảo vệ là bất cứ thứ gì bạn không phân phối. Thông thường, đây là phần mềm phía máy chủ được sử dụng cho những việc như kích hoạt, thanh toán, thực thi quy tắc và các đoạn mã khác. Bạn có thể bảo vệ tài sản có giá trị bằng cách không phân phối chúng trong APK của bạn. Thay vào đó, hãy thiết lập một máy chủ đáp ứng các yêu cầu từ ứng dụng của bạn, "sử dụng" tài sản (bất cứ điều gì có thể có nghĩa) và sau đó gửi kết quả trở lại ứng dụng. Nếu mô hình này không hoạt động cho các tài sản bạn có trong đầu, thì bạn có thể muốn nghĩ lại chiến lược của mình.

Ngoài ra, nếu mục tiêu chính của bạn là ngăn chặn vi phạm bản quyền ứng dụng : thậm chí đừng bận tâm. Bạn đã đốt nhiều thời gian và tiền bạc cho vấn đề này hơn bất kỳ biện pháp chống vi phạm bản quyền nào có thể hy vọng có thể cứu bạn. Lợi tức đầu tư để giải quyết vấn đề này thấp đến mức không có ý nghĩa gì khi nghĩ về nó.


21
Đoạn đầu tiên là câu trả lời tốt nhất. Nếu kẻ tấn công của bạn kiểm soát phần cứng, họ sẽ luôn có thể đánh bại phần mềm của bạn bằng cách nào đó. Bất cứ điều gì thực sự cần được bảo vệ đều phải nằm trên phần cứng mà bạn kiểm soát, nó đơn giản như vậy. Và đoạn cuối cùng, về ROI, cũng được chú ý.
Daniel Pryden

88

Quy tắc bảo mật ứng dụng đầu tiên: Bất kỳ máy nào mà kẻ tấn công có được quyền truy cập vật lý hoặc điện tử không bị hạn chế đều thuộc về kẻ tấn công của bạn, bất kể nó thực sự ở đâu hoặc bạn đã trả tiền cho nó.

Quy tắc bảo mật ứng dụng thứ hai: Bất kỳ phần mềm nào rời khỏi ranh giới vật lý mà kẻ tấn công không thể xâm nhập giờ đều thuộc về kẻ tấn công của bạn, bất kể bạn đã dành bao nhiêu thời gian để mã hóa nó.

Quy tắc thứ ba: Bất kỳ thông tin nào để lại những ranh giới vật lý tương tự mà kẻ tấn công không thể xâm nhập bây giờ thuộc về kẻ tấn công của bạn, bất kể nó có giá trị như thế nào đối với bạn.

Các nền tảng của bảo mật công nghệ thông tin dựa trên ba nguyên tắc cơ bản này; máy tính thực sự an toàn duy nhất là máy tính bị khóa trong két, bên trong lồng Farraday, bên trong lồng thép. Có những máy tính dành phần lớn thời gian phục vụ của chúng chỉ trong trạng thái này; mỗi năm một lần (hoặc ít hơn), họ tạo ra các khóa riêng cho các cơ quan chứng nhận gốc đáng tin cậy (trước một loạt các nhân chứng có camera ghi lại từng inch của căn phòng nơi họ đặt).

Bây giờ, hầu hết các máy tính không được sử dụng trong các loại môi trường này; chúng thực sự hoạt động ngoài trời, được kết nối với Internet qua kênh radio không dây. Nói tóm lại, họ dễ bị tổn thương, cũng như phần mềm của họ. Do đó họ không được tin tưởng. Có một số điều mà máy tính và phần mềm của chúng phải biết hoặc làm để có ích, nhưng phải cẩn thận để đảm bảo rằng chúng không bao giờ có thể biết hoặc làm đủ để gây ra thiệt hại (ít nhất là không gây ra thiệt hại vĩnh viễn ngoài giới hạn của máy đơn lẻ đó ).

Bạn đã biết tất cả điều này; đó là lý do tại sao bạn đang cố gắng bảo vệ mã ứng dụng của mình. Nhưng, đó là vấn đề đầu tiên; các công cụ obfuscation có thể làm cho mã trở thành một mớ hỗn độn để con người cố gắng tìm hiểu, nhưng chương trình vẫn phải chạy; điều đó có nghĩa là luồng logic thực tế của ứng dụng và dữ liệu mà nó sử dụng không bị ảnh hưởng bởi obfuscation. Với một chút kiên trì, kẻ tấn công có thể đơn giản làm xáo trộn mã và điều đó thậm chí không cần thiết trong một số trường hợp mà những gì anh ta nhìn vào không thể là gì khác ngoài những gì anh ta đang tìm kiếm.

Thay vào đó, bạn nên cố gắng đảm bảo rằng kẻ tấn công không thể làm bất cứ điều gì với mã của bạn, bất kể anh ta có dễ dàng lấy được bản sao rõ ràng của nó hay không. Điều đó có nghĩa là, không có bí mật được mã hóa cứng, bởi vì những bí mật đó không phải là bí mật ngay khi mã rời khỏi tòa nhà nơi bạn phát triển nó.

Những giá trị khóa mà bạn đã mã hóa cứng phải được loại bỏ hoàn toàn khỏi mã nguồn của ứng dụng. Thay vào đó, họ nên ở một trong ba nơi; bộ nhớ dễ bay hơi trên thiết bị, khó hơn (nhưng vẫn không phải là không thể) để kẻ tấn công có được bản sao ngoại tuyến; vĩnh viễn trên cụm máy chủ mà bạn kiểm soát truy cập bằng nắm đấm sắt; hoặc trong kho lưu trữ dữ liệu thứ hai không liên quan đến thiết bị hoặc máy chủ của bạn, chẳng hạn như thẻ vật lý hoặc trong bộ nhớ người dùng của bạn (có nghĩa là cuối cùng nó sẽ ở trong bộ nhớ dễ bay hơi, nhưng nó không phải tồn tại lâu).

Hãy xem xét các sơ đồ sau. Người dùng nhập thông tin đăng nhập của họ cho ứng dụng từ bộ nhớ vào thiết bị. Thật không may, bạn phải tin rằng thiết bị của người dùng chưa bị xâm nhập bởi keylogger hoặc Trojan; cách tốt nhất bạn có thể làm trong vấn đề này là triển khai bảo mật đa yếu tố, bằng cách ghi nhớ thông tin nhận dạng khó giả mạo về các thiết bị mà người dùng đã sử dụng (MAC / IP, IMEI, v.v.) và cung cấp ít nhất một kênh bổ sung bằng cách mà một nỗ lực đăng nhập trên một thiết bị lạ có thể được xác minh.

Thông tin đăng nhập, sau khi được nhập, bị phần mềm máy khách che khuất (sử dụng hàm băm an toàn) và thông tin đăng nhập văn bản đơn giản bị loại bỏ; họ đã phục vụ mục đích của họ. Thông tin đăng nhập bị xáo trộn được gửi qua một kênh bảo mật đến máy chủ được chứng thực chứng chỉ, điều này sẽ băm chúng một lần nữa để tạo ra dữ liệu được sử dụng để xác minh tính hợp lệ của thông tin đăng nhập. Bằng cách này, khách hàng không bao giờ biết cái gì thực sự được so sánh với giá trị cơ sở dữ liệu, máy chủ ứng dụng không bao giờ biết thông tin xác thực phía sau những gì nó nhận được để xác thực, máy chủ dữ liệu không bao giờ biết cách dữ liệu mà nó lưu trữ để xác thực được tạo ra và một người đàn ông trong phần giữa chỉ thấy vô nghĩa ngay cả khi kênh an toàn bị xâm phạm.

Sau khi xác minh, máy chủ sẽ truyền lại mã thông báo qua kênh. Mã thông báo chỉ hữu ích trong phiên bảo mật, bao gồm tiếng ồn ngẫu nhiên hoặc bản sao được mã hóa (và do đó có thể kiểm chứng) của mã định danh phiên và ứng dụng khách phải gửi mã thông báo này trên cùng một kênh đến máy chủ như một phần của bất kỳ yêu cầu nào làm gì đó. Ứng dụng khách sẽ thực hiện việc này nhiều lần, bởi vì nó không thể làm bất cứ điều gì liên quan đến tiền, dữ liệu nhạy cảm hoặc bất kỳ thứ gì khác có thể gây hại cho chính nó; thay vào đó, nó phải yêu cầu máy chủ thực hiện nhiệm vụ này. Ứng dụng khách sẽ không bao giờ ghi bất kỳ thông tin nhạy cảm nào vào bộ nhớ liên tục trên chính thiết bị, ít nhất là không ở dạng văn bản thuần túy; khách hàng có thể yêu cầu máy chủ qua kênh bảo mật để lấy khóa đối xứng để mã hóa bất kỳ dữ liệu cục bộ nào mà máy chủ sẽ ghi nhớ; trong phiên sau, máy khách có thể yêu cầu máy chủ cung cấp cùng khóa để giải mã dữ liệu để sử dụng trong bộ nhớ dễ bay hơi. Dữ liệu đó sẽ không phải là bản sao duy nhất; bất cứ thứ gì khách hàng lưu trữ cũng nên được truyền dưới dạng nào đó đến máy chủ.

Rõ ràng, điều này làm cho ứng dụng của bạn phụ thuộc rất nhiều vào truy cập Internet; thiết bị khách không thể thực hiện bất kỳ chức năng cơ bản nào của nó mà không có kết nối và xác thực hợp lệ của máy chủ. Không khác gì Facebook, thật đấy.

Bây giờ, máy tính mà kẻ tấn công muốn là máy chủ của bạn, bởi vì nó và không phải ứng dụng / thiết bị khách là thứ có thể giúp anh ta kiếm tiền hoặc khiến người khác đau đớn vì sự thích thú của anh ta. Vậy là được rồi; bạn sẽ nhận được nhiều tiền hơn cho việc bạn bỏ ra tiền và công sức để bảo mật máy chủ hơn là cố gắng bảo mật tất cả các máy khách. Máy chủ có thể đứng sau tất cả các loại tường lửa và bảo mật điện tử khác, ngoài ra có thể được bảo mật về mặt vật lý đằng sau quyền truy cập thép, bê tông, thẻ khóa / pin và giám sát video 24 giờ. Kẻ tấn công của bạn sẽ cần phải rất tinh vi để có thể truy cập trực tiếp vào máy chủ và bạn sẽ (nên) biết về nó ngay lập tức.

Điều tốt nhất mà kẻ tấn công có thể làm là đánh cắp điện thoại và thông tin đăng nhập của người dùng và đăng nhập vào máy chủ với các quyền hạn chế của khách hàng. Nếu điều này xảy ra, giống như mất thẻ tín dụng, người dùng hợp pháp nên được hướng dẫn gọi một số 800 (tốt nhất là dễ nhớ và không phải ở mặt sau của thẻ mà họ mang theo trong ví, ví hoặc cặp có thể bị đánh cắp cùng với thiết bị di động) từ bất kỳ điện thoại nào họ có thể truy cập kết nối chúng trực tiếp với dịch vụ khách hàng của bạn. Họ tuyên bố điện thoại của họ đã bị đánh cắp, cung cấp một số định danh duy nhất cơ bản và tài khoản bị khóa, mọi giao dịch mà kẻ tấn công có thể đã xử lý được khôi phục và kẻ tấn công trở lại hình vuông.


1
câu trả lời hoàn hảo !! Tôi chỉ thích cách của bạn để lấy dữ liệu từ máy chủ với một số mã thông báo được mã hóa, tôi nghĩ rằng điều này là không thể giải mã sau đó.
dharam

Tôi biết điều này là hơi muộn nhưng những gì về việc truy cập vào phần máy chủ. Các dịch vụ như Microsoft azure cung cấp cho bạn một cái gì đó như thế này để truy cập máy chủ của họ: MobileServiceClient mClient = new MobileServiceClient ("MobileServiceUrl", // Thay thế bằng URL trang web bên trên "AppKey", // thay thế bằng Khóa ứng dụng này) và khá nhiều người có quyền truy cập để có thể truy cập vào cuối máy chủ của họ chỉnh sửa nó
edwinj

@edwinj - Không có vấn đề gì trong khoa học máy tính mà không thể giải quyết được bằng một lớp cảm ứng khác. Đoạn mã của bạn đưa ra ý tưởng cơ bản để truy cập dịch vụ khách hàng di động Azure; nó cung cấp một mức độ bảo mật cơ bản chống lại "ổ đĩa" của cửa trước của Microsoft. Lần lượt, bạn có thể thêm các lớp bổ sung, chẳng hạn như yêu cầu khóa phiên (về cơ bản mã thông báo được mã hóa) trên bất kỳ cuộc gọi dịch vụ nào và để có được khóa đó, trước tiên, chúng phải xác thực bằng sự kết hợp kiến ​​thức về thông tin đăng nhập và sơ đồ mã hóa.
KeithS

1
Một trong những câu trả lời hay nhất.
debo.stackoverflow

64

 1. Làm cách nào tôi có thể tránh hoàn toàn kỹ thuật đảo ngược của APK Android? Điều này có thể không?

Điều này là không thể

 2. Làm cách nào tôi có thể bảo vệ tất cả tài nguyên, tài sản và mã nguồn của ứng dụng để tin tặc không thể hack tệp APK theo bất kỳ cách nào?

Khi ai đó thay đổi phần mở rộng .apk thành .zip, sau khi giải nén, ai đó có thể dễ dàng lấy tất cả tài nguyên (ngoại trừ Manifest.xml ), nhưng với APKtool, người ta cũng có thể nhận được nội dung thực sự của tệp kê khai. Một lần nữa, không.

 3. Có cách nào để khiến việc hack trở nên khó khăn hơn hoặc thậm chí là không thể? Tôi có thể làm gì hơn nữa để bảo vệ mã nguồn trong tệp APK của mình?

Một lần nữa, không, nhưng bạn có thể ngăn chặn đến một số cấp độ, đó là,

  • Tải xuống tài nguyên từ Web và thực hiện một số quy trình mã hóa
  • Sử dụng thư viện gốc được biên dịch sẵn (C, C ++, JNI, NDK)
  • Luôn thực hiện một số băm ( MD5 / SHA các phím hoặc bất kỳ logic nào khác)

Ngay cả với Smali, mọi người có thể chơi với mã của bạn. Nói chung, nó không phải là POSSIBLE.


7
@TrevorBoydSmith: Mã hóa không giúp ích nhiều khi HĐH là nguồn mở và có thể root. Hệ thống cần một khóa để giải mã APK và chạy nội dung. Và nếu hệ thống có một khóa, và tôi có quyền truy cập vào hệ thống, thì tôi biết nơi tìm khóa và có thể lấy nó. Có nghĩa là tôi có chìa khóa bây giờ quá .
cHao

4
@TrevorBoydSmith: Tuy nhiên, đó là phần "cách thực hiện" sẽ giết chết toàn bộ ý tưởng. Đơn giản là không có cách nào để thực thi mã hóa trực tiếp; tại một số điểm, mã được giải mã phải có sẵn. Điều đó có nghĩa là (1) phải có khóa (mà tôi, với quyền root, có thể có quyền truy cập) và (2) tôi thậm chí có thể tìm thấy bản sao rõ ràng trong RAM và dù sao cũng không phải lo lắng về mã hóa.
cHao

3
@TrevorBoydSmith: Vấn đề là, trong trường hợp này, bạn chỉ đơn giản là không thể tăng chi phí đủ để làm cho nó không đáng giá. Chúng ta không nói về các khóa buộc vũ phu ở đây; chúng ta đang nói về việc đã có chúng - HĐH phải có khóa và chúng ta có HĐH. Cách duy nhất để khắc phục điều đó là làm cho hệ điều hành không thể điều khiển được. Chúc may mắn với điều đó; ngay cả Apple cũng không thể quản lý nó. :)
cHao

3
@TrevorBoydSmith: Tôi không nghĩ việc tăng chi phí nói chung là không thể. Tôi nghĩ (và nói), đặc biệt , rằng đề nghị của bạn là không thể - bởi vì nó là . MATLAB không phải là Android và có các quyền tự do nhất định mà Android không có. Đặc biệt, nó có obfuscation về phía nó; Việc giấu khóa mã hóa khó hơn rất nhiều. Android không thể làm điều đó. Bất cứ ai có mã nguồn sẽ biết các khóa đang ẩn ở đâu và sẽ có một công cụ để lấy chúng trong vòng 10 phút kể từ khi tính năng được công bố. Nó không chỉ có thể làm điều đó; nó hết sức tầm thường .
cHao

6
@TrevorBoydSmith: Tôi đã khẳng định không có gì thuộc loại này. Những gì tôi đang nhấn mạnh là tĩnh, thay đổi, di chuyển, vv không quan trọng . Trong một hệ điều hành nguồn mở, mã hóa một mình không thể bảo vệ mã khỏi bất kỳ ai có thể đảo ngược nó. Bởi vì tôi có thể đọc mã sẽ thực hiện giải mã, bất kể khóa được mua, sử dụng và / hoặc lưu trữ như thế nào, tôi có thể thấy cách bạn đã thực hiện và sao chép mã - thậm chí còn dễ dàng hơn tôi có thể đảo ngược một số siêu bí mật mã ứng dụng.
cHao

37

Không thể tránh 100% kỹ thuật đảo ngược của APK Android, nhưng bạn có thể sử dụng các cách này để tránh trích xuất thêm dữ liệu, như mã nguồn, tài sản tạo thành APK và tài nguyên của bạn:

  1. Sử dụng ProGuard để làm xáo trộn mã ứng dụng

  2. Sử dụng NDK bằng C và C ++ để đặt lõi ứng dụng của bạn và bảo mật một phần mã trong .socác tệp

  3. Để bảo mật tài nguyên, không bao gồm tất cả các tài nguyên quan trọng trong thư mục tài sản với APK. Tải về các tài nguyên này tại thời điểm khởi động ứng dụng đầu tiên.


7
Thứ ba là thực sự làm giảm bớt công việc của những kẻ tấn công. Đánh hơi truyền thông mạng dễ dàng hơn kỹ thuật đảo ngược.
totten

Để giải quyết vấn đề của người thứ ba, người ta có thể mã hóa nội dung đã tải xuống và / hoặc sử dụng kết nối được mã hóa (ví dụ: SSL / TLS)
Stradivari

1
Mã hóa kết nối bảo vệ chống lại những người đánh hơi hoặc sửa đổi lưu lượng. Trong trường hợp bản thân người dùng độc hại (tức là anh ta có apk của bạn và anh ta đã cố gắng hack nó), anh ta vẫn sẽ nhận được nội dung bằng cách sử dụng ứng dụng của bạn, trích xuất tài nguyên với tư cách là người dùng root; nhưng vâng, nó giúp chống lại các cuộc tấn công đánh hơi đơn giản.
Kevin Lee

Thêm vào đó: 4) sử dụng dexguard để che giấu cao hơn nhưng phải trả 5) sử dụng tệp OBB để tải xuống tài sản tại thời điểm tải xuống ứng dụng, nó sẽ giúp giảm kích thước ứng dụng
Ashok Kumar

35

Các nhà phát triển có thể thực hiện các bước sau để ngăn chặn APK khỏi bị đánh cắp,

  • cách cơ bản nhất là sử dụng các công cụ như ProGuardlàm xáo trộn mã của họ, nhưng cho đến nay, thật khó để ngăn chặn hoàn toàn ai đó dịch ngược ứng dụng.

  • Ngoài ra tôi đã nghe nói về một công cụ HoseDex2Jar . Nó dừng lại Dex2Jarbằng cách chèn mã vô hại trong APK Android gây nhầm lẫn và vô hiệu hóa Dex2Jarvà bảo vệ mã khỏi dịch ngược. Nó bằng cách nào đó có thể ngăn chặn tin tặc dịch ngược APK thành mã java có thể đọc được.

  • Sử dụng một số ứng dụng phía máy chủ để chỉ liên lạc với ứng dụng khi cần thiết. Nó có thể giúp ngăn chặn các dữ liệu quan trọng.

Tất cả, bạn không thể hoàn toàn bảo vệ mã của bạn khỏi các tin tặc tiềm năng. Bằng cách nào đó, bạn có thể gây khó khăn và một chút nhiệm vụ khó chịu cho họ để dịch ngược mã của bạn. Một trong những cách hiệu quả nhất là viết bằng mã gốc (C / C ++) và lưu trữ nó dưới dạng các thư viện được biên dịch.


3
HoseDex2Jar bên cạnh vô dụng. Nó chỉ 'nhầm lẫn' dex2jar và có thể dễ dàng bị chặn. smali / apktool, v.v ... chỉ hoạt động tốt với APK 'hosed'.
Nikolay Elenkov

@NikolayElenkov Bạn có biết cách thức hoạt động của HoseDex2Jar không? Những gì họ đã sử dụng để tránh hoặc gây nhầm lẫn cho dex2jar. Bởi vì tôi không thể tải tệp apk của mình lên web để sử dụng HoseDex2Jar. Nếu tôi có thể làm một cái gì đó như HoseDex2Jar để nhầm lẫn dex2jar thì sẽ rất khó để hack bằng công cụ dex2jar.
sachin003

1
Có thể bạn đã hiểu sai quan điểm của tôi: những gì HoseDex2Jar làm là đóng gói lại APK của bạn để công cụ dex2jar phổ biến không thể (ra khỏi hộp) đảo ngược nó. Tuy nhiên, các công cụ khác có thể, và nói chung là rất dễ dàng để đánh bại nó. Không có điểm trong việc sử dụng nó. Không ai đề cập đến điều Dexguard I (của tác giả ProGuard; không miễn phí), nhưng đó là công việc đang xem xét. Nó thực hiện một số điều nhiều hơn so với 'obfuscation' thông thường.
Nikolay Elenkov

C ++ không bao giờ có thể đảo ngược? nó khó nhưng có thể và có các công cụ để giúp bạn với điều đó như hex-rays.com/products/decompiler/index.shtml (vâng, chúng có phiên bản ARM. không phải là điều đó dễ dàng để có được).
dkzm

vâng, @VikartiAnatra: Tôi cũng đã đề cập đến một cách nào đó, bạn có thể gây khó khăn
Sahil Mahajan Mj

24

Dưới đây là một vài phương pháp bạn có thể thử:

  1. Sử dụng obfuscation và các công cụ như ProGuard .
  2. Mã hóa một số nguồn và dữ liệu.
  3. Sử dụng tổng kiểm tra sẵn có độc quyền trong ứng dụng để phát hiện giả mạo.
  4. Giới thiệu mã để tránh tải trong trình gỡ lỗi, nghĩa là để ứng dụng có khả năng phát hiện trình gỡ lỗi và thoát / diệt trình gỡ lỗi.
  5. Phân tách xác thực như một dịch vụ trực tuyến.
  6. Sử dụng đa dạng ứng dụng
  7. Sử dụng kỹ thuật in ngón tay, ví dụ: chữ ký phần cứng của các thiết bị từ các hệ thống con khác nhau trước khi xác thực thiết bị.

23

 1. Làm cách nào tôi có thể tránh hoàn toàn kỹ thuật đảo ngược của APK Android? Điều này có thể không?

Không thể nào

 2. Làm cách nào tôi có thể bảo vệ tất cả tài nguyên, tài sản và mã nguồn của ứng dụng để tin tặc không thể hack tệp APK theo bất kỳ cách nào?

Không thể nào

 3. Có cách nào để khiến việc hack trở nên khó khăn hơn hoặc thậm chí là không thể? Tôi có thể làm gì hơn nữa để bảo vệ mã nguồn trong tệp APK của mình?

Khó khăn hơn - có thể, nhưng trên thực tế, nó sẽ khó khăn hơn chủ yếu đối với người dùng trung bình, những người chỉ đang tìm kiếm hướng dẫn hack. Nếu ai đó thực sự muốn hack ứng dụng của bạn - nó sẽ bị hack, sớm hay muộn.


22

 1. Làm cách nào tôi có thể tránh hoàn toàn kỹ thuật đảo ngược của APK Android? Điều này có thể không?

Đó là điều không thể

 2. Làm cách nào tôi có thể bảo vệ tất cả tài nguyên, tài sản và mã nguồn của ứng dụng để tin tặc không thể hack tệp APK theo bất kỳ cách nào?

Các nhà phát triển có thể thực hiện các bước như sử dụng các công cụ như ProGuard để làm xáo trộn mã của họ, nhưng cho đến nay, thật khó để ngăn chặn hoàn toàn ai đó dịch ngược ứng dụng.

Đây là một công cụ thực sự tuyệt vời và có thể làm tăng khó khăn trong việc 'đảo ngược' mã của bạn trong khi thu nhỏ dấu chân mã của bạn.

Hỗ trợ ProGuard tích hợp: ProGuard hiện được đóng gói với Công cụ SDK. Các nhà phát triển giờ đây có thể làm xáo trộn mã của họ như là một phần tích hợp của bản dựng phát hành.

 3. Có cách nào để khiến việc hack trở nên khó khăn hơn hoặc thậm chí là không thể? Tôi có thể làm gì hơn nữa để bảo vệ mã nguồn trong tệp APK của mình?

Trong khi nghiên cứu, tôi đã biết về HoseDex2Jar . Công cụ này sẽ bảo vệ mã của bạn khỏi dịch ngược, nhưng dường như không thể bảo vệ hoàn toàn mã của bạn.

Một số liên kết hữu ích, bạn có thể tham khảo chúng.


21

Câu hỏi chính ở đây là các tệp dex có thể được dịch ngược hay không và câu trả lời là chúng có thể là "sắp xếp". Có những người tháo gỡ như cống hiếnsmali .

ProGuard, được cấu hình đúng, sẽ làm xáo trộn mã của bạn. DexGuard, phiên bản mở rộng thương mại của ProGuard, có thể giúp nhiều hơn một chút. Tuy nhiên, mã của bạn vẫn có thể được chuyển đổi thành smali và các nhà phát triển có kinh nghiệm kỹ thuật đảo ngược sẽ có thể tìm ra những gì bạn đang làm từ smali.

Có thể chọn một giấy phép tốt và thực thi nó theo luật theo cách tốt nhất có thể.


4
Như một lưu ý phụ (từ chối trách nhiệm: IANAL) - giấy phép sẽ không bảo vệ ứng dụng theo mọi khu vực pháp lý trong mọi trường hợp (ví dụ ở một số quốc gia ở Châu Âu, nó được phép tháo gỡ để tăng khả năng tương thích).
Maciej Piechotka

12

Khách hàng của bạn nên thuê một người biết họ đang làm gì, người có thể đưa ra quyết định đúng đắn và có thể tư vấn cho bạn.

Nói ở trên về việc bạn có một số khả năng thay đổi hệ thống xử lý giao dịch trên phần phụ trợ là vô lý - bạn không được phép thực hiện các thay đổi kiến ​​trúc như vậy, vì vậy đừng mong đợi có thể.

Lý do của tôi về điều này:

Vì tên miền của bạn đang xử lý thanh toán, nên chắc chắn rằng PCI DSS và / hoặc PA DSS (và luật liên bang / tiểu bang tiềm năng) sẽ có ý nghĩa đối với doanh nghiệp của bạn - để tuân thủ bạn phải cho thấy bạn an toàn. Để không an toàn, sau đó tìm ra (thông qua kiểm tra) rằng bạn không an toàn, sau đó sửa chữa, kiểm tra lại, v.v. Để làm điều đúng đắn, hãy suy nghĩ kỹ, cam kết tài năng có kinh nghiệm với công việc, phát triển một cách an toàn, sau đó kiểm tra, sửa chữa (ít hơn), vân vân (ít hơn) cho đến khi bảo mật có thể được xác minh ở mức phù hợp = không tốn kém, nhanh chóng, cách rủi ro thấp để thành công.


8

Là người đã làm việc nhiều trên nền tảng thanh toán, bao gồm một ứng dụng thanh toán di động (MyCheck), tôi sẽ nói rằng bạn cần ủy thác hành vi này cho máy chủ, không nên lưu trữ tên người dùng hoặc mật khẩu cho bộ xử lý thanh toán (bất kể đó là gì) mã hóa cứng trong ứng dụng di động, đó là điều cuối cùng bạn muốn, bởi vì nguồn có thể được hiểu ngay cả khi bạn làm xáo trộn mã.

Ngoài ra, bạn không nên lưu trữ thẻ tín dụng hoặc mã thông báo thanh toán trên ứng dụng, mọi thứ sẽ được giao lại cho dịch vụ bạn đã xây dựng, nó cũng sẽ cho phép bạn sau này, tuân thủ PCI dễ dàng hơn và các công ty Thẻ tín dụng đã thắng Thở xuống cổ của bạn (giống như họ đã làm cho chúng tôi).


7

Các câu trả lời nâng cao khác ở đây là chính xác. Tôi chỉ muốn cung cấp một tùy chọn khác.

Đối với một số chức năng nhất định mà bạn cho là quan trọng, bạn có thể lưu trữ điều khiển WebView trong ứng dụng của mình. Các chức năng sau đó sẽ được thực hiện trên máy chủ web của bạn. Nó sẽ trông giống như nó đang chạy trong ứng dụng của bạn.


@Sarel Botha có cho màn hình IMP Tôi đã sử dụng webview & vâng, đây cũng là một cách để duy trì bảo mật, tôi chấp nhận câu trả lời của bạn.
sachin003

7

Nếu chúng ta muốn làm cho kỹ thuật đảo ngược (gần như) không thể, chúng ta có thể đặt ứng dụng lên một con chip có khả năng chống giả mạo cao, thực thi tất cả những thứ nhạy cảm bên trong và giao tiếp với một số giao thức để có thể điều khiển GUI trên máy chủ. Ngay cả các chip chống giả mạo cũng không phải là bằng chứng nứt 100%; họ chỉ đặt thanh cao hơn rất nhiều so với phương pháp phần mềm. Tất nhiên, điều này là bất tiện: ứng dụng yêu cầu một số mụn cóc nhỏ chứa chip được đưa vào thiết bị.

Câu hỏi không tiết lộ động cơ muốn bảo vệ ứng dụng này rất ghen tị.

Nếu mục đích là để cải thiện tính bảo mật của phương thức thanh toán bằng cách che giấu bất kỳ lỗi bảo mật nào mà ứng dụng có thể có (đã biết hoặc nói cách khác), thì nó hoàn toàn sai. Các bit nhạy cảm bảo mật trong thực tế nên có nguồn mở, nếu điều đó là khả thi. Bạn nên làm cho nó dễ dàng nhất có thể đối với bất kỳ nhà nghiên cứu bảo mật nào xem xét ứng dụng của bạn để tìm các bit đó và xem xét kỹ lưỡng hoạt động của chúng và liên hệ với bạn. Các ứng dụng thanh toán không được chứa bất kỳ chứng chỉ nhúng nào. Điều đó có nghĩa là, không nên có ứng dụng máy chủ nào tin tưởng một thiết bị đơn giản vì nó có chứng chỉ cố định từ nhà máy. Chỉ nên thực hiện giao dịch thanh toán trên thông tin xác thực của người dùng, sử dụng giao thức xác thực đầu cuối được thiết kế chính xác nhằm loại bỏ việc tin tưởng vào ứng dụng, hoặc nền tảng hoặc mạng, v.v.

Nếu mục đích là để ngăn chặn việc nhân bản, thiếu chip chống giả mạo đó, bạn sẽ không thể làm gì để bảo vệ chương trình khỏi bị đảo ngược và sao chép, để ai đó kết hợp phương thức thanh toán tương thích vào ứng dụng của họ, đưa ra tăng đến "khách hàng trái phép". Có nhiều cách để gây khó khăn cho việc phát triển khách hàng trái phép. Một là tạo tổng kiểm tra dựa trên ảnh chụp nhanh về trạng thái hoàn chỉnh của chương trình: tất cả các biến trạng thái, cho mọi thứ. GUI, logic, bất cứ điều gì. Một chương trình nhân bản sẽ không có chính xác trạng thái nội bộ giống nhau. Chắc chắn, nó là một máy trạng thái có các chuyển đổi trạng thái nhìn thấy bên ngoài tương tự (có thể được quan sát bởi đầu vào và đầu ra), nhưng hầu như không ở cùng trạng thái bên trong. Một ứng dụng máy chủ có thể thẩm vấn chương trình: trạng thái chi tiết của bạn là gì? (I E cho tôi một tổng kiểm tra trên tất cả các biến trạng thái nội bộ của bạn). Điều này có thể được so sánh với mã máy khách giả thực thi song song trên máy chủ, trải qua các chuyển đổi trạng thái chính hãng. Một bản sao của bên thứ ba sẽ phải sao chép tất cả các thay đổi trạng thái có liên quan của chương trình chính hãng để đưa ra phản hồi chính xác, điều này sẽ cản trở sự phát triển của nó.


7

Đồng ý với @Muhammad Saqib tại đây: https://stackoverflow.com/a/46183706/2496464

Và @Mumair cung cấp một bước khởi đầu tốt: https://stackoverflow.com/a/35411378/474330

Sẽ luôn an toàn khi cho rằng mọi thứ bạn phân phối cho thiết bị của người dùng đều thuộc về người dùng. Đơn giản và đơn giản. Bạn có thể sử dụng các công cụ và quy trình mới nhất để mã hóa tài sản trí tuệ của mình nhưng không có cách nào để ngăn người quyết tâm 'nghiên cứu' hệ thống của bạn. Và ngay cả khi công nghệ hiện tại có thể khiến họ gặp khó khăn trong việc truy cập không mong muốn, có thể có một số cách dễ dàng vào ngày mai, hoặc thậm chí chỉ trong giờ tiếp theo!

Do đó, đây là phương trình:

When it comes to money, we always assume that client is untrusted.

Ngay cả trong đơn giản như một nền kinh tế trong trò chơi. (Đặc biệt là trong các trò chơi! Có nhiều người dùng 'tinh vi' hơn ở đó và sơ hở lan rộng trong vài giây!)

Làm thế nào để chúng ta giữ an toàn?

Hầu hết, nếu không phải tất cả, các hệ thống xử lý chính của chúng tôi (và tất nhiên là cơ sở dữ liệu) nằm ở phía máy chủ. Và giữa máy khách và máy chủ, nằm ở các giao tiếp được mã hóa, xác nhận, v.v. Đó là ý tưởng của máy khách mỏng.



4

Lược đồ chữ ký APK v2 trong Android N

Lớp PackageManager hiện hỗ trợ xác minh các ứng dụng bằng cách sử dụng lược đồ chữ ký APK v2. Lược đồ chữ ký APK v2 là lược đồ chữ ký toàn tệp giúp cải thiện đáng kể tốc độ xác minh và tăng cường bảo đảm tính toàn vẹn bằng cách phát hiện bất kỳ thay đổi trái phép nào đối với tệp APK.

Để duy trì khả năng tương thích ngược, APK phải được ký bằng lược đồ chữ ký v1 (lược đồ chữ ký JAR) trước khi được ký với lược đồ chữ ký v2. Với lược đồ chữ ký v2, xác minh thất bại nếu bạn ký APK với chứng chỉ bổ sung sau khi ký với lược đồ v2.

Hỗ trợ lược đồ chữ ký APK v2 sẽ có sẵn trong Bản xem trước dành cho nhà phát triển N.

http://developer.android.com/preview/api-overview.html#apk_signature_v2


2
Chữ ký Apk v2 chỉ ngăn tài nguyên bị giả mạo, nhưng không khiến kỹ thuật đảo ngược trở nên khó khăn hơn
Louis CAD

1
Hơn nữa, bạn chỉ có thể loại bỏ chữ ký và ký lại. Chữ ký v2 chỉ là một khối dữ liệu trong tệp APK.
Robert

4

Không có cách nào để tránh hoàn toàn kỹ thuật đảo ngược của APK. Để bảo vệ tài sản ứng dụng, tài nguyên, bạn có thể sử dụng mã hóa.

  • Mã hóa sẽ làm cho việc sử dụng nó khó hơn mà không cần giải mã. Việc sử dụng một số thuật toán mã hóa mạnh sẽ khiến việc bẻ khóa trở nên khó khăn hơn.
  • Thêm một số mã giả mạo vào logic chính của bạn để làm cho việc bẻ khóa trở nên khó khăn hơn.
  • Nếu bạn có thể viết logic quan trọng của mình bằng bất kỳ ngôn ngữ bản địa nào và điều đó chắc chắn sẽ khó khăn hơn cho việc dịch ngược.
  • Sử dụng bất kỳ khung bảo mật của bên thứ ba nào như Quixxi

3

Về cơ bản là không thể. Nó sẽ không bao giờ có thể. Tuy nhiên, có hy vọng. Bạn có thể sử dụng một obfuscator để làm cho nó để một số cuộc tấn công phổ biến khó thực hiện hơn bao gồm những việc như:

  1. Đổi tên các phương thức / lớp (vì vậy trong trình dịch ngược bạn có các kiểu như a.a)
  2. Lưu lượng kiểm soát bị xáo trộn (vì vậy trong trình dịch ngược mã rất khó đọc)
  3. Mã hóa chuỗi và có thể tài nguyên

Tôi chắc chắn có những người khác, nhưng đó là những người chính. Tôi làm việc cho một công ty có tên PreEmptive Solutions trên .NET obfuscator. Họ cũng có một obfuscator Java hoạt động cho Android cũng được gọi là DashO .

Obfuscation luôn đi kèm với một giá, mặc dù. Đáng chú ý, hiệu suất thường kém hơn và nó đòi hỏi thêm thời gian xung quanh các bản phát hành thường. Tuy nhiên, nếu tài sản trí tuệ của bạn cực kỳ quan trọng đối với bạn, thì nó thường có giá trị.

Mặt khác, lựa chọn duy nhất của bạn là làm cho nó để ứng dụng Android của bạn chuyển qua một máy chủ lưu trữ tất cả logic thực sự của ứng dụng của bạn. Điều này có một số vấn đề riêng, bởi vì nó có nghĩa là người dùng phải được kết nối với Internet để sử dụng ứng dụng của bạn.

Ngoài ra, không chỉ Android có vấn đề này. Đó là một vấn đề trên mọi cửa hàng ứng dụng. Đây chỉ là vấn đề khó khăn như thế nào đối với tệp gói (ví dụ: tôi không tin rằng nó rất dễ dàng trên iPhone, nhưng vẫn có thể).


Thật không may nếu một người hack ứng dụng khách (ứng dụng), họ sẽ có thể thấy định dạng giao tiếp và tạo máy chủ của riêng họ :(
Jocky Doe

3

Không thể tránh hoàn toàn RE nhưng bằng cách làm cho chúng phức tạp hơn trong nội bộ, bạn khiến cho những kẻ tấn công gặp khó khăn hơn trong việc nhìn thấy hoạt động rõ ràng của ứng dụng, điều này có thể làm giảm số lượng vectơ tấn công.

Nếu ứng dụng xử lý dữ liệu có độ nhạy cao, các kỹ thuật khác nhau tồn tại có thể làm tăng sự phức tạp của kỹ thuật đảo ngược mã của bạn. Một kỹ thuật là sử dụng C / C ++ để hạn chế thao tác thời gian chạy dễ dàng của kẻ tấn công. Có những thư viện C và C ++ phong phú, rất trưởng thành và dễ tích hợp với Android cung cấp JNI. Kẻ tấn công trước tiên phải phá vỡ các hạn chế gỡ lỗi để tấn công ứng dụng ở mức độ thấp. Điều này làm tăng thêm sự phức tạp cho một cuộc tấn công. Các ứng dụng Android nên cài đặt android: debuggable =, false false trong tệp kê khai ứng dụng để ngăn chặn thao túng thời gian dễ dàng của kẻ tấn công hoặc phần mềm độc hại.

Kiểm tra theo dõi - Một ứng dụng có thể xác định xem hiện tại nó có đang được theo dõi bởi trình gỡ lỗi hoặc công cụ gỡ lỗi khác hay không. Nếu bị truy tìm, ứng dụng có thể thực hiện bất kỳ số hành động phản ứng tấn công nào có thể xảy ra, chẳng hạn như loại bỏ các khóa mã hóa để bảo vệ dữ liệu người dùng, thông báo cho quản trị viên máy chủ hoặc các phản hồi kiểu khác như vậy để tự bảo vệ. Điều này có thể được xác định bằng cách kiểm tra các cờ trạng thái quy trình hoặc sử dụng các kỹ thuật khác như so sánh giá trị trả về của phần đính kèm ptrace, kiểm tra quy trình cha, trình gỡ lỗi danh sách đen trong danh sách quy trình hoặc so sánh dấu thời gian trên các vị trí khác nhau của chương trình.

Tối ưu hóa - Để ẩn các tính toán toán học tiên tiến và các loại logic phức tạp khác, sử dụng tối ưu hóa trình biên dịch có thể giúp làm xáo trộn mã đối tượng để kẻ tấn công có thể dễ dàng tháo gỡ, khiến kẻ tấn công khó hiểu được mã cụ thể hơn. Trong Android, điều này có thể dễ dàng đạt được hơn bằng cách sử dụng các thư viện được biên dịch nguyên bản với NDK. Ngoài ra, sử dụng LLVM Obfuscator hoặc bất kỳ SDK bảo vệ nào sẽ cung cấp khả năng mã hóa mã máy tốt hơn.

Tước nhị phân - Tước nhị phân nguyên gốc là một cách hiệu quả để tăng lượng thời gian và mức độ kỹ năng cần thiết của kẻ tấn công để xem trang điểm của các chức năng cấp thấp của ứng dụng của bạn. Bằng cách tước một tệp nhị phân, bảng ký hiệu của nhị phân bị tước, do đó kẻ tấn công không thể dễ dàng gỡ lỗi hoặc thiết kế ngược ứng dụng. Bạn có thể tham khảo các kỹ thuật được sử dụng trên các hệ thống GNU / Linux như sstriping hoặc sử dụng UPX.

Và cuối cùng, bạn phải biết về obfuscation và các công cụ như ProGuard.


3

Nếu ứng dụng của bạn nhạy cảm thì bạn nên xem xét phần xử lý thanh toán ở phía máy chủ. Cố gắng thay đổi các thuật toán xử lý thanh toán của bạn. Chỉ sử dụng ứng dụng Android để thu thập và hiển thị thông tin người dùng (ví dụ: số dư tài khoản) và thay vì xử lý thanh toán trong mã java, hãy gửi tác vụ này đến máy chủ của bạn bằng giao thức SSL an toàn với các tham số được mã hóa. Tạo API được mã hóa đầy đủ và an toàn để liên lạc với máy chủ của bạn.

Tất nhiên, nó cũng có thể bị hack và nó không liên quan gì đến bảo vệ mã nguồn nhưng hãy xem nó là một lớp bảo mật khác để khiến tin tặc khó lừa ứng dụng của bạn hơn.


2

Các chip TPM (Mô-đun nền tảng đáng tin cậy) có nghĩa vụ phải quản lý mã được bảo vệ cho bạn không? Chúng đang trở nên phổ biến trên PC (đặc biệt là Apple) và chúng có thể đã tồn tại trong các chip điện thoại thông minh ngày nay. Thật không may, không có API hệ điều hành để sử dụng nó. Hy vọng Android sẽ thêm hỗ trợ cho một ngày này. Đó cũng là chìa khóa để dọn dẹp DRM nội dung (mà Google đang làm việc cho WebM).


2

Không có gì là an toàn khi bạn đặt nó vào tay người dùng cuối, nhưng một số thực tế phổ biến có thể khiến kẻ tấn công đánh cắp dữ liệu khó hơn.

  • Đặt logic chính của bạn (thuật toán) vào phía máy chủ.
  • Giao tiếp với máy chủ và máy khách; đảm bảo máy chủ và máy khách b / w liên lạc được bảo mật thông qua SSL hoặc HTTPS; hoặc sử dụng các kỹ thuật tạo thuật toán tạo cặp khóa khác (ECC, RSA). Đảm bảo rằng thông tin nhạy cảm vẫn được mã hóa End-to-End.
  • Sử dụng phiên và hết hạn sau khoảng thời gian cụ thể.
  • Mã hóa tài nguyên và lấy chúng từ máy chủ theo yêu cầu.
  • Hoặc bạn có thể tạo ứng dụng Hybrid có hệ thống truy cập thông qua webviewbảo vệ tài nguyên + mã trên máy chủ

Nhiều cách tiếp cận; điều này là hiển nhiên bạn phải hy sinh giữa hiệu suấtbảo mật


2

Tôi có thể thấy câu trả lời tốt trong chủ đề này. Ngoài ra bạn có thể sử dụng facebook redexđể tối ưu hóa mã. Redex hoạt động ở .dexcấp độ nơi proguard hoạt động như .classcấp độ.



1

Làm cách nào tôi có thể bảo vệ tất cả tài nguyên, tài sản và mã nguồn của ứng dụng để tin tặc không thể hack tệp APK theo bất kỳ cách nào?

Một tệp APK được bảo vệ bằng thuật toán SHA-1 . Bạn có thể thấy một số tệp trong thư mục META-INF của APK. Nếu bạn trích xuất bất kỳ tệp APK nào và thay đổi bất kỳ nội dung nào của nó và nén lại tệp đó và khi bạn chạy tệp APK mới đó trên máy Android, nó sẽ không hoạt động, vì băm SHA-1 sẽ không bao giờ khớp.


Đây là sự thật; nhưng thật đơn giản để từ chức APK (với một chứng chỉ khác) và mọi thứ sẽ hoạt động trở lại. Có thể kiểm tra chữ ký nào đã được sử dụng để ký APK từ bên trong ứng dụng và báo lỗi nếu chứng chỉ thay đổi, nhưng chỉ cần chỉnh sửa mã này ra khỏi ứng dụng một chút ít.
David đưa ra

Điều này có thể ngăn thiết bị Android chạy mã sửa đổi, nhưng bạn vẫn có thể dễ dàng trích xuất mã có liên quan và viết mã mới trên PC làm những gì bạn muốn.
Sarel Botha

1

Mặc dù tôi đồng ý rằng không có giải pháp 100% nào bảo vệ mã của bạn, v3 của HoseDex2Jar hiện đã sẵn sàng nếu bạn muốn dùng thử.


1

Công cụ: Sử dụng Proguard trong ứng dụng của bạn, nó có thể bị hạn chế để thiết kế ngược ứng dụng của bạn


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.