Thứ Hai, 11 tháng 1, 2016

Dịch ngược ứng dụng Android để tham khảo hay chỉnh sửa mã nguồn



 Có thể bạn muốn xem mã nguồn của một ứng dụng nào đó để tham khảo, thực tập bằng cách chỉnh sửa cho ứng dụng chạy theo ý mình... Sau đây là cách thực hiện, từ việc lượm lặt file apk của ứng dụng trên Google Play đến việc dịch ngược, chỉnh sửa rồi “built” lại...

 1. Lấy file APK của ứng dụng
Các ứng dụng cài đặt chạy trên Android là những file có đuôi apk, bạn có thể tìm và tải chúng từ nhiều nguồn trên mạng, thậm chí một số nguồn còn cho phép tải về file apk, sau đó đem cài đặt trực tiếp lên điện thoại. Nguồn ứng dụng dồi dào và phong phú nhất phải kể tới là cửa hàng Google Play (play.google.com), tuy nhiên, Google Play chỉ cho phép bạn tải ứng dụng về từ thiết bị Android chứ không cung cấp trực tiếp file apk. Để làm việc này, giải pháp là sử dụng công cụ Real APK Leecher. Để chạy Real APK Leecher, máy tính của bạn phải có Java SE Runtime Environment (tải về  tại đây hoặc tại đây). Bạn có thể tải Real APK Leecher từ địa chỉ tại đây. Sau khi tải về và giải nén, bạn chạy file Real APK Leecher.exe.
Đầu tiên, một hộp thoại xuất hiện. Bạn cần điền thông tin đăng nhập của mình tại phần General Info. Tại mục Device ID, để lấy mã Device ID trên thiết bị của mình, bạn sử dụng tính năng gọi điện của điện thoại Android, nhập vào mã *#*#8255#*#*. Một trang thông tin sẽ tự động xuất hiện, cho biết các thông tin thiết bị, trong đó có thông tin về Device ID.
Đơn giản hơn, bạn có thể sử dụng ứng dụng Device ID trên Google Play (tại đây) để lấy Device ID của thiết bị của mình. Trở lại hộp thoại, chọn ngôn ngữ tại Default language/country, tại phần Choose default folder to save downloaded apps, bạn chọn đường dẫn để lưu file apk của ứng dụng khi tải về. Xong, bấm Save để vào cửa số chính. Nếu có thông báo lỗi xuất hiện, bạn bấm OK để bỏ qua. Tại giao diện chính, chưa có ứng dụng nào xuất hiện. Để tìm, bạn gõ tên ứng dụng mong muốn vào khung tìm kiếm phía trên, bên phải, và chúng sẽ xuất hiện. Để tải về, bạn phải bấm chuột chọn ứng dụng muốn tải, sau đó bấm chuột phải và chọn Download this app. Sau khi quá trình tải về hoàn tất, bạn tìm đến thư mục chứa file apk được chỉ định trong hộp thoại lúc nãy để lấy file.
Cách này chỉ giúp bạn tải các ứng dụng miễn phí, đối với các ứng dụng có thu phí, bạn vẫn có thể tải sau khi trả phí hệt như tải về trên thiết bị Android, chỉ khác là với công cụ này, bạn có thể lấy được trực tiếp file apk của ứng dụng từ Google Play.
2. Dịch ngược ứng dụng với mục đích tham khảo mã nguồn
Bản chất file apk là một dạng file đóng gói, bạn có thể giải nén bằng 7zip (tại đây) và thu được những file đóng gói có dạng đã được dịch để dùng, không thể đọc được mã nguồn. Bây giờ, bạn cần dịch ngược file apk sang jar (Java Archive), là một dạng đóng gói của Java. Để làm điều này, bạn tải công cụ dex2jar về tại tại đây. Sau khi tải về, giải nén dex2jar. Để thuận tiện, bạn copy file .apk vào cùng thư mục của dex2jar. Trong ví dụ này, file .apk được sử dụng là iDict.apk, và thư mục dex2jar-0.0.9.15 giải nén xong được đổi tên là dex2jar, lưu theo đường dẫn C:\dex2jar\.
Bạn vào cửa sổ Command Prompt (Start > Run > cmd), gõ theo cú pháp cd <đường dẫn thư mục dex2jar>, trong ví dụ này là cd C:\dex2jar.
Sau đó, bạn gõ theo cú pháp dex2jar.bat <đường dẫn tuyệt đối của file .apk>, ở đây là dex2jar.bat iDict.apk (vì ở đây file iDict.apk đã nằm sẵn trong thư mục dex2jar). Sau khi làm xong, chương trình sẽ báo vị trí file dịch ngược. File dịch ngược sẽ nằm trong thư mục chứa file apk, được đặt tên theo cú pháp [tên file .apk]_ dex2jar.jar, ví dụ ở đây là iDict_dex2jar.jar.
File jar xuất ra là file gồm các bytes code nhị phân của Java, rất khó đọc trực tiếp, bạn cần sử dụng công cụ jd-gui (http://java.decompiler. free.fr/?q=jdgui) để đọc file này. Sau khi tải, vào File > Open để mở file jar. Với jd-gui, file jar dịch ngược dễ đọc hơn so với việc đọc trực tiếp rất nhiều.
Đối với những nhà lập trình, để tránh bị dịch ngược ứng dụng của mình, họ có thể sử dụng các kỹ thuật như obfuscate code, anti-reverse, hoặc mã hóa bất đối xứng... làm cho một số thông tin của các hàm, biến bị xóa khỏi ứng dụng. Vì vậy đối với một số ứng dụng, khi dịch ngược xong, khi xem bạn sẽ thấy các file a, b, c, d... với mục đích làm cho sản phẩm trở nên khó đọc.
Việc dịch ngược này cũng không đảm bảo toàn vẹn code, có nghĩa là bạn dịch ngược xong, mang vào NetBean hay Eclipse không phải lúc nào cũng build ra được. Chúng ta sử dụng cách này để tham khảo mã nguồn, cấu trúc chương trình, phục vụ cho việc học là chính.
3. Dịch ngược, sửa đổi ứng dụng
Với việc dịch ngược sau đó sửa đổi và đóng gói lại ứng dụng, bạn có thể Việt hóa ứng dụng Android hoặc thậm chí hiệu chỉnh ứng dụng (kể cả ứng dụng hệ thống), chạy theo ý mình. Để làm việc này, trên máy tính, bạn cần chuẩn bị các công cụ: Java SE Runtime Environment (đã được giới thiệu lúc nãy), Java SE Development Kit (tại đây). Bạn tải về Apktool & baksmali/smali tại tại đây (đối với Windows 7 hoặc 8, bạn có thể thử tải tại tại đây). Ngoài ra, nên trang bị WinRAR hoặc 7zip và cài đặt thêm Notepad++ (http://notepad-plus-plus.org/download) để hiệu chỉnh code dễ dàng hơn. Trên thiết bị Android, bạn cần cài đặt ứng dụng duyệt file, ví dụ như Explorer (tạ đây), để truy xuất vào các file của hệ thống (có thể yêu cầu root).
Sau khi tải Apktool & baksmali/smali về, bạn giải nén và đặt ở vị trí ổ C: để dễ thao tác. Bạn cũng nên đổi tên thư mục Apktool & baksmali/ smali thành apktool như ví dụ trong bài viết này. Trên thiết bị Android, bạn dùng ứng dụng duyệt file đi vào đường dẫn /system/framework/, chép file framework-res.apk từ thiết bị Android vào máy tính. Lưu ý bạn chỉ chép chứ không di chuyển hay can thiệp gì thêm vì có thể ảnh hưởng tới hệ thống. Nếu muốn dịch ngược các file ứng dụng của hệ thống Android như Contacts.apk, Phone.apk. MusicPlayer.apk... (lưu trong /system/app/), bạn cần chép thêm file twframework-res.apk.
Bạn đem file framework-res.apk, cùng với file apk của ứng dụng cần dịch ngược (ví dụ ở đây là iDict.apk), vào cùng thư mục apktool. Sau đó, trong thư mục apktool, mở file Command Prompt.bat. Tại đây, bạn tiến hành dịch ngược file apk bằng cách gõ theo cú pháp:
apktool if framework-res.apk
apktool d
Ví dụ ở đây là
apktool if framework-res.apk
apktool d iDict.apk
Đối với các ứng dụng hệ thống (Contacs.apk, Phone.apk, Camera.apk, Settings.apk...), bạn sử dụng cú pháp:
apktool if framework-res.apk
apktool if twframework-res.apk
apktool d
Sau khi thực hiện xong, bạn sẽ thấy xuất hiện một thư mục có tên của ứng dụng cần dịch ngược ngay trong thư mục apktool. Trong thư mục đó, có thể hiệu chỉnh lại các file png, dùng Notepad++ để hiệu chỉnh các file xml, smali... chính là các file dữ liệu lập trình của ứng dụng.
Sau khi hiệu chỉnh xong, bước tiếp theo là biên dịch lại (recompile) file apk. Trong cửa sổ Command Prompt lúc nãy, bạn nhập theo cú pháp:
apktool b -f -d
Ví dụ ở đây là:
apktool b -f -d iDict
Khi làm xong, bạn vào thư mục chứa các file của ứng dụng lúc nãy, sẽ thấy có thêm thư mục dist chứa file apk đã sửa đổi, có thể mở bằng WinRAR hoặc 7zip. Sau đó, quay trở lại file apk gốc chưa sửa đổi (ở thư mục apktool), bạn cũng mở bằng WinRAR hay 7zip. Như vậy, bạn đang mở hai cửa sổ WinRAR hoặc 7zip, một là của file apk gốc (chứa trong thư mục apktool), một là của file apk đã sửa đổi (chứa trong thư mục dist). Hãy nhìn vào cửa sổ file apk gốc, nếu thấy có các thư mục META-INF, lib và file android.manifest. xml (nếu bạn không chỉnh sửa gì file này) mà cửa sổ file apk đã hiệu chỉnh không có, bạn chọn hết, sau đó kéo và thả vào cửa sổ file apk đã sửa đổi.
Hãy chọn OK nếu có thông báo xác nhận. Đến đây, có thể chép file apk đã hiệu chỉnh vào thiết bị Android để sử dụng, tuy nhiên, bạn nên tiến hành “zipalign” ứng dụng đó trước. Zipalign là một tiện ích tối ưu hóa một ứng dụng Android (apk) được đóng gói, cho phép Android tương tác với ứng dụng hiệu quả hơn, và khi làm như vậy, nó có khả năng để làm cho các ứng dụng và toàn bộ hệ thống Android nhanh hơn nhiều. Ứng dụng đã được zipalign sẽ hoạt động nhanh hơn, và sử dụng ít bộ nhớ RAM.
Để zipalign, bạn cần tải và cài đặt Android SDK (http://goo.gl/pLS9Up) trên máy nếu chưa có, sau đó, vào đường dẫn C:\Program Files\Android\ android-sdk\tools, tìm và chép 2 file zipalign.exe và draw9patch.bat dán vào thư mục C:\Windows\here. Tiếp theo, bạn gõ trong Commander Prompt cú pháp:
zipalign -fv 4 <đường dẫn kèm tên file .apk cần zipalign> <đường dẫn kèm tên file .apk thành phẩm đã zipalign>
4. Một số ví dụ can thiệp ứng dụng hệ thống
Bằng cách trên, bạn có thể sửa đổi rất nhiều ứng dụng, thậm chí thay đổi vào sâu bên trong tùy khả năng của mình, đơn giản nhất là có thể Việt hóa giao diện ứng dụng đó. Sau đây là một số ví dụ về việc hiệu chỉnh ứng dụng khi đã dịch ngược được đề cập ở trên. Các ví dụ này là các ví dụ can thiệp vào ứng dụng hệ thống Android, vì vậy khi làm bạn phải thật cẩn thận và sao lưu hệ thống trước. Sau khi hiệu chỉnh xong và đóng gói lại theo các bước hướng dẫn ở trên, bạn chép file hiệu chỉnh đè lên file cũ của hệ thống.
Thay đổi hình nền cho menu sổ xuống của thanh trạng thái hoạt động:
- File cần dịch ngược: framework-res.apk (/system/ framework/).
- Áp dụng cho: ICS, Jelly Bean.
Sau khi dịch ngược, bạn vào thư mục framework-res và theo đường dẫn /res/drawable-hdpi (hoặc mdpi/ xhdpi), tìm các file có đuôi png có tên sau:
ab_bottom_solid_dark_holo.9.png
ab_solid_dark_holo.9.png
ab_stacked_transparent_light_holo.9.png
ab_transparent_dark_holo.9.png
ab_transparent_light_holo.9.png
Bạn thay thế các file hình ảnh này bằng các file hình ảnh mong muốn (ghi đè lên), nên lấy độ phân giải 720x100 nếu là thư mục xhdpi, sau đó, dịch lại và chép vào hệ thống Android.
Nếu muốn thay đổi các biểu tượng ở menu này, bạn có thể dịch ngược file Settings.apk (\system\app\) rồi sau đó vào đường dẫn settings/res/drawable-***dpi, sửa đổi file ic_launcher_settings.png rồi dịch lại.
Thay đổi hình nền trong menu cài đặt nhanh:
- File cần dịch ngược: SystemUI.apk (/system/ framework/)
- Áp dụng cho: CyanogenMod 10.1
Sau khi dịch ngược, bạn vào đường dẫn SystemUI\ res\drawable, dùng Notepad++ mở file qs_tile_ background.xml, tìm và đổi đoạn mã sau:
xmlns:android=”http://schemas.android.com/apk/ res/android”>
thành
xmlns:android=”http://schemas.android.com/apk/ res/android”>
Sau đó, bạn chọn 2 file hình nền có đuôi png, đặt tên qs_ tile_background_pressed.png và qs_tile_background_ normal.png cho vào thư mục drawable-xxxxdpi (bạn có thể chọn bất cứ hình ảnh nào, kể cả hình trong suốt) rồi dịch lại.
Chỉnh sửa thông báo pin:
- File cần dịch ngược: systemUI.apk
Bạn vào đường dẫn \systemUI\res\values-vi (với tiếng Việt) hoặc \systemUI\res\values (với tiếng Anh), mở file strings.xml bằng Notepad++ rồi thay đổi theo ý muốn. Bạn lưu ý trong đó ký hiệu %d%% là ký hiệu số phần trăm của pin còn lại.
Sau khi sửa đổi và dịch lại xong, bạn mở file systemUI. apk lúc nãy lên bằng WinRAR/7zip, copy 2 file META-INF và AndroidManifest.xml vào thư mục SystemUI\build\apk. Sau khi copy xong, bạn vào lại cửa sổ Command Prompt, gõ apktool b systemUI. File SystemUI.apk thành phẩm sẽ nằm trong thư mục systemUI\dist.

0 nhận xét: