Tải bản đầy đủ (.pdf) (55 trang)

Bài tập lớn môn an toàn mạng (34)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.82 MB, 55 trang )

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THƠNG TIN I
----------

BÁO CÁO CUỐI KÌ
MƠN: AN TỒN MẠNG
Chủ đề: Công cụ Apktool trên Kali Linux

Giảng viên hướng dẫn:

TS. Đặng Minh Tuấn

Sinh viên thực hiện:

Đỗ Văn Hà

Mã sinh viên:

B18DCAT065

Nhóm mơn học:

02

HÀ NỘI - 12/2021


MỤC LỤC

DANH MỤC CÁC TỪ VIẾT TẮT ...............................................................................i
DANH MỤC HÌNH ẢNH ............................................................................................ ii


LỜI MỞ ĐẦU ................................................................................................................1
CHƯƠNG 1: GIỚI THIỆU VỀ FILE APK CỦA HỆ ĐIỀU HÀNH ANDROID. ..2
1.1. Cấu trúc file APK. ............................................................................................2
1.2. Quá trình xử lý tạo file APK. ...........................................................................7
CHƯƠNG 2: TÌM HIỂU VỀ APKTOOL. ................................................................11
2.1. Giới thiệu. .......................................................................................................11
2.2. Chức năng. ......................................................................................................11
2.3. Quá trình phát triển qua các phiên bản. ..........................................................14
CHƯƠNG 3: HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG APKTOOL TRÊN HỆ ĐIỀU
HÀNH KALI LINUX. .................................................................................................17
3.1. Hướng dẫn cài đặt...........................................................................................17
Thực hiện tự động qua bộ quản lý tool của Kali Linux. ......................... 17
Thực hiện thủ công. ................................................................................. 18
3.2. Hướng dẫn sử dụng. .......................................................................................21
Các tham số của Apktool trong câu lệnh terminal. ................................. 21
Hướng dẫn sử dụng Apktool để thực hiện một số chức năng. ................ 24
CHƯƠNG 4: MỘT SỐ LAB VỀ SỬ DỤNG APKTOOL. ......................................31
4.1. Sử dụng Apktool để crack ứng dụng trả phí...................................................31
Giới thiệu. ................................................................................................ 31
Các bước thực hiện. ................................................................................. 32
4.2. Sử dụng Apktool để chèn dữ liệu độc hại vào trong ứng dụng thông thường.39
Giới thiệu. ................................................................................................ 39
Quá trình thực hiện. ................................................................................. 40


4.3. Sử dụng Apktool để giải mã hoặc đóng gói ứng dụng phụ thuộc framework bên
ngoài. .....................................................................................................................44
KẾT LUẬN ..................................................................................................................48
TÀI LIỆU THAM KHẢO...........................................................................................49



DANH MỤC CÁC TỪ VIẾT TẮT

Từ viết tắt

Nghĩa tiếng Anh

Nghĩa tiếng Việt

APK

Android Package Kit

Gói ứng dụng Android

DEX

Dalvik Executable

Thực thi theo mã Dalvik

AAR

Android Archive

Kho lưu trữ Android

AAPT

Android Asset Packaging Tool


Công cụ đóng gói tài nguyên của
Android

AOSP

Android Open Source Project

Dự án mã nguồn mở Android

i


DANH MỤC HÌNH ẢNH

Hình 1.1: Ví dụ về cấu tạo của một file APK. ................................................................2
Hình 1.2: Ví dụ về thư mục assets. .................................................................................3
Hình 1.3: Ví dụ về nội dung file MANIFEST.MF và quy tắc định dạng.......................4
Hình 1.4: Ví dụ về nội dung file CERT.SF. ...................................................................5
Hình 1.5: Ví dụ về một file AndroidManifest.xml. ........................................................6
Hình 1.6: Q trình đóng gói để tạo file APK. ...............................................................7

Hình 2.1: Nội dung file AndroidManifest.xml nếu mở bằng cách giải nén file APK..12
Hình 2.2: Nội dung file AndroidManifest.xml nếu được dịch ngược bằng Apktool. ..13
Hình 2.3: Tất cả những thay đổi trên phiên bản v.2.0.0 của Apktool. .........................16

Hình 3.1: Thực hiện cài Apktool trên Kali Linux. .......................................................17
Hình 3.2: Cài đặt thành cơng Apktool theo cách 1.......................................................18
Hình 3.3: Giao diện trang download Apktool. .............................................................19
Hình 3.4: 2 file apktool và apktool.jar tại thư mục /usr/local/bin. ...............................20

