Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Còn vài tiếng nữa là hết tháng rồi. Đành đặt mình vào đường đua với thời gian để hoàn thành bài viết này vậy. Về chủ đề NLP chắc để tháng sau viết chứ giờ viết không kịp mất.!! Hehe
Một ngày đẹp trời, khi mà tâm trạng bạn rất thoải mái. Cứ cho như là bạn đang ế đi, không có gấu chó đi chơi nên đành lòng ở nhà ngồi viết code. Những dòng code của bạn rất mượt, rất đẹp, không những thế bạn còn lồng vào đấy những thuật toán hay, cách giải quyết cực kỳ tốt mà chỉ mình bạn nghĩ ra.
"Ai viết code mà vi diệu thế" - Bạn vui đến mức mà tự sướng để thốt lên
"Phù! Xong rồi" - Bạn vừa hoàn thành xong một ứng dụng, và chuẩn bị release đẩy nó lên store để chào hàng mọi người.
Giả sử là ứng dụng của bạn nó có phần chuyển từ tên tiếng việt sang tên tiếng nhật đi, cách xử lý này đã làm bạn tốn bao nhiêu tâm huyết cho nên ứng dụng của bạn rất được mọi người ủng hộ, bởi tính năng độc đáo mà chỉ bạn mới có. Nhờ vào ý tưởng của bạn (nguyên nhân chủ quan), cộng thêm việc bạn chưa có gấu (nguyên nhân khách quan) mà tiền bạn kiếm được từ ứng dụng ngày càng nhiều. Kể từ đó, bạn sống sung sướng, đến nỗi ăn tới 1 thùng mì trong 2 ngày để tiêu bớt tiền. @@
Và lại đến một ngày, trời âm u, mây mịt mù, tâm rối bù nhưng tiền thì chẳng thể đủ nữa! Là do bạn hư hỏng, bao nhiêu tiền cũng tiêu hết? hay là do bạn đã có gấu?. Không! chẳng cái nào trên đúng cả, bạn vẫn ngoan như ngày nào, ăn uống thì cùng lắm là chỉ nửa thùng 1 ngày thay vì 1 thùng 2 ngày như trước =)) (WTH, không những code giỏi mà toán còn giỏi nữa).
Thế tại sao?. Thì ra cũng có một ứng dụng khác trên thị trường, đẹp hơn, xịn hơn, và chức năng mà bạn tâm đắc bấy lâu cũng có trong đấy nữa. Một ứng dụng cạnh tranh đi kèm làm bạn mất hết những thùng mì ngày nào (có vẻ bạn nghiện ăn mì quá mức rồi).
Tại sao ứng dụng khác đấy lại làm được các chức năng, cách xử lý mà chỉ bạn mới nghĩ ra!. Bạn phải tìm hiểu cho ra lẽ!
Thì ra là thế, qua vài ngày mò mẫm, bạn cũng đã biết được chỗ hổng của ứng dụng, bạn chưa xáo trộn code làm cho người khác có thể dịch ngược lại mã nguồn của bạn. Và ăn cắp tâm huyết của bạn.
Vậy họ đã làm thế nào?. Và biện pháp phòng chống ra sao. Chúng ta cùng tìm hiểu nhé! - [Android] Thử dịch ngược mã nguồn và biện pháp.
Trong android, khi bạn tạo ra một bản cài đặt với đuôi là ".apk". File .apk này có thể được mở và giải nên như file rar bình thường. Bạn có thể dùng winrar để mở chúng lên!
Xem trong đấy có gì!
Chẳng hạn như mình tạo 1 template project (Login Project) có sẵn trong Android Studio!
Và build ra một bản .apk! (Chọn Build > Build APK) sẽ có file app-debug.apk nằm ở đường dẫn mặc định là YourProjectName/app/build/outputs/apk.
Dùng winRAR mở bạn sẽ thấy những thành phần được đóng gói bao gồm: thư mục res, file classes.dex, ... như trong hình!
Trong đấy res là nơi đóng gói những tài nguyên trong thư mục res ở trong code của bạn, bao gồm những file ảnh, file view mà bạn viết bằng xml (đã được mã hóa). Nhưng quan trọng là file classes.dex, những mã nguồn .java của bạn được biên dịch ra thành .class và đóng gói trong file này.
Để xem trong mã nguồn này có gì, bạn cần đến vài công cụ, bạn có thể tải chúng ở đường link dưới đây:
Mình đã tải về và giải nén chúng ra, đặt trong cùng một thư mục! (file jd-gui-1.4.0 là JD-GUI nhé)
Giả sử bạn đã chuẩn bị được các công cụ ở trên, mình bắt đầu tiến hành nhé.
d2j-dex2jar.bat classes.dex
nó sẽ sinh ra file classes-dex2jar.jar từ file classes.dex
Chẳng hạn, mình thấy một số ứng dụng khá đẹp nên mình muốn biết người ta dùng thư viện nào (việc làm này hơi thiếu tế nhị do chưa được xin phép, nên bạn đừng như mình)
Sau khi dịch ngược mã nguồn, ta có thể nhìn thấy toàn bộ mã nguồn cũng như thư viện được sử dụng!.
Chẳng hạn ứng dụng này đã sử dụng thư viện https://github.com/hoang8f/android-flat-button của chính công ty Kaopiz tạo ra luôn =)) (bạn có thư viện nào hay hãy đóng góp vào repository github của công ty để quảng bá công ty ra bên ngoài)
Sau khi dịch ngược mã nguồn ta thấy.... Wait, wth, cái gì thế này, code thế này đọc thế nào được!. Ông nào code mà khủng thế.
Thực ra không phải như bạn nghĩ đâu, đây là một cách làm rối code, làm cho code đọc không thể hiểu được để phòng việc dịch ngược ăn cắp mã nguồn. Vậy nó làm như thế nào?. Cùng tìm hiểu ở mục tiếp theo nhé!
Để tránh khỏi việc ăn cắp code, Android cung cấp cho ta công cụ - ProGuard
ProGuard là công cụ tích hợp sẵn trong Android Studio, với các tính năng giúp cho mã nguồn ứng dụng của bạn thu gọn lại (để dễ phân phối), làm rối (để chống dịch ngược, vì tên các hàm, biến ... bị đổi tên khó đọc), cuối cùng là nó tối ưu để ứng dụng chạy nhanh hơn. Bạn được khuyến cáo nên sử dụng ProGuard trong cả môi trường đang phát triển lẫn sản phẩm phát hành, nếu chỉ sử dụng ở sản phẩm phát hành mà bỏ qua sử dụng nó khi chạy thử có thể tăng khả năng ứng dụng bị crash không mong muốn ...
android {
//..
buildTypes {
release { //Thêm một khối debug nếu muốn
minifyEnabled true //Thu gọn code, false nếu không dùng
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
Có thể thêm cả ProGuard cho debug
android {
//..
buildTypes {
release { //Thêm một khối debug nếu muốn
minifyEnabled true //Thu gọn code, false nếu không dùng
useProguard true //Làm rối code
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
debug {
minifyEnabled true
useProguard false //Không làm rối code
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
Các tài nguyên không dùng tới có thể được loại bỏ (cần sử dụng cùng với minifyEnabled true) bằng cách thêm vào shrinkResources true
android {
//..
buildTypes {
release {
shrinkResources true //Thêm dòng này vào
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
Trong các đoạn cấu hình sử dụng ProGuard ở trên, đều có chỉ ra một file có tên proguard-rules.pro, đó là file cấu hình thêm về cách thức hoạt động cho ProGuard
Khi ProGuard làm rối code, nó đổi tên các class, nhiều class tham khảo từ bên thứ 3 cũng bị chuyển đổi, nên có thể dẫn tới lỗi. Trong trường hợp muốn không làm rối một lớp nào đó bạn dùng cấu hình keep, ví dụ trong file: proguard-rules.pro
-keep class com.facebook.** { *; }
Với mã trên, sẽ giữ lại các lớp, phương thức com.facebook.** {*}
Bạn có thể đọc thêm chi tiết ở đây: https://developer.android.com/studio/build/shrink-code.html
Mình đã thử và kết quả thu được từ ứng dụng login ở trên như sau
Các tên function, tên biến đã bị đổi hết sang kí tự chẳng tường minh chút này giờ việc đọc code sẽ trở nên khó hơn!.
Bài viết của mình xin được dừng ở đây! Hẹn mọi người ở bài viết sau! Phù! Cuối cùng cũng kịp!
Việc dịch ngược mã nguồn của người khác mà chưa được sự cho phép là một điều cấm kỵ trong đạo đức máy tính, tốt nhất hãy tự thân vận động, nhưng không phải ai cũng có tư tưởng như vậy, nên hãy bảo vệ bản quyền của bạn để tránh ăn cắp.
Bài viết chỉ mang tính giới thiệu cũng như đề cao cách phòng tránh, không có ý ăn cắp bản quyền, rất mong các tác giả của ứng dụng thông cảm.
[1]. https://xuanthulab.net/su-dung-proguard-de-bao-ve-va-toi-uu-ung-dung-android.html
[2]. https://developer.android.com/studio/build/shrink-code.html