Hướng dẫn phân tích file APK với công cụ IDA

Malware

Wh------
08/01/2015
41
56 bài viết
Hướng dẫn phân tích file APK với công cụ IDA
1,Giới thiệu chung

  • Đối với phân tích tĩnh, ta tiến hành phân tích mã độc dựa trên mã Smali hoặc Java Bytecode có được sau khi decompile file APK. Tuy nhiên việc phân tích tĩnh không phải khi nào cũng khả thi do các hàm khi được decompile từ file APK đôi khi không rõ ràng -> việc biết rõ thuật toán hàm xử lý là rất khó, nhất là những thuật toán mã hóa hay giải mã,…
  • Đối với phân tích động, ta không cần biết chính xác thuật toán trong hàm là gì mã chỉ cần biết luồng thực thi của chương trình. Từ đó việc phân tích trở nên đơn giản chỉ là việc đặt breakpoint đúng chỗ và đọc thông tin đầu vào, thông tin đầu ra của hàm mà ta cần quan sát.
Hai phương pháp phân tích không tách biệt mà bổ sung cho nhau, trên thực tế ta dùng phương pháp phân tích tĩnh đễ phát hiện luồng thực thi, từ luồng thực thi ta sẽ đặt các breakpoint và lấy nội dung cần quan sát. Sau đây sẽ hướng dẫn cách phân tích động bằng công cụ debug IDA.Lưu ý là chỉ từ phiên bản IDA 6.6 Pro mới có chức năng debug Davilk, vì thế chỉ từ phiên bản này trở đi ta mớicó thể debug được file APK.
2,Phân tích luồng thực thi
Từ hướng dẫn của bài viết trước đây trên Whitehat:http://whitehat.vn/threads/11566-Huong-dan-phan-tich-ma-doc-tren-nen-tang-Android.html
Ta đã biết được luồng thực thi của mẫu550b3c6b8766fca70d3a8f7d5e00cf50527a3df208e6e2812e7eab8f1bd55ec2.apk
Mẫu thực hiện gửi tin nhắn với luồng:Main() → onCreate() → loadConfig() → initData()→showDialogConfirm→ handleAction → handleActionASMS → sendSMS.
Trong hàm Main()mẫu tiến hành khởi tạo dữ liệu:
Main.edit.putString("NUM_LIST",Utils.decrypt(as[0]));
Main.edit.putString("MSG_LIST",Utils.decrypt(as[1]));
Main.edit.putString("MSG_ACTI",Utils.decrypt(as[2]));
Main.edit.putString("MSG_DOWL",Utils.decrypt(as[3]));
Main.edit.putBoolean("IS_APP_SMS_INSTALLED",isAppSMSInstalled(Utils.decrypt(as[4])));
Trong giới hạn của bài hướng dẫn, ta sẽ tiến hành phân tích hàm Utils.decrypt()để biết đầu ra của hàm này.
3.Các bước thực hiện
Sau đây ta sẽ tiến hành phân tích hàm Utils.decrypt().Sử dụng IDA 6.6 Pro. Để tăng khả năng thành công của việc debug, ta nên sử dụng máy đã root. Nếu không thiết bị ta có thể dùng máy ảo Genymotion (mặc định đã root).
Giả định đã có đầy đủ các công cụ.
Bước1:Load file APK vào IDA và chọn file classes.dex.

14899399421.jpg


ChọnAndroidDex file… rồi OK

14899399422.jpg


Bước2:Dùng các công cụ Decompile đã giới thiệu để đọc fileAndroidManifest.xml nhằmphát hiện tên package và tên của Activity mà ta muốn khởichạy. Ở đây là Activity Main.
14899399423.jpg




Bước3:Cấu hình thông tin package và Activity trên IDA
VàoDebugger -> Debugger option.. -> Set specific options
Ở mục này ta cấu hình đường dẫn tới file adb.exe và lựachọn package cũng như Activity muốn thực hiện đặt breakpoint

14899399424.png



Bước4: Tìmvị trí hàm để đặt breakpoint

14899399425.jpg



Bước5:Cài đặt mẫu vào thiết bị máy ảo Genymotion (hoặcthiết bị thật đã root, được sử dụng làm máy test)
Bước6:Bắt đầu Debug
Ấn F9 hoặc vào Bebugger -> Start Process
Khi đó chương trình trên thiết bị sẽ khởi chạy. Ngay lậptức IDA sẽ nhảy vào breakpoint.

14899399426.jpg



Bước7:Lấy giá trị trả về
Để ý code smali của hàm ta thấy giá trị trả về sẽ nằm tại v0. Khi đó để xem được giá trị của biến v0 ta thực hiện:
Debugger-> Debugger Windows -> Watch view.
Chuộtphải vào cửa sổ vừa mở Add watch.
Lưu ý là IDA không biết được kiểu của các biến nên ta phải tự gán kiểu cho biến đó. Ví dụ: (String)v0

14899399427.jpg

Bước8:Kết quả: hàm Utils.decrypt()sẽchạy 5 lần tương ứng với 5 lần gọi trong hàm Main(), giá trị mà ta lần lượt sẽ quan sát được là:

148993994281.jpg

148993994282.jpg

148993994283.jpg

148993994284.jpg

148993994285.jpg


4.Kết luận
Với việc sử dụng IDA ta có thể nhanh chóng phát hiện các tham số đầu vào cũng như đầu ra của một hàm mà không cần quan tâm đến nội dung của hàm. Tuy nhiên không phải lúc nào ta cũng có thể sử dụng được phương pháp phân tích động này do một số nguyên nhân như: không nắm rõ luồng thực thi của chương trình, breakpoint đặt vào các tiến trình đa luồng,… Nói chung vẫn cần kết hợp hai phương pháp phân tích tĩnh và phân tích động để đạt được hiệu quả cao nhất trong phân tích mã độc.
5.Tài liệu tham khảo
https://www.hex-rays.com/products/ida/support/tutorials/debugging_dalvik.pdf
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Bên trên