Reverse Engineering trong phát triển di động: nó là gì, công cụ và phương pháp phân tích

Tác giả: IT Sectr Đã đăng: 2026-04-04 Thời gian đọc: 10 phút

Reverse Engineering (kỹ thuật đảo ngược) là việc khôi phục logic và cấu trúc của một ứng dụng di động mà không cần truy cập vào mã nguồn. Trong bối cảnh Android và iOS, điều này có nghĩa là dịch ngược các tệp nhị phân DEX/APK và Mach-O/IPA để trích xuất các thuật toán, khóa mã hóa, điểm cuối API và logic kinh doanh. Theo Veracode Security Research (2025), hơn 60% ứng dụng di động trong top 200 chứa ít nhất một chỉ số giúp đơn giản hóa việc dịch ngược. Reverse Engineering không chỉ được sử dụng cho các cuộc tấn công mà còn cho kiểm toán bảo mật, phân tích bằng sáng chế và kiểm thử thâm nhập.

Những điểm chính

  • Reverse Engineering là quá trình phân tích mã nhị phân của ứng dụng để khôi phục logic, dữ liệu và thuật toán mà không cần truy cập mã nguồn
  • Phân tích tĩnh bao gồm dịch ngược DEX/APK qua jadx, bytecode iOS qua Ghidra và đọc tài nguyên qua apktool
  • Phân tích động được thực hiện qua Frida, Objection và Xposed để chặn các lời gọi trong thời gian chạy mà không dừng ứng dụng
  • Bảo vệ khỏi kỹ thuật đảo ngược dựa trên làm rối (ProGuard, DexGuard), mã hóa chuỗi, tác nhân RASP và kiểm tra tính toàn vẹn của APK
  • Tình trạng pháp lý của kỹ thuật đảo ngược khác nhau: DMCA cho phép vì mục đích tương tác và bảo mật, nhưng cấm vượt qua giấy phép và DRM

Reverse Engineering là gì?

Reverse Engineering (kỹ thuật đảo ngược) là ngành phân tích phần mềm nhằm khôi phục các đặc tính, logic và cấu trúc của ứng dụng từ biểu diễn nhị phân của nó. Đối với ứng dụng di động, đối tượng phân tích là các tệp APK (Android) và IPA (iOS), chứa mã đã biên dịch, tài nguyên, tệp kê khai và chứng chỉ. Kết quả của kỹ thuật đảo ngược là trích xuất các thuật toán, giao thức, khóa mã hóa, lược đồ API và logic kinh doanh.

Các mục tiêu của kỹ thuật đảo ngược được chia thành hợp pháp và bất hợp pháp. Hợp pháp: phân tích phần mềm độc hại để tạo công cụ bảo mật, kiểm toán ứng dụng của chính mình để tìm lỗ hổng, đảm bảo tương thích với các giao thức đóng, phân tích bằng sáng chế và giáo dục. Bất hợp pháp: đánh cắp tài sản trí tuệ, vượt qua các hạn chế cấp phép, tạo bản sao lậu và sửa đổi ứng dụng để đánh cắp dữ liệu người dùng. Theo Google Play Protect (2025), 78% các sửa đổi độc hại của ứng dụng ngân hàng được tạo ra dựa trên APK gốc đã qua xử lý kỹ thuật đảo ngược.

Phương pháp luận của kỹ thuật đảo ngược bao gồm hai hướng chính: phân tích tĩnh (không chạy ứng dụng) và phân tích động (trong khi thực thi). Mỗi cách tiếp cận cung cấp một mức độ thông tin khác nhau. Phân tích tĩnh cung cấp bức tranh toàn cảnh về mã, nhưng không có dữ liệu thời gian chạy. Phân tích động tiết lộ hành vi thực tế, luồng dữ liệu, các lời gọi mạng, nhưng chỉ trong một kịch bản thực thi cụ thể. Kỹ thuật đảo ngược chuyên nghiệp luôn kết hợp cả hai cách tiếp cận.

Công cụ phân tích tĩnh

Phân tích tĩnh là giai đoạn đầu tiên của kỹ thuật đảo ngược. APK hoặc IPA gốc được giải nén và từng thành phần được phân tích riêng biệt. Các mục tiêu chính: bytecode DEX, tài nguyên, tệp kê khai, thư viện gốc (.so, .dylib) và siêu dữ liệu.

jadx — trình dịch ngược DEX sang Java