Hình 3.5: Apktool v.2.6.0 được cài đặt thành cơng theo cách 2. .................................21
Hình 3.6: Ví dụ về decode file APK của ứng dụng Facebook Lite trên Android. .......24
Hình 3.7: Sử dụng Apktool để giải mã file JAR. .........................................................25
Hình 3.8: Sử dụng tham số -o trong dịch ngược file APK bằng Apktool. ...................25
Hình 3.9: Sử dụng Apktool để đóng gói thư mục thành file APK. ..............................26
Hình 3.10: Sử dụng Apktool để đóng gói thư mục thành file JAR. .............................27
Hình 3.11: File framework tiêu chuẩn của Apktool. ....................................................28
Hình 3.12: Cài đặt framework tên lge-res.apk vào Apktool.........................................28
Hình 3.13: Danh sách framework được cài ở thư mục mặc định. ................................29
Hình 3.14: Khơng có framework nào được cài ở thư mục /home/kali. ........................29
Hình 3.15: Xóa framework 1.apk của Apktool. ...........................................................29
Hình 3.16: Sử dụng tham số --force để buộc xóa cả thư mục. .....................................30

Hình 4.1: Thơng tin của các huyệt hiển thị không đầy đủ. ..........................................32
ii


Hình 4.2: Thơng báo mua bản cao cấp khi xem huyệt ở phía lưng. .............................32
Hình 4.3: Decode file APK của ứng dụng “Huyệt vị kinh lạc”. ..................................33
Hình 4.4: Nội dung thư mục sau khi dịch ngược file APK. .........................................33
Hình 4.5: Code Java của User.class trong mã nguồn. ..................................................34
Hình 4.6: Code smali của User.class. ...........................................................................35
Hình 4.7: Thay đổi dịng 33. .........................................................................................35
Hình 4.8: Chỉnh sửa method init(). ...............................................................................36
Hình 4.9: Đóng gói ứng dụng sau khi đã chỉnh sửa. ....................................................36
Hình 4.10: Ký thành cơng file APK bằng jarsigner. ....................................................37
Hình 4.11: Banner u cầu mua bản cao cấp được ẩn, thơng tin .................................38
Hình 4.12: Ta đã có thể xem được các huyệt mạch phía sau lưng. ..............................39
Hình 4.13: Thơng tin huyệt mạch phía sau lưng được hiển thị đầy đủ. .......................39
Hình 4.14: Giao diện của ứng dụng calculator. ............................................................40

Hình 4.15: Dịch ngược thành cơng file calculator.apk.................................................40
Hình 4.16: File AndroidManifest.xml ban đầu. ...........................................................41
Hình 4.17: File AndroidManifest.xml sau khi sửa. ......................................................41
Hình 4.18: Nội dung của RunTrojan.java.....................................................................42
Hình 4.19: Một phần nội dung của file RunTrojan.smali.............................................42
Hình 4.20: File RunTrojan.smali cùng các file Smali khác. ........................................43
Hình 4.21: Đóng gói thư mục calculator. .....................................................................43
Hình 4.22: Danh bạ trước khi khởi động lại máy. ........................................................44
Hình 4.23: Danh bạ sau khi khởi động lại máy. ...........................................................44
Hình 4.24: Khơng thể hồn tất q trình dịch ngược file lg_phone.apk. .....................45
Hình 4.25: Thư mục cùng tên được sinh ra khi giải mã lỗi. .........................................46
Hình 4.26: Cài đặt thành cơng framework của LG. .....................................................46
Hình 4.27: Q trình giải mã file APK đã sử dụng cả 2 framework. ...........................47
Hình 4.28: Thư mục thu được sau giải mã. ..................................................................47

iii


LỜI MỞ ĐẦU

Thiết bị di động ngày càng trở nên phổ biến trong thời đại ngày này, đặc biệt là
các thiết bị di động thơng minh (smartphone) ngày càng khó có thể thay thế. Nó có thể
đáp ứng nhiều nhu cầu hàng ngày của người dùng từ việc giải trí, làm việc đến cập nhật
tin tức, quản lý sức khỏe, … Hệ điều hành Android đang là hệ điều hành phổ biến nhất
trên smartphone và ngày càng khẳng định điều đó qua những con số thống kê cụ thể
trong các sự kiện Google I/O, vì thế, nhu cầu làm việc với ứng dụng Android cũng tăng
theo. Android sử dụng file định dạng APK để thực hiện cài đặt, phân phối ứng dụng của
mình. Nhu cầu cần có một tool cho phép tháo dời, phân tích, chỉnh sửa, lắp ghép tệp tin
APK là điều hiển nhiên đối với những người phát triển. Apktool là một công cụ dịch
ngược cho phép thực hiện những chức năng đó và cịn có thể làm được nhiều hơn nữa.

Trong bài báo cáo cuối kỳ này, em xin phép được tìm hiểu về cơng cụ Apktool nói chung
và trên hệ điều hành Kali Linux nói riêng để thầy và mọi người có thể hiểu rõ hơn về
công cụ này.

1


