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

Thảo luận trong 'Virus/Malware' bắt đầu bởi Malware, 14/04/15, 05:04 PM.

  1. Malware

    Malware Wh------

    Tham gia: 08/01/15, 11:01 AM
    Bài viết: 56
    Đã được thích: 38
    Điểm thành tích:
    48
    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.

    [​IMG]

    ChọnAndroidDex file… rồi OK

    [​IMG]

    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.
    [​IMG]



    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

    [​IMG]


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

    [​IMG]


    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.

    [​IMG]


    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

    [​IMG]
    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à:

    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]

    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