jadx là công cụ chính để phân tích tĩnh các ứng dụng Android. Nó chuyển đổi bytecode DEX thành mã Java có thể đọc được với tổn thất tối thiểu. jadx hỗ trợ: dịch ngược đa dex, nhận dạng lambda và các lớp Kotlin nội tuyến, và xuất sang dự án Gradle. Đối với mã bị làm rối (ProGuard), jadx hiển thị mã với tên a, b, c, nhưng cấu trúc lớp và trình tự lời gọi được bảo toàn. Theo thử nghiệm độc lập, jadx dịch ngược chính xác 85–92% mã ngay cả khi bị làm rối.

apktool — giải nén tài nguyên

apktool giải mã APK thành mã smali (trình hợp dịch DEX) và khôi phục tài nguyên ở dạng có thể đọc được: AndroidManifest.xml được chuyển đổi từ AXML sang XML có thể đọc, bố cục trở thành đánh dấu XML, strings.xml trở thành văn bản thuần. apktool cho phép sửa đổi tài nguyên và xây dựng lại APK. Sau khi giải nén qua apktool và thay thế tài nguyên, ứng dụng có thể được cài đặt với nội dung đã sửa đổi.

Ghidra — phân tích thư viện gốc

Ghidra (NSA) là một framework kỹ thuật đảo ngược cần thiết để phân tích các thư viện .so trên Android và .dylib trên iOS. Ghidra tháo rời mã ARM64, tái tạo mã giả C và xây dựng đồ thị lời gọi. Đối với kỹ thuật đảo ngược di động, Ghidra được sử dụng để phân tích các triển khai gốc của mã hóa và cơ chế DRM. Ghidra hỗ trợ viết kịch bản bằng Python và Java để tự động hóa phân tích.

bash
# Giải nén và dịch ngược APK
$ jadx -d output_dir app.apk

# Giải nén tài nguyên qua apktool
$ apktool d app.apk -o app_unpacked

# Phân tích thư viện gốc qua Ghidra
$ ghidra app.apk/lib/arm64-v8a/libnative.so

# Tìm kiếm hằng số chuỗi trong DEX
$ strings classes.dex | grep -i api_key

Công cụ phân tích động

Phân tích động được thực hiện trên một ứng dụng đang chạy. Trình phân tích kết nối với tiến trình và chặn các lời gọi hàm, đối số và giá trị trả về trong thời gian thực.

Frida — công cụ đo lường phổ quát

Frida là công cụ hàng đầu để phân tích động các ứng dụng di động. Frida tiêm một công cụ JavaScript vào tiến trình ứng dụng (Android ART hoặc ứng dụng iOS) và cho phép chặn các lời gọi tới cả hàm Java/Objective-C và C/C++. Với Frida, các kỹ sư đảo ngược có thể: ghi nhật ký tất cả các lời gọi tới phương thức AES.decrypt() với tham số, thay thế giá trị trả về tùy ý, vô hiệu hóa SSL-pinning qua Universal Android SSL Unpin và theo dõi các lời gọi gốc qua Stalker. Frida hoạt động mà không cần sửa đổi APK/IPA, khiến nó không thể thiếu cho kiểm thử thâm nhập.

Objection — lớp bọc Frida

Objection cung cấp các lệnh có sẵn cho các tác vụ kỹ thuật đảo ngược phổ biến mà không cần viết kịch bản JavaScript: disable-pinning (vô hiệu hóa SSL pinning), dump-keychain (iOS), explore (duyệt hệ thống phân cấp lớp), memory search (tìm kiếm chuỗi trong bộ nhớ). Objection cho phép thực hiện phân tích động hoàn chỉnh mà không cần một dòng mã nào. Đối với ứng dụng iOS, Objection tự động tìm và ghi nhật ký các lời gọi tới NSURLSession, CFNetworkNSKeyedArchiver.

Xposed Framework

Xposed là một framework cho Android hoạt động bằng cách thay thế tệp app_process trong Zygote. Không giống như Frida, Xposed không yêu cầu quyền truy cập root sau khi cài đặt. Các mô-đun Xposed có thể chặn các lời gọi phương thức trong bất kỳ ứng dụng nào. Đối với kỹ thuật đảo ngược, Xposed thuận tiện cho phân tích dài hạn: mô-đun được cài đặt và chạy liên tục, ghi nhật ký hành vi của ứng dụng trong các kịch bản khác nhau. Xposed hỗ trợ Android đến phiên bản 8.1; đối với Android 9+, EdXposed dựa trên SandHook được sử dụng.

