Malware

Frida 104: Unpacking Android Malware

category
Malware
date
May 31, 2021
slug
frida-104-unpacking-android-malware
author
status
Public
tags
frida
malware
summary
Sử dụng Frida để unpacking android malware.
type
Post
thumbnail
updatedAt
Mar 1, 2023 08:52 AM

1. Tổng quan

Việc phân tích các APK đã bị Packer khá là khó chịu cho người phân tích. Trong phần này sẽ trình bày một cách để Unpack một Android Malware. Mẫu được sử dụng có sẵn trên VirusTotal:
$ file sample.apk sample.apk: Java archive data (JAR) $ sha256sum sample.apk 509aa4a846c6cb52e9756a282de67da3e8ec82769bceafa1265428b1289459b3 sample.apk
Kiểm tra nhanh mẫu cần phân tích, tệp APK thực chất là một ZIP File, giải nén tệp này và xem cấu trúc bên trong:
$ tree . ├── AndroidManifest.xml ├── META-INF │   ├── CERT.RSA │   ├── CERT.SF │   └── MANIFEST.MF ├── MawmjulbcbEndsqku^nd.cml ├── classes.dex ├── res │   ├── drawable │   │   └── dcuqizi.xml │   ├── drawable-hdpi-v11 │   │   └── rahvpxdt.png ... │   ├── layout │   │   ├── dialog_web_view.xml ... │   ├── layout-v17 │   │   └── dialog_web_view.xml │   └── xml │   └── qexyvzsh.xml └── resources.arsc
Kiểm tra nhanh thấy bên trong có tệp MawmjulbcbEndsqku^nd.cml là đáng ngờ, một tệp APK thông thường thì sẽ hiếm khi xuất hiện những tệp kiểu dạng như vậy:
$ file 'MawmjulbcbEndsqku^nd.cml' MawmjulbcbEndsqku^nd.cml: data $ exiftool 'MawmjulbcbEndsqku^nd.cml' ExifTool Version Number : 10.80 File Name : MawmjulbcbEndsqku^nd.cml Directory : . File Size : 285 kB File Modification Date/Time : 2018:07:21 04:31:32+07:00 File Access Date/Time : 2021:05:27 11:20:31+07:00 File Inode Change Date/Time : 2021:05:27 11:24:04+07:00 File Permissions : rwxrwxrwx Error : Unknown file type $ hexdump -C 'MawmjulbcbEndsqku^nd.cml' | head -10 00000000 9e 1c 01 00 e4 cf 0a 73 90 d6 c8 30 5a bc f1 b3 |.......s...0Z...| 00000010 fb 50 8f c8 40 37 a8 0c 54 af 84 6a 9f 5d a8 54 |.P..@7..T..j.].T| 00000020 53 59 a9 ad 2a 33 f6 0b e7 d9 36 8f 34 39 6e ae |SY..*3....6.49n.| 00000030 bc 02 36 8c df b2 d7 aa c0 63 88 81 73 10 dc 8d |..6......c..s...| 00000040 1b 72 39 fd 81 e3 f3 9c 7c 04 e8 87 26 f2 ce 08 |.r9.....|...&...| 00000050 e2 45 4f 34 24 b5 61 dc ef fc 2e f2 a7 b2 cb f9 |.EO4$.a.........| 00000060 af 6c ee b9 2e 86 e6 a2 2d 05 35 73 80 73 e3 21 |.l......-.5s.s.!| 00000070 0b d3 1f 34 af d4 5a be 7f 3f a8 fa 0d bd 2d 38 |...4..Z..?....-8| 00000080 15 60 46 a5 36 c2 9c f7 be 6f fa 1c 45 a0 e7 d0 |.`F.6....o..E...| 00000090 3d 14 ef 2c 8d 6f 62 41 07 58 05 0c 4d 32 e0 c8 |=..,.obA.X..M2..|
Như vậy có thể chắc chắn một điều rằng tệp đã bị mã hóa, các trình Detector không thể nhận biết được đây là tập tin loại gì. Chúng ta có thể phỏng đoán App Android trong quá trình khởi chạy nó sẽ đọc tệp này sau đó giải mã ra được Payload cuối và thực thi.

2. Static Analysis

Tệp AndroidManifest.xml là một XML Binary đi kèm bên trong các tệp APK. Nó chứa rất nhiều thông tin về ứng dụng Android:
  • Package name của ứng dụng.
  • Danh sách các activities, services và receivers
  • Danh sách các quyền truy cập của ứng dụng trên thiết bị Android
  • Danh sách các action
  • Và nhiều thông tin khác nữa
Để đọc được tệp này cũng như mã nguồn của chương trình APK cần một APK Decompiler, tôi sử dụng JADX-GUI:
notion image
Hầu hết các strings bên trong đều đã bị Obfuscate:
notion image
Điều tương tự cũng xảy ra khi chúng ta cố gắng đọc code của ứng dụng, chúng đều bị obfuscate, gây khó khăn cho phân tích
notion image
Từ tên lớp, package, tên các hàm đến các biến strings cũng đều bị obfuscate
notion image
Có một nguyên tắc của các trình Packer/Obfuscator là khi các ứng dụng đã được đóng gói trong quá trình chạy (thường là giai đoạn đầu khi chạy) chúng sẽ tiến hành De-Obfuscate dữ liệu. Với các Packer/Obfuscator đơn giản, thường chúng ta nghĩ ngay đến việc kiểm tra các Crypto APIs và tập chung vào dữ liệu vào ra khi gọi các hàm này để biết được khi nào Malware giải mã code gốc. Tuy nhiên trong trường hợp này chúng ta không thấy bất kỳ một thư viện hay APIs nào kiểu như vậy, vì đơn giản chúng đã bị Obfuscate cả rồi.

3. Dynamic Analysis

Sử dụng ADB để kết nối với thiết bị Android. Sau đó dùng trình ghi log là logcat để quan sát ứng dụng ghi log như sau:
vbox86p:/ # logcat | grep 'com.jgnxmcj.knreroaxvi' ... 05-27 05:37:16.094 2219 2219 W dex2oat : /system/bin/dex2oat --runtime-arg -classpath --runtime-arg & --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2,-lock_add,-popcnt --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.jar --oat-fd=32 --oat-location=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.dex --compiler-filter=speed 05-27 05:37:16.094 2219 2219 I dex2oat : /system/bin/dex2oat --dex-file=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.jar --oat-fd=32 --oat-location=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.dex --compiler-filter=speed ...
Chương trình APK này đã tạo ra một tệp JAR mới là /data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.jar. Sau đó nó convert tệp JAR này thành rzwohkt.dex ở cùng thư mục. Trong Android thì tệp .dex được thực thi bởi Dalvik Virtual Machine và mã nguồn của ứng dụng APK có được sau khi decompile là từ đây. Kiểm tra các tệp này trong thư mục /data/user/0/com.jgnxmcj.knreroaxvi/app_files/ thì không thấy tệp nào là rzwohkt.jar hay rzwohkt.dex như trong logs cả. Rất có thể nó đã bị xóa bởi tác giả của Malware. Nhiệm vụ tiếp theo là làm sao để ngăn chặn chương trình này (Dropper) xóa các tệp .jar hoặc .dex vì rất có thể đây chính là Payload độc cuối mà chúng ta cần đi tìm.

4. Hooking với Frida

Có nhiều cách để ngăn chặn việc xóa tệp trên một ứng dụng, trong phần này chúng ta sẽ sử dụng Frida để hook vào ứng dụng xóa tệp, mục đích vô hiệu hóa hàm xóa tệp. Thông thường nếu ứng dụng không có cơ chế bảo vệ thì chúng ta sẽ hook trực tiếp vào ứng dụng tuy nhiên ứng dụng này của chúng ta đang phân tích đã bị Obfuscated dẫn đến không biết hàm nào sẽ có hành động xóa file để mà hook!. Ý tưởng là chúng ta sẽ hook thẳng vào hàm hệ thống. Với cách này chúng ta không cần quan tâm hàm nào của ứng dụng Android thực hiện xóa file, vì chúng chỉ là các APIs mức cao, bản chất chúng vẫn chỉ gọi lại các api cấp thấp bên dưới. Đầu tiên hãy kiểm tra bằng STRACE, công cụ này có sẵn trên các nền tảng Linux và tất nhiên cũng có sẵn trong Android.
notion image
Triển khai mã JavaScript để hook vào hàm unlink():
var unlinkPtr = Module.findExportByName(null, 'unlink'); Interceptor.replace(unlinkPtr, new NativeCallback(function (a) { console.log("[+] Unlink : " + Memory.readUtf8String(ptr(a))) }, 'int', ['pointer']));
Kết quả sau khi thu được Payload:
$ sha256sum rzwohkt.jar rzwohkt.dex f87d77a6dbc65d64c8c3b7a46413975543d7d58101852b9f8db728c1e6541b37 rzwohkt.jar d948656d5a68a30e85304023489d186ab94a27e05f62d6a3eac6efd843a1d512 rzwohkt.dex
notion image

5. Tham khảo