1. Trang chủ
  2. » Kỹ Năng Mềm

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

55 16 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 55
Dung lượng 4,82 MB

Cấu trúc

  • CHƯƠNG 1: GIỚI THIỆU VỀ FILE APK CỦA HỆ ĐIỀU HÀNH ANDROID (8)
    • 1.1. Cấu trúc file APK (8)
    • 1.2. Quá trình xử lý tạo file APK (13)
  • CHƯƠNG 2: TÌM HIỂU VỀ APKTOOL (17)
    • 2.1. Giới thiệu (17)
    • 2.2. Chức năng (17)
    • 2.3. Quá trình phát triển qua các phiên bản (20)
  • CHƯƠNG 3: HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG APKTOOL TRÊN HỆ ĐIỀU HÀNH KALI LINUX (23)
    • 3.1. Hướng dẫn cài đặt (23)
    • 3.2. Hướng dẫn sử dụng (27)
  • CHƯƠNG 4: MỘT SỐ LAB VỀ SỬ DỤNG APKTOOL (37)
    • 4.1. Sử dụng Apktool để crack ứng dụng trả phí (37)
    • 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 (45)

Nội dung

GIỚI THIỆU VỀ FILE APK CỦA HỆ ĐIỀU HÀNH ANDROID

Cấu trúc file APK

APK, viết tắt của Android Package Kit, là định dạng file chính thức mà hệ điều hành Android sử dụng để phân phối và cài đặt ứng dụng trên thiết bị di động Tương tự như file exe trên Windows, file APK có đuôi mở rộng apk Ngoài việc tải ứng dụng từ Google Play Store, Android cho phép người dùng cài đặt ứng dụng bên ngoài thông qua file APK Người dùng chỉ tải ứng dụng từ Google Play thường không nhận ra file cài đặt này vì quá trình cài đặt diễn ra tự động trong nền.

File APK thực chất là một loại tệp nén, tương tự như định dạng zip Cụ thể hơn, file APK là một tệp JAR đặc biệt, trong khi các tệp JAR lại là các file nén.

APK thực chất là một file nén, và bạn có thể đổi đuôi mở rộng từ apk sang zip để giải nén và xem nội dung bên trong Ngoài ra, bạn cũng có thể đọc trực tiếp nội dung của file APK mà không cần giải nén thông qua Android Studio, một IDE chính thức của Google dành cho phát triển ứng dụng 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:

Thư mục assets chứa các tài nguyên cần thiết cho ứng dụng, bao gồm hình ảnh, video, tệp HTML, tệp JSON/XML và font chữ.

Three frameworks utilize this directory to store both code and data Notably, Cordova and React Native save their JavaScript code in this directory, while Xamarin applications store DLL files in the Assemblies folder.

Hình 1.2: Ví dụ về thư mục assets

Tài nguyên trong file resources.arsc bao gồm các thành phần đã được biên dịch trước, như String, layout, và nhiều loại giá trị khác Các giá trị này có thể là String, Int, Array, và có thể được truy cập trực tiếp để sử dụng trong ứng dụng.

Thư mục res chứa các tài nguyên của ứng dụng nhưng không được biên dịch thành resources.arsc, được tổ chức thành các thư mục con như res/layout, res/drawable, res/font, và res/xml Trong quá trình lập trình, thư mục này vẫn được giữ nguyên như trong dự án, ngoại trừ thư mục res/value đã bị loại bỏ.

Thư mục META-INF chứa thông tin cần thiết để xác minh file APK, thường được tạo ra trong quá trình ký file APK Ký file APK tạo ra "dấu vân tay" riêng biệt, giúp phát hiện bất kỳ thay đổi nào đối với file APK Nếu có sự thay đổi nhưng chữ ký không được cập nhật, hệ điều hành sẽ từ chối cài đặt ứng dụng Thư mục này thường bao gồm ba file.

Tệp MANIFEST.MF là một văn bản quan trọng dùng để xác minh nội dung của file APK, chứa tên tất cả các tệp và mã băm SHA-256 hoặc SHA-1 tương ứng để đảm bảo tính hợp lệ của từng tệp con Nó giúp phát hiện sự thay đổi trong file APK và có thể chứa thông tin cần thiết cho Java run-time khi tải file JAR, bao gồm các class chính, phiên bản package, số bản dựng, người tạo package, cùng các chính sách bảo mật và quyền của ứng dụng Đặc biệt, tệp này yêu cầu định dạng với tối đa 70 ký tự mỗi 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) được sử dụng để xác minh file MANIFEST.MF, trong đó chứa thông tin về mã băm và phiên bản ký của file APK (V1, V2 hoặc V3) Ngoài ra, file này còn liệt kê tên tất cả các tệp có trong gói APK.

Trong file APK, có 5 giá trị băm SHA-1 hoặc SHA-256 tương tự như file MANIFEST.MF Giá trị băm trong file này được tạo ra bằng cách lấy từng mục từ file MANIFEST.MF, bao gồm tên file và mã băm, sau đó thay dấu xuống dòng bằng “\r\n” và tính toán giá trị băm dựa trên chuỗi này File này cũng tuân thủ định dạng tối đa 70 ký tự mỗi dòng.

Hình 1.4: Ví dụ về nội dung file CERT.SF

CERT.RSA (hoặc *.RSA, đôi khi là *.DSA) chứa thông tin đã được ký từ tệp CERT.SF cùng với chứng chỉ X.509, bao gồm khóa công khai được sử dụng để ký Tệp này cung cấp các thông tin quan trọng về chứng chỉ, chẳng hạn như tổ chức phát hành, số series và thời gian khả dụng.

AndroidManifest.xml là một tệp không thể thiếu trong các ứng dụng Android, đóng vai trò quan trọng trong việc mô tả thông tin cần thiết của ứng dụng Tệp này bao gồm các thông tin như tên gói ứng dụng và các quyền truy cập mà ứng dụng yêu cầu để tương tác với các thành phần khác.

Hệ thống và ứng dụng khác cần tuân thủ 6 điều kiện bảo vệ để truy cập thông tin, bao gồm quyền truy cập cần thiết, tính năng phần cứng và phần mềm yêu cầu như phiên bản Android tối thiểu hoặc tối đa, cũng như danh sách các thiết bị được hỗ trợ Tất cả các thành phần trong ứng dụng như activity, fragment, services và broadcast receivers cũng cần được xác định rõ ràng.

Hình 1.5: Ví dụ về một file AndroidManifest.xml

File classes.dex, viết tắt của Dalvik Executable, là định dạng độc quyền của Google cho máy ảo Java VM, chứa mã Java/Kotlin được biên dịch thành mã Bytecode đặc biệt gọi là mã Dalvik, được thực thi trên thiết bị Android Mỗi tệp dex giới hạn tối đa 65.536 phương thức, bao gồm cả phương thức từ framework Android, thư viện và mã nguồn của lập trình viên Việc sử dụng ngôn ngữ lập trình Kotlin có thể chiếm từ 7.000 đến 11.000 phương thức, trong khi việc tích hợp Firebase có thể tăng thêm 4.500 phương thức, và sử dụng AndroidX cũng sẽ làm tăng số lượng phương thức này.

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

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

Quá trình tạo file APK để cài đặt và phân phối bao gồm nhiều bước phức tạp Tổng quan về quy trình này được Google mô tả rõ ràng, thể hiện qua hình ảnh dưới đây.

Hình 1.6: Quá trình đóng gói để tạo file APK

Cụ thể, các bước của quá trình này như sau:

Mã nguồn được viết bằng Java hoặc Kotlin sẽ được biên dịch thành các file class (Java Bytecode) thông qua 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, do đó không cần thực hiện bước biên dịch này Hình 1.6 minh họa các dependencies của ứng dụng.

• 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 are Android libraries compiled into AAR (Android Archive) files, which can be utilized as dependencies for Android application modules These AAR files include essential components such as the manifest file and various Android resources, including layouts and drawables.

• 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ả mã Java Bytecode và các dependencies sẽ được biên dịch thành Dalvik Bytecode, tạo ra các file DEX Số lượng file DEX phụ thuộc vào số lượng phương thức trong dự án Những file DEX này là mã thực thi trên thiết bị Android, không phải là mã Java hay Kotlin mà chúng ta viết trong dự án.

Bước 3 của quy trình phát triển phần mềm được chia thành hai giai đoạn chính: biên dịch và liên kết Việc phân chia này nhằm nâng cao hiệu suất, cho phép chỉ biên dịch lại tệp đã sửa đổi mà không cần phải biên dịch toàn bộ dự án, tiết kiệm thời gian và tài nguyên.

Trong giai đoạn biên dịch, AAPT2 (Android Asset Packaging Tool) sẽ biên dịch tất cả các tài nguyên ứng dụng thành định dạng nhị phân, nhằm tối ưu hóa việc sử dụng.

Tài nguyên được biên dịch trong quá trình phát triển ứng dụng bao gồm thư mục res, thư mục assets, file resources.arsc và file manifest Trong giai đoạn liên kết, các tệp trung gian từ bước biên dịch sẽ được hợp nhất thành một file APK duy nhất, chứa tất cả tài nguyên đã được biên dịch Tuy nhiên, file APK này vẫn chưa có mã code và chưa thể thực thi ngay lập tức.

9 đượ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ý

Tất cả các file DEX được tạo ra cùng với các thư viện gốc viết bằng C/C++ sẽ được đóng gói vào file APK Mặc dù file APK của ứng dụng đã gần hoàn chỉnh, nhưng vẫn chưa thể cài đặt và thực thi trên các thiết bị Android.

File APK cần trải qua hai bước quan trọng là tối ưu hóa bằng zipalign và ký Thứ tự thực hiện hai bước này phụ thuộc vào công cụ ký được sử dụng Nếu sử dụng apksigner, zipalign phải được thực hiện trước khi ký, vì bất kỳ thay đổi nào trên APK sẽ làm vô hiệu hóa chữ ký Ngược lại, nếu sử dụng jarsigner để ký file APK, zipalign chỉ có thể thực hiện sau khi APK đã được ký.

Giả sử, ta ký tệp APK bằng công cụ apksigner, quá 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 trong quá trình tối ưu hóa tệp APK là sử dụng công cụ zipalign để căn chỉnh các tệp không nén Zipalign đảm bảo rằng tất cả các tệp không nén, như hình ảnh và file raw, được căn chỉnh theo ranh giới 4 byte liên quan đến phần bắt đầu của file APK Việc này giúp Android có thể đọc tệp APK một cách trực tiếp và dễ dàng thông qua nmap(), mà không cần giải nén, từ đó cải thiện hiệu suất và giảm lượng RAM cần thiết khi truy cập các dữ liệu nhị phân lớn.

Bước 6: File APK được ký điện tử bằng các chứng chỉ, sử dụng mã hóa khóa công khai để bảo vệ thông tin bên trong Quá trình này ngăn chặn việc giả mạo ứng dụng, khẳng định quyền sở hữu của nhà phát triển Khóa công khai của bạn được công khai để các cửa hàng ứng dụng và người dùng có thể xác minh tính xác thực của ứng dụng Khi cài đặt từ Google Play Store, quá trình xác thực này được thực hiện tự động để đảm bảo ứng dụng là thật.

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

Trong quá trình ký và xác minh chữ ký cho file APK, hai công cụ phổ biến thường được sử dụng là jarsigner và apksigner Jarsigner, có sẵn trong JDK của Java, được thiết kế để ký và kiểm tra tính toàn vẹn của các file JAR, trong khi apksigner, có mặt từ Android SDK phiên bản 24.0.3 trở đi, cũng phục vụ mục đích tương tự nhưng dành riêng cho file APK Đặc biệt, apksigner cho phép người dùng ký đè lên chữ ký đã có trước đó của file APK một cách nhanh chóng và hiệu quả.

Sau khi hoàn tất 6 bước trên, bạn sẽ có một file APK duy nhất, sẵn sàng cho việc cài đặt thử nghiệm, phân phối hoặc phát hành đến người dùng cuối File APK này cho phép người dùng cài đặt và chạy ứng dụng trên các thiết bị Android.

TÌM HIỂU VỀ APKTOOL

Giới thiệu

Apktool là một công cụ dịch ngược mạnh mẽ, cho phép người dùng decompile, build file APK và debug code smali Với giấy phép Apache License 2.0, Apktool cho phép mọi người tích hợp và tùy chỉnh mã nguồn mà không cần xin phép tác giả Mục đích chính của Apktool là hỗ trợ thêm tính năng và phân tích ứng dụng.

Apktool, được phát triển bởi Ryszard Wiśniewski, hiện đang được bảo trì và cập nhật bởi Connor Tumbleson, kỹ sư phần mềm chính tại Sourcetoad LLC Công ty này chuyên cung cấp giải pháp phần mềm cho doanh nghiệp và có nhiều đối tác lớn như Oracle, Samsung, LG Kể từ ngày 07/01/2017, Sourcetoad LLC đã tài trợ cho Apktool, giúp công cụ này duy trì và phát triển liên tục.

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

Mã nguồn của Apktool hiện có sẵn công khai tại [GitHub](https://github.com/iBotPeaches/Apktool) Người dùng có thể tìm hiểu chi tiết cách xây dựng mã nguồn này qua trang hướng dẫn tại [đây](https://ibotpeaches.github.io/Apktool/build/).

Chức năng

Apktool là công cụ mạnh mẽ giúp dịch ngược các tệp APK đã được đóng gói, cho phép người dùng giải mã và lấy lại các thành phần như AndroidManifest.xml và mã nguồn Ngoài ra, Apktool còn hỗ trợ đóng gói lại các thành phần đã được chỉnh sửa thành tệp APK hoặc JAR, mang lại khả năng chỉnh sửa và tái xây dựng tệp APK một cách hiệu quả.

File APK thực chất là một file ZIP, vì vậy chúng ta có thể dễ dàng giải nén file APK giống như các tệp nén khác bằng cách đổi phần mở rộng của tên file.

Để dịch ngược file APK, không chỉ đơn giản là giải nén nó bằng công cụ, mà còn cần phải hiểu rõ lý do tại sao các thành phần ban đầu không thể được phục hồi hoàn toàn Việc này đòi hỏi kiến thức chuyên sâu về cấu trúc và cách thức hoạt động của file APK để đảm bảo quá trình dịch ngược diễn ra hiệu quả.

Apktool là công cụ cần thiết để xử lý file APK, vì file xuất ra cuối cùng là một file nhị phân Việc giải nén đơn thuần sẽ không cho phép người dùng đọc nội dung bên trong các tệp, do đó, việc sử dụng Apktool là rất quan trọ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

Hình 2.2: Nội dung file AndroidManifest.xml nếu được dịch ngược bằng Apktool

Apktool cho phép xây dựng và xử lý các file APK dựa vào framework bên ngoài Thông thường, ứng dụng Android sử dụng tài nguyên và mã từ hệ điều hành Android, được gọi là framework resources.

Apktool là công cụ mạnh mẽ giúp giải mã và xây dựng các file APK một cách chính xác, dựa vào tài nguyên từ AOSP framework mới nhất AOSP, viết tắt của Android Open Source Project, là dự án mã nguồn mở do Google quản lý, cung cấp mã nguồn cần thiết để phát triển hệ điều hành Android, cho phép người dùng tùy chỉnh theo nhu cầu Mọi người có thể đóng góp vào dự án này, và những đóng góp sẽ được Google xem xét Các nhà sản xuất thiết bị thường sử dụng không chỉ AOSP mà còn bổ sung thêm các file framework riêng, dẫn đến việc giải mã thông thường có thể gặp lỗi do thiếu framework Apktool khắc phục vấn đề này bằng cách cho phép cài đặt các framework tùy chỉnh và giải mã các file APK phụ thuộc vào chúng một cách hiệu quả.

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

Bản cập nhật 14 v.2.1.0 đã tách tính năng debug code smali ra thành công cụ riêng biệt mang tên SmaliIdea, không còn tích hợp trong Apktool Các tệp APK chứa file dex, là định dạng mã Dalvik Bytecode mà máy tính có thể hiểu, nhưng con người gặp khó khăn trong việc sửa đổi loại mã này.

Mã Dalvik Bytecode thường được chuyển đổi thành các định dạng khác như smali, giúp con người dễ dàng làm việc hơn Smali là một định dạng do Google phát triển, và Apktool hỗ trợ việc debug định dạng này, giúp quá trình xây dựng và sửa lỗi trở nên thuận tiện hơn.

Quá trình phát triển qua các phiên bản

Kể từ khi phiên bản đầu tiên v0.9.0 ra mắt vào ngày 01/03/2010, Apktool đã trải qua nhiều cập nhật và cải tiến nhờ sự hỗ trợ của các cộng tác viên Đến ngày 07/12/2011, Apktool đã chính thức đạt mốc 1000 người dùng, và chỉ sau đó không lâu, số lượng người dùng đã tăng gấp ba lần lên 3000 vào ngày 16/03/2015.

Phiên bản đột phá nhất của Apktool, v2.0.0, chính thức ra mắt vào ngày 21/4/2015, sau gần hai năm phát triển từ bản beta Phiên bản này yêu cầu Java 7 và hỗ trợ Android 5.1, đồng thời thay đổi nhiều câu lệnh sử dụng Việc nâng cấp từ các phiên bản trước đó sang v2.0.0 đòi hỏi người dùng thực hiện nhiều thao tác do v2.0.0 sử dụng FileSystems của NIO2 cùng với FileWalker, trong khi các phiên bản trước (v1.5.2 trở về) chỉ tương thích với Java 6 Phiên bản này được nghiên cứu và phát triển trong gần một năm và đánh dấu sự trở lại của tác giả Ryszard Wiśniewski, người đã khắc phục nhiều lỗi tồn tại lâu nay.

Phiên bản v2.0.0 của Apktool giới thiệu nhiều tính năng mới đáng chú ý, bao gồm việc tích hợp AAPT trực tiếp trong công cụ, cải tiến cách sử dụng tham số input/output trong các câu lệnh, hỗ trợ debug smali và hỗ trợ smali 2.0 Những thay đổi cụ thể trong phiên bản này được thể hiện rõ ràng trong hình ảnh dưới đây.

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 để hỗ trợ người dùng kịp thời sau mỗi phiên bản Android mới Phiên bản hiện tại là v2.6.0, ra mắt vào ngày 02/09/2021, hỗ trợ Android 12 và mang lại nhiều nâng cấp cho các thành phần bên trong Phiên bản này không chỉ giới thiệu các tính năng mới mà còn thực hiện những thay đổi và loại bỏ một số thành phần nhằm tối ưu hóa hiệu suất.

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

Hướng dẫn cài đặt

Apktool hiện có sẵn trên các hệ điều hành Linux, Windows và MacOS Trong bài báo cáo này, tôi sẽ thực hiện cài đặt và sử dụng Apktool trên hệ điều hành Kali Linux.

Để sử dụng Apktool, yêu cầu tối thiểu là cài đặt Java 8 Bạn có thể kiểm tra phiên bản Java trên máy bằng cách gõ lệnh "java -version" trong terminal Nếu kết quả hiển thị là 1.8 hoặc cao hơn, máy của bạn đã đủ điều kiện Nếu không, hãy thực hiện cài đặt Java 8 theo hướng dẫn chính thức từ 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

Để kiểm tra xem Apktool đã được cài đặt thành công hay chưa, bạn chỉ cần gõ lệnh "apktool" trong terminal Nếu kết quả trả về hiển thị như trong hình dưới đây, điều đó có nghĩa là quá trình 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 cài đặt này nhanh chóng và dễ dàng, nhưng phiên bản cài đặt phụ thuộc vào bộ quản lý tool của Kali Linux, khiến người dùng không thể tự chọn phiên bản Ví dụ, phiên bản Apktool được cài đặt là v.2.5.0-dirty, một phiên bản tùy biến từ v2.5.0 chính thức, trong khi phiên bản mới nhất trên trang chủ Apktool là v.2.6.0 Điều này có nghĩa là người dùng không thể sử dụng phiên bản mới nhất hoặc có thể muốn cài đặt phiên bản cũ hơn Để giải quyết vấn đề này, có thể áp dụng cách cài đặt thứ hai.

Người dùng có thể dễ dàng chọn phiên bản bất kỳ của Apktool để sử dụng, bao gồm cả phiên bản mới nhất ngay sau khi phát hành mà không cần chờ đợi.

19 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ỉ: https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool

Nhấn chuột phải, chọn Save page as và đặt tên là apktool

Truy cập vào trang web https://bitbucket.org/iBotPeaches/apktool/downloads/ để tải phiên bản Apktool mà bạn muốn Người dùng có thể tự do chọn lựa phiên bản sử dụng mà không bị ràng buộc như trong cách 1 Trong bài viết này, tôi sẽ tải phiên bản cụ thể.

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

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)

Hình 3.4: 2 file apktool và apktool.jar tại thư mục /usr/local/bin

Để cấp quyền thực thi cho hai file, hãy mở terminal và nhập lần lượt các lệnh: `sudo chmod +x /usr/local/bin/apktool` và `sudo chmod +x /usr/local/bin/apktool.jar` Sau khi thực hiện xong, quá trình cài đặt Apktool cơ bản đã hoàn tất.

Apktool sẽ được chạy thông qua việc chạy file apktool.jar Để kiểm tra Apktool được cài đặt thành công chưa, thực hiện lệnh: apktool

Hình 3.5: Apktool v.2.6.0 được cài đặt thành công theo cách 2.

Hướng dẫn sử dụng

Thông tin về cách sử dụng Apktool được thể hiện đầy đủ trong tài liệu documentation của nó [5]

Các tham số của Apktool trong câu lệnh terminal

Câu lệnh của Apktool có thể được sử dụng kèm các tham số để tăng hiệu quả sử dụng

- Các tham số có thể sử dụng bất cứ khi nào:

• -version hoặc version: đưa ra thông tin về phiên bản Apktool hiện tại

• -advance hoặc advance: đưa ra cách sử dụng Apktool

• -v hoặc verbose: đưa ra đầu ra dưới dạng đầy đủ nhất

• -q hoặc quite: đưa ra đầu ra dưới dạng tóm tắt, ngắn gọn

Khi sử dụng hai tham số -v và -q thì cần đảm bảo tham số này phải đứng đầu tiên trong danh sách tham số của câu lệnh

- Các tham số sử dụng khi decode (giải mã) một file APK:

• -api hoặc api-level: chỉ định phiên bản API dùng để sinh ra các file smali

Giá trị mặc định là targetSdkVersion

• -b hoặc no-debug-info: không hiển thị thông tin debug như local, param, line, … trong file smali được sinh ra

Sử dụng tham số -f hoặc force để ghi đè lên thư mục đã tồn tại với cùng tên, nếu không sử dụng tham số này, hệ thống sẽ không cho phép ghi đè lên thư mục có tên giống với tên file APK (đã bỏ đuôi apk).