js
// Frida: chặn phương thức decrypt() trong ứng dụng
let aesClass = Java.use("javax.crypto.Cipher");

aesClass.doFinal.overload(
    "[B", "int", "int"
).implementation = function(
    input, offset, len
) {
    console("[AES] decrypt called, len=" + len);
    return this.doFinal(input, offset, len);
};

Quy trình kỹ thuật đảo ngược ứng dụng Android

Quy trình làm việc tiêu chuẩn của kỹ thuật đảo ngược bao gồm các bước tuần tự, mỗi bước cung cấp một mức độ thông tin nhất định.

Bước 1: Thu thập thông tin

Nhà phân tích kiểm tra APK ở cấp độ siêu dữ liệu: targetSdk, uses-permission (quyền nào được yêu cầu), intent-filter và các thành phần được xuất. Quyền có thể tiết lộ API nào được sử dụng (android.permission.CAMERA → máy ảnh, android.permission.RECORD_AUDIO → âm thanh). Các hoạt động được xuất xác định điểm vào mà không cần xác thực. Giai đoạn này được thực hiện qua aapt hoặc ApkAnalyzer và mất 1–2 phút.

Bước 2: Dịch ngược DEX

APK được giải nén và classes.dex (hoặc multidex) được đưa vào jadx. Đầu ra là mã Java/Kotlin được tổ chức trong các gói. Nhà phân tích tìm kiếm các lớp chính: CryptoUtils, ApiClient, AuthManager, DatabaseHelper và kiểm tra thuật toán nào được sử dụng. Nếu mã chứa các chuỗi như AES/CBC/PKCS5Padding, ứng dụng sử dụng mã hóa và cần tìm khóa. Ở giai đoạn này, các khóa được mã hóa cứng, URL API, mã thông báo OAuth và bí mật được xác định. Không bị làm rối, toàn bộ mã ứng dụng được đọc như một dự án Java thông thường.

Bước 3: Phân tích lưu lượng

Sau khi thiết lập Frida hoặc Objection để vô hiệu hóa SSL-pinning, nhà phân tích khởi chạy ứng dụng và chặn lưu lượng mạng qua Burp Suite hoặc mitmproxy. Dữ liệu lưu lượng tiết lộ lược đồ API: điểm cuối nào, tham số nào và ở định dạng nào. Nếu có thể, nhà phân tích sửa đổi các yêu cầu và kiểm tra phản hồi của máy chủ đối với dữ liệu không chính xác hoặc độc hại. Thiếu xác thực phía máy chủ là một lỗ hổng trực tiếp được phát hiện ở bước này.

Bước 4: Ghi vào data.json

Kết quả phân tích được ghi lại ở dạng có cấu trúc. Đối với mỗi điểm yếu được tìm thấy, được chỉ ra: lớp và phương thức, mô tả lỗ hổng, vectơ khai thác và khuyến nghị khắc phục. Tập dữ liệu này được chuyển cho nhóm phát triển hoặc được sử dụng để biên soạn báo cáo kiểm thử thâm nhập. Trong môi trường tự động hóa (MobSF), báo cáo được tạo tự động dựa trên kết quả phân tích tĩnh và động.

Đặc điểm của kỹ thuật đảo ngược ứng dụng iOS

Kỹ thuật đảo ngược ứng dụng iOS khó hơn Android do kiến trúc bảo mật nghiêm ngặt hơn của Apple và thiếu quyền truy cập trực tiếp vào hệ thống tệp trên các thiết bị tiêu chuẩn. Cần phải jailbreak để phân tích iOS.

Phân tích tĩnh Mach-O

Kho lưu trữ IPA chứa nhị phân Mach-O — định dạng tệp thực thi phổ quát của Apple. Để dịch ngược, sử dụng Hopper Disassembler hoặc IDA Pro. Không giống như Android DEX, dịch ngược thành Java với tổn thất tối thiểu, Mach-O chứa mã ARM64 gốc được tái tạo thành mã giả C với độ chính xác thấp hơn. Hopper đạt được 60–70% tái tạo; phần còn lại phải được phân tích ở cấp độ hợp ngữ.

Phân tích động với Frida cho iOS

Frida trên iOS yêu cầu jailbreak và cài đặt frida-server. Sau khi kết nối, Frida chặn các phương thức Objective-C qua định tuyến thông báo API. Đối với ứng dụng iOS, một kịch bản điển hình bao gồm: chặn NSURLSession.dataTaskWithRequest để ghi nhật ký yêu cầu HTTP, chặn NSKeyedUnarchiver để phân tích dữ liệu được tuần tự hóa và theo dõi truy vấn CoreData qua frida-trace. Frida đã có sẵn cho iOS 15–17 với bản phát hành jailbreak Dopamine.