CHƯƠNG 1: GIỚI THIỆU VỀ FILE APK CỦA HỆ ĐIỀU HÀNH
ANDROID.

1.1. Cấu trúc file APK.
APK là viết tắt của cụm từ Android Package Kit (hoặc đôi khi là Android
Application Package), đây là một định dạng file chính thức được hệ điều hành Android
sử dụng để phân phối và cài đặt ứng dụng của mình trên các thiết bị di động. Xét về
chức năng thì loại file này cũng tương tự như file .exe trên Windows. Phần đuôi mở rộng
của file APK là .apk. Ngoài việc tải trực tiếp ứng dụng từ cửa hàng ứng dụng chính thức
Google Play Store, hệ điều hành Android cũng cho phép người dùng cài ứng dụng bên
ngồi bằng cách cài đặt thủ cơng file APK. Đối với người dùng chỉ tải ứng dụng từ
Google Play Store thì thường khơng nhận ra file cài đặt APK này do việc cài đặt ứng
dụng đã được Android thực hiện trong nền.
Về bản chất, file APK là một loại file nén, tương tự như định dạng .zip. Chính
xác hơn thì file APK là một tệp JAR đặc biệt, các tệp JAR thực chất lại là một file nén
.zip nên tóm lại, APK cũng là một file nén. Ta hồn tồn có thể đổi phần đi mở rộng
của file APK từ .apk thành .zip rồi giải nén như bất kì file .zip nào khác để xem nó bao
gồm những gì. Ta cũng hồn tồn có thể đọc nội dung file APK trực tiếp không cần giải
nén thông qua Android Studio - một IDE chính thức của Google dùng để phát triển ứng
dụng cho hệ điều hành Android.

Hình 1.1: Ví dụ về cấu tạo của một file APK.
Một file APK thường bao gồm các thành phần sau đây:

- assests: Thư mục này lưu trữ các tài nguyên mà ứng dụng sử dụng. Ví dụ: các
file ảnh hoặc video, file HTML, file JSON/XML, file font chữ, … Hơn nữa, một số
2


framework cũng sử dụng thư mục này để lưu trữ cả code và dữ liệu, có thể kể đến các
ứng dụng Cordova và React-native lưu trữ các đoạn code JavaScript trong thư mục này,
các ứng dụng Xamarin lưu trữ các file DLL trong thư mục Assemblies, …

Hình 1.2: Ví dụ về thư mục assets.
- resources.arsc: bao gồm các tài nguyên được biên dịch trước, bao gồm String,
layout, … Các giá trị như String, Int, Array, … có thể thấy được trực tiếp giá trị.
- res: thư mục này cũng chứa các tài nguyên của ứng dụng nhưng là những tài
nguyên không được biên dịch thành resources.arsc, được phân cấp thành các thư mục
bé hơn như res/layout, res/drawable, res/font, res/xml, … Thư mục này được giữ nguyên
như thư mục res trong project khi code, ngoại trừ res/value được bỏ đi.
- META-INF: thư mục này chứa các thông tin dùng để xác minh thơng tin của
file APK, nó thường được tạo ra trong quá trình ký file APK. Ký file APK là quá trình
tạo ra “dấu vân tay” riêng biệt cho file APK đó, q trình này nhằm đảm bảo có thể phát
hiện ra bất kì thay đổi nào với file APK đó. Nếu có một thay đổi được thực hiện nhưng
chữ ký của file APK đó khơng được cập nhật thì hệ điều hành sẽ từ chối cho phép cài
đặt ứng dụng. Thư mục này thường bao gồm 3 file:

3


• MANIFEST.MF: là tệp văn bản được dùng để xác minh nội dung file APK. Nó
chứa tên của tất cả tệp trong file APK và mã băm SHA-256 hoặc SHA-1 tương
ứng, nhằm xác minh tính hợp lệ của từng tệp con trong file APK, phục vụ việc
phát hiện sự thay đổi của file APK như đã nói ở trên. Hơn nữa, nó cũng có thể

chứa nhiều thơng tin được sử dụng bởi Java run-time khi load file JAR như các
class chính để chạy file JAR, phiên bản của package, số bản dựng, người tạo
package, các chính sách bảo mật và quyền của ứng dụng, … File này có lưu ý về
định dạng đó là chỉ cho phép tối đa 70 kí tự/dịng.

Hình 1.3: Ví dụ về nội dung file MANIFEST.MF và quy tắc định dạng
tối đa 70 kí tự/dịng.
• CERT.SF (hoặc *.SF): nhằm xác minh file MANIFEST.MF ở trên. Ở đầu file này
chứa thông tin về mã băm cho file MANIFEST.MF và phiên bản ký file APK
được dùng (V1, V2 hoặc V3). Tiếp đó, nó cũng chứa danh sách tên tất cả các tệp
4


trong file APK cùng các giá trị băm SHA-1 hoặc SHA-256 của chúng, tương tự
như file MANIFEST.MF ở trên. Tuy nhiên giá trị băm ở file này được sinh theo
cách sau: lấy từng mục ở file MANIFEST.MF (bao gồm tên file và mã băm), thay
dấu xuống dòng bởi “\r\n” rồi tính giá trị băm dựa trên chuỗi này. File này vẫn
tn thủ định dạng tối đa 70 ký tự/dịng.

Hình 1.4: Ví dụ về nội dung file CERT.SF.
• CERT.RSA (hoặc *.RSA, đơi khi cũng có thể là *.DSA): chứa các thơng tin đã
được ký của tệp CERT.SF cùng thông tin chứng chỉ X.509 với khóa cơng khai đã
được dùng để ký, nó bao gồm thơng tin của chứng chỉ như tổ chức phát hành, số
series, thời gian khả dụng, ...
- AndroidManifest.xml: đây là file bắt buộc phải có trong các ứng dụng Android,
được dùng để mô tả các thông tin cần thiết của ứng dụng. File này chứa các thông tin
như tên gói ứng dụng, các quyền truy cập mà ứng dụng cần để truy cập các thành phần
5



được bảo vệ của hệ thống hoặc của ứng dụng khác, các quyền mà ứng dụng khác phải
có nếu muốn truy cập thơng tin từ ứng dụng này, các tính năng phần cứng và phần mềm
mà ứng dụng yêu cầu như phiên bản Android tối thiểu/tối đa hỗ trợ, các thiết bị được hỗ
trợ, tất cả các phần tử trong ứng dụng như activity, fragment, services, broadcast
receivers, …

Hình 1.5: Ví dụ về một file AndroidManifest.xml.
- classes.dex: DEX (viết tắt của Dalvik Executable) là định dạng độc quyền của
Google cho phiên bản máy ảo Java VM của họ. File này chứa tất cả mã Java/Kotlin/…
được biên dịch theo mã Bytecode đặc biệt của Google có tên là mã Dalvik - mã sẽ được
thực thi thật sự trên thiết bị Android. File DEX giới hạn tổng số method tối đa trong một
tệp .dex là 65.536 (64K, 1K biểu thị 210 = 1024), số method này bao gồm cả method của
framework Android, method của thư viện, method trong mã nguồn của người lập trình.
Việc chỉ sử dụng ngơn ngữ lập trình Kotlin chiếm từ 7 - 11K method, nếu có sử dụng
Firebase có thể làm tăng thêm 4.5K method, nếu sử dụng AndroidX sẽ làm tăng thêm
16 - 25K method, … Số lượng method của thư viện gốc viết dưới dạng C/C++ sẽ không
6


được tính vào tổng method. Nếu số lượng method vượt quá giới hạn, project sẽ được
chia thành nhiều file .dex. Trên thực tế, 1 file APK có thể bao gồm nhiều file DEX và
sẽ được đánh tên là classes.dex, classes2.dex, classes3.dex , …
- lib: thư mục chứa các thư viện gốc mà ứng dụng sử dụng, được biên dịch từ
code C/C++ thành dạng mã máy phụ thuộc vào nền tảng. Do Android là hệ điều hành
đa nền tảng nên thư mục này sẽ được chia thành các thư mục con là các nền tảng được
hỗ trợ, có thể là: armabi, x86, x86_64, mips, …
Ngồi các thành phần chính nói trên, file APK có thể bao gồm nhiều thành phần
khác như thư mục kotlin nếu dùng ngơn ngữ lập trình Kotlin, …

1.2. Quá trình xử lý tạo file APK.

Quá trình tạo ra file APK cuối cùng để cài đặt và phân phối trải qua rất nhiều
bước, nhìn chung cũng khá phức tạp. Tổng quan quá trình xử lý để tạo file APK theo
Google [1] được thể hiện như hình dưới đây:

Hình 1.6: Q trình đóng gói để tạo file APK.
7