Apktool sẽ báo lỗi, nếu chưa tồn tại thì file APK sẽ được giải mã như thông thường

• force-manifest: được thêm vào kể từ phiên bản v.2.3.1 và nhằm mục đích để phân tích tệp APK Nó được dùng để buộc chỉ giải mã file

Việc sử dụng AndroidManifest.xml trong file APK giúp tiết kiệm thời gian xử lý, đặc biệt khi phân tích ứng dụng có kích thước lớn Thay vì giải mã toàn bộ file APK, người dùng có thể chỉ tập trung vào file AndroidManifest, từ đó giảm thiểu đáng kể thời gian cần thiết cho quá trình phân tích.

Khi giải mã file APK với phiên bản Android mới hơn so với phiên bản Apktool hỗ trợ, hoặc khi file APK không đạt tiêu chuẩn, bạn có thể sử dụng tham số keep-broken-res để tiếp tục quá trình giải mã Tuy nhiên, sau đó, người dùng cần tự chỉnh sửa các thư mục có ký hiệu -ERR trong thư mục giải mã, vì đây là các thư mục bị lỗi do file APK không tương thích.

• -m hoặc match-original: xử lý từng tệp thành dạng giống với dạng gốc nhất, tuy nhiên có thể làm cho không thể build ngược trở lại được

• no-assets: xuất hiện từ phiên bản v.2.3.0, dùng để chặn việc giải mã hoặc copy các tệp tài nguyên không xác định

• -o hoặc output : chỉ định thư mục đầu ra sau khi decompile

Tính năng "only-main-classes" được giới thiệu từ phiên bản v.2.4.1, cho phép người dùng yêu cầu chỉ giải mã các tệp dex nằm trong thư mục gốc của file APK, bao gồm các tệp classes.dex, classes2.dex, và các tệp tương tự khác.

• -p hoặc frame-path : chỉ định thư mục lưu trữ framework dùng để giải mã file APK theo framework này (như đã nói trong phần 2.2)

Tham số -r hoặc no-res cho phép không dịch ngược tài nguyên, giữ nguyên file resources.arsc Tùy chọn này phù hợp khi chỉ cần chỉnh sửa code smali, giúp tăng tốc độ decompile và build.

Tham số -s hoặc no-src cho phép người dùng không dịch ngược code, tức là không chuyển đổi các file dex Nếu bạn chỉ cần chỉnh sửa tài nguyên của ứng dụng, việc sử dụng tham số này sẽ giúp tăng tốc độ decompile và quá trình build lại.

• -t hoặc frame-tag : chỉ định dùng framework được gắn thẻ

TAG để thực hiện dịch ngược

- Các tham số sử dụng khi rebuild (đóng gói) một file APK:

Sử dụng tham số -a hoặc aapt để chỉ định đường dẫn đến tệp AAPT sẽ được sử dụng Nếu không tìm thấy AAPT trong đường dẫn chỉ định, Apktool sẽ sử dụng AAPT mặc định được lưu trong $PATH Nếu $PATH đã được cấu hình để tham chiếu đến tệp AAPT tùy chỉnh nhưng không tìm thấy tệp này, tham số này có thể không hoạt động.

Tùy chọn -api hoặc api-level được giới thiệu từ phiên bản v.2.4.0, cho phép người dùng chỉ định phiên bản API để xử lý các file smali trong quá trình rebuild, với giá trị mặc định là targetSdkVersion.

Tham số -c hoặc copy-original cho phép sao chép nguyên file AndroidManifest.xml và thư mục META-INF vào file APK được tạo ra Tuy nhiên, tính năng này dự kiến sẽ bị loại bỏ trong phiên bản v.3.0.0.

• -d hoặc debug: khả dụng kể từ v.2.4.0, nó thêm cấu hình debuggable =

Để thêm thuộc tính "true" vào tệp AndroidManifest, cần lưu ý rằng nếu tệp này đã có cấu hình debuggable, tham số mới sẽ không ghi đè giá trị cũ Chế độ debuggable cho phép ứng dụng hoạt động trong chế độ gỡ lỗi, giúp Android quản lý tất cả các tệp log liên quan đến ứng dụng một cách hiệu quả.

• -f hoặc force-all: nếu các tệp được sinh ra đã tồn tại, nó sẽ thực hiện ghi đè lên các file đã có

• -nc hoặc no-crunch: có từ phiên bản v.2.4.0, vô hiệu hóa việc tối ưu các file tài nguyên

• -o hoặc output : chỉ định thư mục đầu ra của file APK sinh ra

• -p hoặc frame-path : tham số này vẫn giữ nguyên ý nghĩa như khi giải mã

• use-aapt2: bắt đầu được đưa vào từ phiên bản v.2.3.2, nó sẽ sử dụng AAPT2 để tối ưu file APK thay vì sử dụng AAPT

Hướng dẫn sử dụng Apktool để thực hiện một số chức năng

Sử dụng Apktool là một quá trình đơn giản, tuy nhiên người dùng cần có kiến thức cơ bản về Android SDK, AAPT và khả năng đọc hiểu code smali để thực hiện hiệu quả.

3.2.2.1 Dịch ngược và giải mã file APK hoặc file JAR Để dịch ngược file APK, ta sử dụng thêm d hoặc decode trong câu lệnh Mặc định, sau dịch ngược ta sẽ thu được 1 thư mục có chứa nội dung file APK sau khi dịch ngược và giải mã, tên của thư mục trùng với tên của file APK, nó nằm tại vị trí thư mục chứa file APK Ta cũng có thể sử dụng Apktool để giải mã file JAR Mặc định, đối với file JAR, sau giải mã ta thu được thư mục có tên là tên file JAR + “out”

Có thể sử dụng 1 trong 2 cú pháp sau để dịch ngược và giải mã file APK/JAR: apktool d tên_file.apk/jar apktool decode tên_file.apk/jar

Hình 3.6: Ví dụ về decode file APK của ứng dụng Facebook Lite trên Android

Hình 3.7: Sử dụng Apktool để giải mã file JAR

Có thể tận dụng các tham số trong phần 3.1 để tăng cường khả năng dịch ngược của Apktool Ví dụ, sử dụng tham số -o để chỉ định thư mục đầu ra cho kết quả.

Hình 3.8: Sử dụng tham số -o trong dịch ngược file APK bằng Apktool

Sau khi chỉnh sửa thư mục, Apktool cho phép bạn đóng gói lại thành một file APK hoặc JAR duy nhất, với file được lưu tại đường dẫn /dist Để rebuild ứng dụng, bạn có thể sử dụng một trong hai lệnh sau: apktool b tên_thư_mục hoặc apktool build tên_thư_mục.

Hình 3.9: Sử dụng Apktool để đóng gói thư mục thành file APK

Hình 3.10: Sử dụng Apktool để đóng gói thư mục thành file JAR

Ta cũng vẫn có thể sử dụng tham số được quy định trong phần 3.2.1 để tùy chỉnh cách build

3.2.2.3 Sử dụng framework trong Apktool

Trong phần 2.2 có đề cập đến một chức năng của Apktool là cài framework bên ngoài để giải mã và dịch ngược file APK theo framework này

Mặc định, Apktool sử dụng framework chuẩn 1.apk nằm trong đường dẫn /home/kali/.local/share/apktool/framework/ để giải mã file APK Khi cần sử dụng framework bên ngoài, Apktool sẽ kiểm tra xem framework đó đã được cài đặt hay chưa; nếu chưa, nó sẽ thông báo lỗi Ví dụ, các thiết bị HTC có framework riêng com.htc.resources.apk, trong khi thiết bị LG sử dụng lge-res.apk Người dùng có thể cài đặt thêm các framework bên ngoài vào Apktool để đảm bảo quá trình dịch ngược APK thành công Sau khi cài đặt, việc dịch ngược file APK diễn ra như bình thường, và nếu không chỉ định tên, các framework mới sẽ được đặt tên theo thứ tự tăng dần như 2.apk, 3.apk.

Hình 3.11: File framework tiêu chuẩn của Apktool

Cách sử dụng một số chức năng liên quan đến framework như sau:

MỘT SỐ LAB VỀ SỬ DỤNG APKTOOL

Sử dụng Apktool để crack ứng dụng trả phí

Trong bài lab này, chúng tôi giới thiệu ứng dụng "Huyệt vị kinh lạc" với file APK mang tên com.tamnguyen.huyetvikinhlac.apk Ứng dụng này cung cấp thông tin chi tiết về tất cả huyệt mạch trên cơ thể con người từ ba góc nhìn: trực diện, sau lưng và phía hông Những thông tin này rất hữu ích trong lĩnh vực đông y, đặc biệt là cho việc châm cứu.

Ứng dụng cung cấp hai chế độ người dùng: miễn phí và cao cấp Trong chế độ miễn phí, người dùng chỉ có thể truy cập thông tin cơ bản về các huyệt và chỉ xem được chúng từ góc nhìn chính diện Để khám phá các huyệt từ các góc nhìn khác như mặt lưng và bên hông, cũng như nhận thêm thông tin chi tiết, người dùng cần nâng cấp lên phiên bản trả phí.

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

Hình 4.2: Thông báo mua bản cao cấp khi xem huyệt ở phía lưng

Bài lab này sẽ thực hiện crack ứng dụng này để có thể dùng ứng dụng như đối với người dùng trả phí

+ Bước 1: Tiến hành decompile file APK của ứng dụng này bằng Apktool, ta thu được thư mục com.tamnguyen.huyetvikinhlac:

Hình 4.3: Decode file APK của ứng dụng “Huyệt vị kinh lạc”

Nội dung của thư mục thu được như sau:

Hình 4.4: Nội dung thư mục sau khi dịch ngược file APK

+ Bước 2: Sử dụng thêm tool Bytecode Viewer trên Kali Linux để có thể xem code Java của file APK ban đầu

Ứng dụng này xác định trạng thái người dùng có phải trả phí hay không thông qua biến Boolean "purchase" trong lớp User Nếu "purchase" bằng true, người dùng đã mua gói cao cấp; nếu bằng false, người dùng là tài khoản miễn phí.

Hình 4.5: Code Java của User.class trong mã nguồn

Từ đây, ý tưởng của ta là sẽ thay đổi giá trị của biến purchase này thành true để có thể trở thành người dùng mua bản cao cấp

Dựa trên ý tưởng ở bước 2, trong lớp User.class, chúng ta sẽ thay đổi giá trị khởi tạo của purchase ở dòng 12 thành true, và trong phương thức init(), cần xóa dòng 23 và 24 để hoàn thiện.

Để sửa mã nguồn, chúng ta không thể chỉnh sửa trực tiếp trên mã Java mà phải thực hiện qua mã smali Tất cả mã smali của file APK được lưu trong thư mục smali của thư mục đã giải mã ở bước 1 Hãy tìm đến mã của lớp User và mở nó ra.

Hình 4.6: Code smali của User.class

Ta tiến hành chỉnh sửa file này Đầu tiên, để thay đổi giá trị khởi tạo của purchase thành true, ta sửa dòng 33 thành const/4 v0, 0x1

Tiếp theo, để thay đổi method init(), xóa hết từ dòng 77 đến 104 trong code smali Quá trình sửa code smali hoàn tất, nhấn Ctrl + S để lưu lại file

Hình 4.8: Chỉnh sửa method init()

+ Bước 4: Sử dụng Apktool để tiến hành rebuild lại thành file APK mới, thu được file APK sau khi chỉnh sửa ở thư mục /dist:

Hình 4.9: Đóng gói ứng dụng sau khi đã chỉnh sửa

Tuy nhiên, file APK này chưa thể cài đặt trên thiết bị di động để sử dụng ngay do chưa được ký

+ Bước 5: Ký file APK vừa tạo

File APK có thể được ký bằng jarsigner Mở terminal tại /dist, lần lượt thực hiện các lệnh sau để ký file APK:

37 keytool -genkeypair -v -keystore key.keystore -alias publishingdoc -keyalg RSA - keysize 2048 -validity 10000 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore /key.keystore com.tamnguyen.huyetvikinhlac.apk publishingdoc

Hình 4.10: Ký thành công file APK bằng jarsigner

Sau khi hoàn tất quá trình ký file, tệp APK trong thư mục /dist đã sẵn sàng để cài đặt trên các thiết bị Android Đây chính là tệp kết quả sau khi thực hiện quá trình crack.

Cài đặt file APK trên thiết bị Android cho phép người dùng trải nghiệm đầy đủ tính năng của phiên bản cao cấp mà không cần thanh toán, bao gồm việc ẩn thông báo mua bản cao cấp và hiển thị thông tin chi tiết về huyệt mạch, bao gồm cả các huyệt ở mặt, lưng và bên hông Điều này chứng tỏ rằng ứng dụng đã được crack thành công.

Kết quả được thể hiện qua các ảnh sau:

Hình 4.11: Banner yêu cầu mua bản cao cấp được ẩn, thông tin của huyệt mạch hiển ra đầy đủ

Hình 4.12: Ta đã có thể xem được các huyệt mạch phía sau lưng

Hình 4.13: Thông tin huyệt mạch phía sau lưng được hiển thị đầy đủ.

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

Chúng ta có một ứng dụng máy tính cầm tay bình thường mang tên “calculator.apk” Tuy nhiên, ứng dụng này sẽ được sửa đổi để trở thành một phần mềm độc hại Dữ liệu độc hại sẽ được chèn vào ứng dụng, với khả năng xóa toàn bộ danh bạ của người dùng khi thiết bị được khởi động lại Để thực hiện điều này, chúng ta sẽ tạo một lớp sử dụng Broadcast Receiver của Android, giúp lắng nghe sự kiện khởi động lại máy.

40 thực hiện nhiệm vụ xóa toàn bộ danh bạ người dùng

Hình 4.14: Giao diện của ứng dụng calculator

+ Bước 1: Tiến hành decode file APK của ứng dụng calculator

Hình 4.15: Dịch ngược thành công file calculator.apk

+ Bước 2: Sửa đổi file AndroidManifest.xml

Tìm file manifest của ứng dụng calculator ở đường dẫn /AndroidManifest.xml, thực hiện sửa file này như sau:

Hình 4.16: File AndroidManifest.xml ban đầu

Trong tệp AndroidManifest.xml đã được chỉnh sửa, chúng ta đã bổ sung các quyền cần thiết cho việc đọc và ghi danh bạ, cũng như quyền để lắng nghe sự kiện khởi động lại thiết bị Class Broadcast Receiver được định nghĩa để xử lý các sự kiện này.

RunTrojan cũng được khai báo thêm trong file này

+ Bước 3: Chèn thêm class RunTrojan vào mã nguồn của ứng dụng này

Trước hết, ta vẫn viết class này bằng Java như thông thường, nội dung class

RunTrojan được mô tả như hình dưới đây, với đoạn code chủ yếu thực hiện việc xóa danh bạ của người dùng Quá trình này diễn ra thông qua một vòng lặp while cho đến khi không còn danh bạ nào tồn tại.

Hình 4.18: Nội dung của RunTrojan.java

Sau khi biên dịch class, chúng ta sẽ chuyển đổi mã Java sang mã Smali Có nhiều phương pháp để thực hiện việc này, trong đó có việc sử dụng plugin Java2Smali, có thể cài đặt trực tiếp trong Android Studio Ví dụ, sau khi biên dịch, chúng ta sẽ thu được file RunTrojan.smali.

Hình 4.19: Một phần nội dung của file RunTrojan.smali

+ Bước 4: Chèn code Smali nói trên vào thư mục /smali:

In the RunTrojan class, we declared it to belong to the package net.tecnotopia.SimpleCalculator, which requires us to insert the RunTrojan.smali file into the appropriate directory of this package, specifically at /smali/net/tecnotopia/SimpleCalculator/.

Hình 4.20: File RunTrojan.smali cùng các file Smali khác

+ Bước 5: Thực hiện đóng gói thư mục calculator sau khi đã chính sửa, ký file

APK được sinh ra trong /dist tương tự như lab 4.1 Kết quả ta thu được một file APK có chứa mã độc mong muốn

Hình 4.21: Đóng gói thư mục calculator

+ Bước 6: Cài đặt thử nghiệm

Sau khi cài đặt file APK trên máy ảo, ứng dụng vẫn giữ nguyên giao diện ban đầu, khiến người dùng khó phát hiện sự hiện diện của nội dung độc hại Khi khởi động lại máy, toàn bộ danh bạ đã bị xóa, cho thấy rằng quá trình cài đặt đã thành công.

Hình 4.22: Danh bạ trước khi khởi động lại máy

Hình 4.23: Danh bạ sau khi khởi động lại máy

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.

Trong bài lab này, chúng ta sẽ khám phá ứng dụng gọi điện thoại mặc định có tên "lg_phone.apk" trên các thiết bị di động của LG.

Ta thử tiến hành decompile file APK này bằng Apktool theo cách thông thường, nhận thấy Apktool báo lỗi thiếu framework, không thể hoàn tất quá trình dịch ngược:

Hình 4.24: Không thể hoàn tất quá trình dịch ngược file lg_phone.apk

Lý do của việc này là do ứng dụng gọi điện mặc định trên các thiết bị di động của