Sửa đổi IPA

Kỹ thuật đảo ngược có thể bao gồm việc sửa đổi IPA sau đó đóng gói lại và cài đặt trên thiết bị. Các công cụ bao gồm: ipatool để giải nén, MachOView để xem các phần và optool để tiêm mã. Sau khi sửa đổi, IPA được ký qua ldid hoặc fastlane sigh để cài đặt trên thiết bị đã jailbreak. Đối với iOS 16+, chữ ký mã được xác minh ở cấp độ Secure Enclave và IPA đã sửa đổi sẽ không chạy trên thiết bị chưa jailbreak.

js
// Frida: chặn yêu cầu HTTP trong ứng dụng iOS
if (ObjC.available) {
    let NSURLSession = ObjC.classes.NSURLSession;
    let dataTaskWithRequest = ObjC.protocol("NSURLSessionDelegate")
        .method("- URLSession:dataTask:didReceiveData:");
    Interceptor.attach(dataTaskWithRequest.implementation, {
        onEnter(args) {
            let data = ObjC.Object(args[3]);
            console("[HTTP Response]", data.toString());
        }
    });
}

Phương pháp bảo vệ khỏi kỹ thuật đảo ngược

Bảo vệ khỏi kỹ thuật đảo ngược tuân theo nguyên tắc bảo mật nhiều lớp: không có phương pháp đơn lẻ nào cung cấp bảo vệ 100%, nhưng sự kết hợp làm cho kỹ thuật đảo ngược trở nên không khả thi về mặt kinh tế.

Làm rối mã

Cấp độ cơ bản là ProGuard cho Android, thay thế tên lớp và phương thức bằng tên một ký tự. Để bảo vệ nâng cao, DexGuard thêm cảm ứng quá tải (nhiều phương thức với chữ ký khác nhau và cùng tên) và mã hóa chuỗi AES-256. Làm rối làm tăng thời gian phân tích mã từ 5 phút lên 5–20 giờ tùy theo cấp độ. DexGuard bổ sung làm rối luồng điều khiển, khiến mã không thể đọc được đối với jadx.

Mã hóa hằng số

Tất cả các hằng số chuỗi — URL, khóa, mã thông báo, truy vấn SQL — được mã hóa tại thời điểm xây dựng và giải mã trong thời gian chạy. Điều này bảo vệ khỏi phân tích tĩnh các chuỗi trong tệp DEX. Kẻ tấn công chạy lệnh strings trên app.apk sẽ không thấy bất kỳ điểm cuối API nào. Ngay cả sau khi dịch ngược, tất cả các chuỗi xuất hiện dưới dạng dữ liệu nhị phân. Mỗi chuỗi có thể sử dụng một khóa riêng biệt, làm phức tạp việc giải rối.

RASP và kiểm tra tính toàn vẹn

Một tác nhân RASP bên trong ứng dụng phát hiện Frida và gỡ lỗi trong thời gian chạy. Kiểm tra tính toàn vẹn qua hàm băm SHA-256 của APK ngăn chặn việc chạy phiên bản đã sửa đổi của ứng dụng. Nếu hàm băm APK không khớp với hàm băm tham chiếu (được lưu trữ trong lớp gốc), ứng dụng sẽ kết thúc. Điều này chặn các cuộc tấn công dựa trên sửa đổi APK, bao gồm đóng gói lại.

Bảo vệ phía máy chủ

Logic kinh doanh quan trọng nên được thực thi trên máy chủ, không phải trên máy khách. Ngay cả khi kẻ tấn công dịch ngược hoàn toàn ứng dụng, mã máy chủ vẫn không thể truy cập được. Xác thực phía máy chủ của tất cả các yêu cầu và tham số ngăn chặn việc khai thác các lỗ hổng được tìm thấy trong quá trình kỹ thuật đảo ngược. Chứng thực máy chủ qua Play Integrity API hoặc App Attest xác nhận rằng yêu cầu đến từ một ứng dụng xác thực, chưa bị sửa đổi.

Các câu hỏi thường gặp

Kỹ thuật đảo ngược ứng dụng di động có hợp pháp không?