Cụ thể, các bước của quá trình này như sau:
+ Bước 1: Mã nguồn được viết bằng Java/Kotlin/… được biên dịch thành các
file .class (hay còn gọi là Java Bytecode) bởi trình biên dịch Java hoặc Kotlin. Một số
dependencies của ứng dụng đã được biên dịch sẵn nên không cần thực hiện bước này.
Nhìn vào hình 1.6 ta có thể thấy các dependencies của ứng dụng bao gồm:
• Library Module: các module thư viện, nơi chứa các class Java hoặc Kotlin,
Android components, các tài nguyên ứng dụng.
• AAR Libraries: các thư viện Android được biên dịch thành file AAR (Android
Archive), file này có thể được sử dụng như một dependency cho module của ứng
dụng Android. File AAR chứa file manifest và các tài nguyên Android như
layout, drawable, …
• JAR Libraries: đây là các thư viện Java như thông thường trong các project Java.
+ Bước 2: Tất cả các mã Java Bytecode và các dependencies được biên dịch
thành Dalvik Bytecode, chính là các file DEX. Số lượng file DEX phụ thuộc vào số
lượng method như đã nói trong phần trên. Những file DEX này chính là những code sẽ
chạy thực sự trên thiết bị Android chứ không phải là những code Java hay Kotlin ta viết
trong project.
+ Bước 3: Bước này được chia thành 2 giai đoạn đó là giai đoạn biên dịch và giai
đoạn liên kết. Mục đích của việc chia thành 2 giai đoạn là nhằm nâng cao hiệu suất, vì
khi một tệp bị sửa đổi thì ta chỉ cần biên dịch lại duy nhất tệp đó, tránh việc sửa một tệp
phải biên dịch lại toàn bộ project.
Trước tiên, ở giai đoạn biên dịch, các tài nguyên ứng dụng sẽ được biên dịch bởi

AAPT2 (Android Asset Packaging Tool). AAPT2 sẽ xử lý tất cả các tài nguyên ứng
dụng thành định dạng nhị phân để tối ưu hóa cho việc sử dụng, có phần đi mở rộng là
.flat. Các tài nguyên được biên dịch có thể là thư mục res, thư mục assets, file
resources.arsc, file manifest của ứng dụng, …
Ở giai đoạn liên kết, các tệp trung gian được tạo ra trong giai đoạn biên dịch phía
trên sẽ được hợp nhất lại thành một file APK duy nhất. Nghĩa là đầu ra của bước 3 này
sẽ là một file APK duy nhất với tất cả tài nguyên đã được biên dịch nhưng sẽ vẫn chưa
có các đoạn code. Đến đây tuy đã có file APK nhưng file này chưa thể thực thi ngay
8


được trên các thiết bị Android vì nó chưa bao gồm các tệp DEX và cũng chưa thực hiện
quá trình ký.
+ Bước 4: Tất cả các file DEX được tạo ra ở bước 2 cùng các thư viện gốc được
viết dưới dạng C/C++ sẽ được đóng gói kèm vào file APK nói trên. Tới đây, file APK
của ứng dụng về cơ bản đã hoàn chỉnh, tuy nhiên vẫn chưa thể cài đặt để thực thi trên
các thiết bị Android.
File APK nói trên sẽ trải qua tiếp 2 bước nữa là tối ưu hóa bằng zipalign và ký.
Thứ tự của 2 bước này phụ thuộc vào công cụ được dùng để ký file APK. Nếu công cụ
ký được sử dụng là apksigner thì việc tối ưu hóa bằng zipalign phải được thực hiện trước
khi tệp APK được ký, do khi sử dụng apksigner thì nếu có một thay đổi được thực hiện
với APK thì chữ ký sẽ bị vơ hiệu hóa. Nếu sử dụng jarsigner để ký file APK thì việc tối
ưu hóa bởi zipalign chỉ có thể được thực sau khi ký file APK.
Giả sử, ta ký tệp APK bằng cơng cụ apksigner, q trình xử lý để tạo ra tệp APK
cuối cùng được thực hiện tiếp như sau:
+ Bước 5: tệp APK được tối ưu hóa thơng qua zipalign. Zipalign [2] là một công
cụ căn chỉnh tệp nén zip, nó đảm bảo tất cả các file khơng nén trong file APK được căn
chỉnh sao cho liên quan đến phần bắt đầu của file APK. Cụ thể, các tệp không nén như
ảnh hay file raw sẽ được căn chỉnh theo ranh giới 4 byte. Điều này giúp cho Android có
thể đọc file APK một cách trực tiếp, dễ dàng thông qua nmap() mà không cần phải giải

nén file APK ra. Việc này giúp cải thiện hiệu suất, giảm lượng RAM khi chạy nếu phải
truy cập các dữ liệu nhị phân lớn như hình ảnh.
+ Bước 6: File APK được ký điện tử bởi các chứng chỉ. Việc ký APK sử dụng
mã hóa khóa cơng khai, nó thực chất là q trình mã hóa tồn bộ các thơng tin trong file
APK bằng khóa bí mật chỉ có ta mới biết. Ký file APK giúp cho các nhà phát triển ứng
dụng ngăn chặn ai đó giả mạo ứng dụng của họ, khẳng định ứng dụng là họ. Khóa cơng
khai của bạn được công khai rộng rãi nên các cửa hàng ứng dụng và người dùng có thể
giải mã ứng dụng của bạn, từ đó biết chắc chắn ứng dụng là thật hay giả mạo. Khi cài
đặt ứng dụng từ Google Play Store thì chính Google Play Store đã thực hiện việc này
giúp người dùng.
Việc ký file APK có thể được thực hiện thông qua nhiều công cụ, tuy nhiên các
9


công cụ thường được sử dụng là jarsigner và apksigner. Jarsigner là một công cụ dùng
để ký, xác minh chữ ký và tính tồn vẹn của các file JAR, nó có sẵn ngay trong JDK của
Java. Như đã nói trước đó, APK là một loại file JAR, do đó nó hồn tồn có thể ký bởi
jarsigner. Cịn về apksigner, đây là cơng cụ có sẵn trong Android SDK phiên bản 24.0.3
trở đi, cũng nhằm mục đích ký và xác nhận chữ ký của file APK. Đặc biệt, apksigner
cho phép ký đè lên chữ ký đã có trước đó của file APK một cách nhanh chóng.
Sau khi hồn thành 6 bước nói trên, ta thu được một file APK duy nhất, sẵn sàng
để cài đặt thử nghiệm, phân phối hoặc phát hành cho người dùng cuối. Người dùng cuối
có thể sử dụng file này để cài đặt và chạy trên các thiết bị Android.

10


CHƯƠNG 2: TÌM HIỂU VỀ APKTOOL.

2.1. Giới thiệu.

Apktool [3] là một cơng cụ dịch ngược mạnh mẽ với nhiều tính năng hữu ích để
làm việc với file APK, như decompile file APK, build file APK, debug code smali, ...
Các tính năng này sẽ được trình bày rõ ở phần sau. Apktool được cấp phép theo giấy
phép Apache License 2.0. Do việc sử dụng Apache Lisence 2.0 nên bất kỳ ai cũng có
thể tích hợp nó vào dự án của mình hoặc tùy chỉnh mã nguồn của nó một cách tùy ý mà
khơng cần xin phép tác giả. Mục đích chính của Apktool là hỗ trợ việc thêm tính năng
hoặc hỗ trợ tùy chỉnh, phân tích ứng dụng.
Apktool được tạo ra bởi Ryszard Wiśniewski. Hiện tại, người đảm nhiệm việc bảo
trì và thường xuyên cập nhật nó là Connor Tumbleson - hiện đang là một kỹ sư phần
mềm chính của Sourcetoad LLC, đây là một công ty lớn chuyên cung cấp các giải pháp
phần mềm cho doanh nghiệp. Một số đối tác lớn của cơng ty này có thể kể đến là Oracle,
Samsung, LG, … Kể từ ngày 07/01/2017 đến nay, Sourcetoad LLC cũng chính là doanh
nghiệp tài trợ để Apktool có thể tiếp tục duy trì và phát triển.
Apktool là một tập hợp của 1 dự án, chứa các dự án con và một số dependencies.


nguồn

của

Apktool

hiện

đang

được

cơng


khai

tại

địa

chỉ

Người dùng cũng có thể xem chi tiết cách build
mã nguồn này tại />
2.2. Chức năng.
Apktool là một công cụ mạnh mẽ cho phép dịch ngược các tệp nhị phân APK đã
được đóng gói hồn chỉnh - chính là file APK được xuất ra sau khi thực hiện 6 bước của
phần 1.2. Các tệp APK có thể được giải mã về dạng như gần giống như ban đầu, nghĩa
là từ tệp APK có thể quay lại được các thành phần như file AndroidManifest.xml, các
file mã nguồn, … Ngồi ra, Apktool cũng cho phép đóng gói các thành phần của file
APK ở dạng đã giải mã, chính là sau khi chỉnh sửa thành một file nhị phân APK hoặc
JAR. Đây là 2 tính năng hữu ích nhất của Apktool, nhờ 2 tính năng này mà ta hồn tồn
có thể dịch ngược file APK đã có rồi tiến hành chỉnh sửa, rồi build ngược lại thành file
APK mới.
11


Như đã nói ở phần trước, file APK thực chất chính là một file ZIP và ta hồn tồn
có thể giải nén file APK như các tệp nén khác bằng cách đổi phần mở rộng của tên thành
.zip và dùng công cụ giải nén để giải nén. Vậy câu hỏi được đặt ra là tại sao không giải
nén file APK để dịch ngược lại thành các thành phần ban đầu mà cần phải sử dụng
Apktool? Lý do cho việc này là vì file APK cuối cùng được xuất ra trong quy trình xử
lý file APK đã nói ở phần 1.2 là một file nhị phân, do đó, nếu ta chỉ đơn giản là giải nén
thì hồn tồn khơng thể đọc được nội dung bên trong của các tệp. Nhờ vậy cần sử dụng

Apktool để có thể giải mã tệp nhị phân này, từ đó có thể đọc và hiểu được.

Hình 2.1: Nội dung file AndroidManifest.xml nếu mở bằng cách giải nén file APK.

12


Hình 2.2: Nội dung file AndroidManifest.xml nếu được dịch ngược bằng Apktool.
Hơn nữa, Apktool cũng cho phép xây dựng và xử lý các file APK phụ thuộc vào
framework bên ngoài. Thông thường, các ứng dụng Android sử dụng tài nguyên và mã
có sẵn ngay trong chính hệ điều hành Android được gọi là framework resouces, do đó
Apktool có thể dựa vào những tài nguyên này để giải mã và xây dựng các file APK một
cách chính xác. Các bản Apktool luôn bao gồm AOSP framework mới nhất tại thời điểm
phát hành. AOSP là viết tắt của Android Open Source Project, đây là một dự án mã
nguồn mở dành cho thiết bị di động và được quản lý bởi Google [4]. Nó cung cấp các
mã nguồn cần thiết để tạo nên hệ điều hành Android, từ mã nguồn này mà mọi người có
thể tự do tùy chỉnh hệ điều hành Android. Bất kì ai cũng đều có thể đóng góp vào dự án
mã nguồn mở này để giúp Android ngày càng tốt hơn, những đóng góp này sau đó sẽ
được xem xét bởi Google. Các nhà sản xuất thường không chỉ sử dụng framework cơ
bản AOSP này mà thường kèm theo một số file framework của riêng họ để tùy biến. Do
đó, nếu các file APK này được giải mã theo cách thông thường sẽ xuất hiện lỗi do thiếu
framework. Apktool cho phép cài đặt các framework này và giải mã các file APK phụ
thuộc vào framework bên ngoài một cách bình thường.
Debug code smali cũng được Apktool hỗ trợ thơng qua SmaliDebugging. Tuy
nhiên, SmaliDebugging đã bị ngưng hỗ trợ kể từ v2.0.3 và chính thức bị xóa kể từ phiên
13


bản v.2.1.0. Thay vào đó, tính năng debug code smali được tách riêng ra thành một cơng
cụ riêng biệt có tên là SmaliIdea và khơng cịn nằm trong Apktool. Các tệp APK có chứa

các file .dex là các file chứa mã Dalvik Bytecode. Đây là định dạng mà máy tính hiểu
và làm việc, tuy nhiên con người khó có thể hiểu và thực hiện sửa đổi trên loại mã này.
Vì vậy, mã Dalvik Bytecode thường được chuyển đổi thành những định dạng khác để
con người có thể dễ dàng làm việc hơn. Một trong số những định dạng đó là smali, một
định dạng được xây dựng bởi Google. Apktool hỗ trợ debug loại định dạng này để có
thể dễ dàng xây dựng và sửa lỗi.
2.3. Quá trình phát triển qua các phiên bản.
Kể từ khi ra mắt phiên bản đầu tiên v0.9.0 ngày 01/3/2010 bởi Ryszard
Wiśniewski đến hiện tại, Apktool đã trải qua nhiều phiên bản với nhiều tính năng được
cập nhật và sửa đổi bởi sự giúp đỡ của các cộng tác viên. Gần 2 năm sau ngày ra mắt,
ngày 07/12/2011, Apktool chính thức đạt mốc 1000 người dùng. Khơng lâu sau đó, cơng
cụ này đạt số lượng người dùng gấp 3 là 3000 người vào ngày 16/3/2015 [3].
Phiên bản có sự thay đổi lớn nhất và đột phá của Apktool là phiên bản v2.0.0 ra
mắt chính thức ngày 21/4/2015, sau gần 2 năm kể từ ngày ra mắt bản beta. Cũng kể từ
phiên bản này, mỗi phiên bản cập nhật của Apktool đều đem đến rất nhiều sự thay đổi
mới. v2.0.0 yêu cầu phiên bản tối thiểu của Java là 1.7 (Java 7) và chính thức hỗ trợ cả
Android 5.1, phiên bản này cũng thay đổi về các câu lệnh được dùng. Việc chuyển đổi
từ các phiên bản trước đó sang phiên bản v.2.0.0 cũng yêu cầu người dùng phải thực
hiện nhiều thao tác. Lý do của việc này là v.2.0.0 sử dụng FileSystems của NIO2 cùng
với FileWalker, những phiên bản trước đó (v.1.5.2 trở về) sử dụng Java 6 nên khơng thể
tương thích với việc này. Phiên bản này được nghiên cứu và phát triển trong gần một
năm trước khi cho ra mắt bản beta đầu tiên, nó cũng đánh dấu sự trở lại của tác giả ban
đầu của nó - Ryszard Wiśniewski để khắc phục một số lỗi đã tồn tại lâu nay.
Một số tính năng mới của v2.0.0 có thể kể đến như AAPT được tích hợp ngay
trong tool, thay đổi cách sử dụng tham số input/output trong các câu lệnh, hỗ trợ debug
smali, hỗ trợ smali 2.0, … Cụ thể về những thay đổi trong v.2.0.0 của Apktool được thể
hiện trong hình dưới đây:

14



15


Hình 2.3: Tất cả những thay đổi trên phiên bản v.2.0.0 của Apktool.
Apktool luôn được cập nhật sau khi các phiên bản Android mới ra mắt nhằm đem
đến sự hỗ trợ kịp thời cho người dùng. Phiên bản của Apktool tính tới thời điểm hiện tại
là v2.6.0, được ra mắt ngày 02/09/2021. Phiên bản này hỗ trợ Android mới nhất là
Android 12 và đem đến một loạt bản nâng cấp của các thành phần bên trong tool. v.2.6.0
cũng đem đến những tính năng mới, những sự thay đổi và lược bỏ các thành phần để
tăng hiệu quả.

16


CHƯƠNG 3: HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG APKTOOL TRÊN
HỆ ĐIỀU HÀNH KALI LINUX.

3.1. Hướng dẫn cài đặt.
Apktool hiện khả dụng trên cả Linux, Windows và MacOS. Tuy nhiên, trong
khuôn khổ bài báo cáo này, em xin phép được thực hiện cài đặt và thực hành sử dụng
trên hệ điều hành Kali Linux.
Apktool yêu cầu tối thiểu là Java 8, kiểm tra máy có cài Java 8 trở lên không bằng
cách gõ java -version trong terminal, nếu kết quả trả về 1.8 hoặc lớn hơn nghĩa là đủ
điều kiện sử dụng Apktool. Nếu khơng, người dùng có thể thực hiện cài đặt Java 8 theo
hướng dẫn chính thức của Oracle.
Có 2 cách để thực hiện cài đặt Apktool trên Kali Linux: thực hiện tự động thơng
qua trình quản lý tool của Kali và thực hiện thủ công. Người dùng có thể lựa chọn cách
cài theo nhu cầu cá nhân. Nhưng nhìn chung, dù cài đặt theo cách nào thì việc cài đặt
Apktool trên hệ điều hành Kali Linux vẫn khá dễ dàng.

Thực hiện tự động qua bộ quản lý tool của Kali Linux.
Người dùng chỉ cần thực hiện lần lượt 2 câu lệnh sau trên terminal:
sudo apt-get update
sudo apt install -y apktool

Hình 3.1: Thực hiện cài Apktool trên Kali Linux.
17


Kiểm tra Apktool được thực hiện thành công hay chưa bằng cách gõ apktool
trong terminal, nếu kết quả trả về như ảnh dưới đây nghĩa là đã cài đặt thành cơng:

Hình 3.2: Cài đặt thành cơng Apktool theo cách 1.
Cách này có ưu điểm là thực hiện khá nhanh chóng và rất dễ dàng, không cần
thao tác nhiều. Nhược điểm của cách cài đặt này là phiên bản được cài đặt phụ thuộc
vào bộ quản lý tool của Kali Linux, người dùng không thể tự quyết định phiên bản sẽ sử
dụng. Nhìn vào hình ta thấy, phiên bản Apktool được cài đặt là phiên bản v.2.5.0-dirty,
đây là một phiên bản được tùy biến bởi Kali Linux dựa trên v2.5.0 chính thức, tuy nhiên,
trên trang chủ Apktool thì phiên bản mới nhất đã là v.2.6.0. Do đó, nếu thực hiện theo
cách này thì ta khơng thể dùng phiên bản mới nhất. Hoặc nhiều trường hợp khác, người
dùng cũng muốn cài một phiên bản cũ hơn bất kì. Để khắc phục điều này, ta có thể sử
dụng cách 2 sau đây.
Thực hiện thủ cơng.
Sử dụng cách này, người dùng sẽ có thể lựa chọn phiên bản bất kì để sử dụng. Ta
có thể dùng phiên bản mới nhất của Apktool ngay sau khi nó được phát hành, khơng cần
18


chờ đợi vào bộ quản lý tool của Kali Linux cập nhật. Để cài đặt, người dùng lần lượt
thực hiện các bước sau:

+ Bước 1: Tải Linux Wrapper Script.
Truy cập địa chỉ:
/>Nhấn chuột phải, chọn Save page as và đặt tên là apktool.
+ Bước 2: Tải Apktool.
Truy cập địa chỉ: lựa
chọn phiên bản Apktool muốn dùng để tải về. Người dùng có thể tùy ý lựa chọn phiên
bản muốn sử dụng, không bị ép buộc giống cách 1. Ở đây, em xin phép tải phiên bản
Apktool mới nhất là v.2.6.0.

Hình 3.3: Giao diện trang download Apktool.
Sau khi tải về hoàn tất, đổi tên file mới tải về thành apktool.jar
+ Bước 3:
Di chuyển file apktool và apktool.jar mới tải về ở bước 1 và bước 2 vào thư mục
/usr/local/bin (chú ý thư mục này yêu cầu quyền root để có thể truy cập).

19


×