LG ngoài việc sử dụng AOSP của Android (chính là framework tiêu chuẩn 1.apk trong

Apktool cần sử dụng một framework bên ngoài do LG phát triển, gọi là lge-res.apk Việc Apktool không cài đặt framework này đã dẫn đến lỗi trong quá trình biên dịch các thành phần phụ thuộc vào nó.

Mặc dù quá trình giải mã gặp lỗi, thư mục có cùng tên vẫn được tạo ra và chứa các thành phần trong APK có thể được giải mã bằng framework tiêu chuẩn.

Để khắc phục lỗi khi giải mã, cần cài đặt framework lge-res.apk của LG bằng lệnh apktool if lge-res.apk, điều này sẽ giúp tạo ra thư mục cùng tên.

Hình 4.26: Cài đặt thành công framework của LG

Cài đặt thành công, framework được lưu trong thư mục mặc định chứa framework là

/home/kali/.local/share/apktool/framework/, tên là 2.apk

Giải mã file APK của ứng dụng gọi điện mặc định của LG đã thành công, sử dụng cả hai framework để thực hiện quá trình này.

Hình 4.27: Quá trình giải mã file APK đã sử dụng cả 2 framework

Hình 4.28: Thư mục thu được sau giải mã

Apktool là công cụ mạnh mẽ giúp xử lý file APK với nhiều tính năng nổi bật như dịch ngược, giải mã và đóng gói file ứng dụng Nó còn hỗ trợ cài đặt framework bên ngoài, nhờ vào sự đóng góp của cộng đồng, dự án này ngày càng phát triển.

Apktool ngày càng được cải tiến và trở nên vượt trội, trở thành công cụ không thể thiếu cho việc dịch ngược, phân tích và nghiên cứu file APK.

Em xin chân thành cảm ơn thầy đã tạo điều kiện cho em nghiên cứu đề tài thú vị này Qua quá trình nghiên cứu, em đã tích lũy được nhiều kiến thức bổ ích Sự hỗ trợ của thầy là động lực lớn giúp em hoàn thành báo cáo Dù bài báo cáo còn nhiều thiếu sót do kiến thức hạn chế, em rất mong nhận được ý kiến đóng góp từ thầy để cải thiện hơn nữa.

Ngày đăng: 08/01/2022, 10:53

HÌNH ẢNH LIÊN QUAN

Hình 1.5: Ví dụ về một file AndroidManifest.xml. - Bài tập lớn môn an toàn mạng (34)
Hình 1.5 Ví dụ về một file AndroidManifest.xml (Trang 12)
Hình 1.6: Quá trình đóng gói để tạo file APK. - Bài tập lớn môn an toàn mạng (34)
Hình 1.6 Quá trình đóng gói để tạo file APK (Trang 13)
Hình 2.1: Nội dung file AndroidManifest.xml nếu mở bằng cách giải nén file APK. - Bài tập lớn môn an toàn mạng (34)
Hình 2.1 Nội dung file AndroidManifest.xml nếu mở bằng cách giải nén file APK (Trang 18)
Hình 3.1: Thực hiện cài Apktool trên Kali Linux. - Bài tập lớn môn an toàn mạng (34)
Hình 3.1 Thực hiện cài Apktool trên Kali Linux (Trang 23)
Hình 3.2: Cài đặt thành công Apktool theo cách 1. - Bài tập lớn môn an toàn mạng (34)
Hình 3.2 Cài đặt thành công Apktool theo cách 1 (Trang 24)
Hình 3.3: Giao diện trang download Apktool. - Bài tập lớn môn an toàn mạng (34)
Hình 3.3 Giao diện trang download Apktool (Trang 25)
Hình 3.4: 2 file apktool và apktool.jar tại thư mục /usr/local/bin. - Bài tập lớn môn an toàn mạng (34)
Hình 3.4 2 file apktool và apktool.jar tại thư mục /usr/local/bin (Trang 26)
Hình 3.5: Apktool v.2.6.0 được cài đặt thành công theo cách 2. - Bài tập lớn môn an toàn mạng (34)
Hình 3.5 Apktool v.2.6.0 được cài đặt thành công theo cách 2 (Trang 27)
Hình 3.6: Ví dụ về decode file APK của ứng dụng Facebook Lite trên Android. - Bài tập lớn môn an toàn mạng (34)
Hình 3.6 Ví dụ về decode file APK của ứng dụng Facebook Lite trên Android (Trang 30)
Hình 3.8: Sử dụng tham số -o trong dịch ngược file APK bằng Apktool. - Bài tập lớn môn an toàn mạng (34)
Hình 3.8 Sử dụng tham số -o trong dịch ngược file APK bằng Apktool (Trang 31)
Hình 3.9: Sử dụng Apktool để đóng gói thư mục thành file APK. - Bài tập lớn môn an toàn mạng (34)
Hình 3.9 Sử dụng Apktool để đóng gói thư mục thành file APK (Trang 32)
Hình 3.10: Sử dụng Apktool để đóng gói thư mục thành file JAR. - Bài tập lớn môn an toàn mạng (34)
Hình 3.10 Sử dụng Apktool để đóng gói thư mục thành file JAR (Trang 33)
Hình 3.11: File framework tiêu chuẩn của Apktool. - Bài tập lớn môn an toàn mạng (34)
Hình 3.11 File framework tiêu chuẩn của Apktool (Trang 34)
Hình 4.1:  Thông tin của các huyệt hiển - Bài tập lớn môn an toàn mạng (34)
Hình 4.1 Thông tin của các huyệt hiển (Trang 38)
Hình 4.3: Decode file APK của ứng dụng “Huyệt vị kinh lạc”. - Bài tập lớn môn an toàn mạng (34)
Hình 4.3 Decode file APK của ứng dụng “Huyệt vị kinh lạc” (Trang 39)

TỪ KHÓA LIÊN QUAN

w