Tại Mỹ, kỹ thuật đảo ngược được điều chỉnh bởi DMCA — được phép vì mục đích tương tác, kiểm tra bảo mật và lưu trữ. Việc vượt qua các biện pháp bảo vệ công nghệ (DRM) bị cấm. Tại Châu Âu, Điều 6 của EUCD tương tự DMCA. Tại Nga, kỹ thuật đảo ngược mà không có sự đồng ý của chủ sở hữu bản quyền có thể bị coi là vi phạm bản quyền. Tư vấn pháp lý là bắt buộc trước khi thực hiện kỹ thuật đảo ngược thương mại.

Có thể bảo vệ ứng dụng 100% khỏi kỹ thuật đảo ngược không?

Không. Bất kỳ mã nào thực thi trên thiết bị của kẻ tấn công đều có thể bị phân tích — đây là giới hạn cơ bản của mô hình bảo mật phía máy khách. Mục tiêu của bảo vệ là làm cho kỹ thuật đảo ngược trở nên kém hấp dẫn về mặt kinh tế: chi phí thời gian và tài nguyên phải vượt quá giá trị của kết quả thu được. Sự kết hợp giữa làm rối, RASP và logic phía máy chủ là tiêu chuẩn bảo vệ hiện tại.

Đóng gói lại (repackaging) APK là gì?

Đóng gói lại là việc sửa đổi ứng dụng thông qua kỹ thuật đảo ngược sau đó lắp ráp lại APK. Kẻ tấn công giải nén APK qua apktool, thêm mã độc hại hoặc thay thế khóa API, lắp ráp lại và ký bằng chứng chỉ của riêng mình. Đóng gói lại chiếm 86% tất cả các cuộc tấn công trên Android, theo Báo cáo Mối đe dọa Kaspersky (2025). Biện pháp đối phó: kiểm tra chữ ký số trong thời gian chạy.

Làm thế nào Frida vượt qua SSL-pinning?

Kịch bản Frida Universal Android SSL Unpin chặn các lời gọi tới TrustManager.checkServerTrusted và ServerTrustManager trên iOS, thay thế triển khai bằng phương pháp cho phép tất cả. Việc chặn các phương thức X509TrustManager trong OkHttp và URLConnection cũng được sử dụng. SSL-pinning có thể bị vượt qua bằng Frida trong 10 giây bằng kịch bản có sẵn. Một biện pháp bảo vệ mạnh mẽ hơn là tính minh bạch của chứng chỉ thông qua xác minh chứng chỉ phía máy chủ.

Ngôn ngữ nào khó đảo ngược nhất?

Mã gốc C/C++ trong thư viện .so/.dylib khó đảo ngược hơn đáng kể so với Java trong DEX. Swift với PGO và biên dịch Osize tạo ra nhị phân bị làm rối nhiều hơn Objective-C. Rust biên dịch thành mã gốc mà không có siêu dữ liệu thời gian chạy và không có trình bao bọc tiêu chuẩn của Objective-C, khiến nó trở nên khó đảo ngược nhất trong số các ngôn ngữ phát triển di động hiện đại.

Tổng kết

  • Reverse Engineering khôi phục logic ứng dụng từ mã nhị phân thông qua phân tích tĩnh (jadx, Ghidra, Hopper) và đo lường động (Frida, Xposed, Objection)
  • Phân tích tĩnh ứng dụng Android bắt đầu bằng dịch ngược DEX qua jadx và giải nén tài nguyên qua apktool, khôi phục tới 90% mã Java
  • Phân tích động qua Frida cho phép chặn các lời gọi trong thời gian chạy, vô hiệu hóa SSL-pinning và ghi nhật ký tất cả các đối số và giá trị trả về của phương thức
  • Reverse Engineering trên iOS yêu cầu jailbreak và làm việc với nhị phân ARM64 qua Hopper/IDA Pro, phức tạp hơn đáng kể so với phân tích DEX trên Android
  • Bảo vệ khỏi kỹ thuật đảo ngược bao gồm làm rối (ProGuard/DexGuard), mã hóa hằng số, tác nhân RASP để phát hiện Frida và chứng thực máy chủ qua Play Integrity API
  • Bảo vệ 100% khỏi kỹ thuật đảo ngược là không thể — mục tiêu là làm cho chi phí tấn công cao hơn giá trị của dữ liệu được bảo vệ
  • Đóng gói lại APK là cuộc tấn công phổ biến nhất trên ứng dụng di động và được ngăn chặn bằng cách kiểm tra chữ ký số trong thời gian chạy và xác minh tính toàn vẹn phía máy chủ

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm