Skip to content

Chương 5: IDA Pro¤


1. Tổng Quan¤

IDA Pro (Interactive Disassembler Professional) là disassembler được phát triển bởi HexRays, là lựa chọn hàng đầu của malware analyst, reverse engineer và vulnerability analyst.

Hai phiên bản thương mại:

Phiên bản x86 x64 Bộ xử lý khác
Standard Hạn chế
Advanced Nhiều hơn

Định dạng file hỗ trợ: PE, COFF, ELF, a.out

IDA Pro Free bị "đóng băng" ở version 5.0 — không dùng cho phân tích nghiêm túc.


2. Nạp File Thực Thi¤

Quy trình load file¤

Khi load file, IDA Pro tự động nhận diện: - Format (VD: PE) - Kiến trúc xử lý (VD: Intel x86)

Các tùy chọn quan trọng khi load¤

Binary File option — Dùng khi: - Malware đính kèm shellcode, dữ liệu mã hóa, hoặc PE phụ vào cuối file hợp lệ → phần này sẽ không được load bình thường - Phân tích raw binary chứa shellcode

Manual Load — Dùng khi: - DLL bị rebase (load tại địa chỉ khác preferred base address vì địa chỉ đó đã bị chiếm) - Cho phép nhập thủ công virtual base address mới

Lưu ý mặc định

Mặc định IDA Pro không load PE header và resource section — đây là nơi malware thường giấu mã độc. Dùng Manual Load để load từng section một.


3. Giao Diện IDA Pro¤

3.1 Hai Chế Độ Disassembly Window¤

Chuyển đổi giữa hai chế độ bằng phím Spacebar.

Graph Mode (Mặc định)¤

Hiển thị luồng thực thi dưới dạng đồ thị với màu sắc có ý nghĩa:

Màu mũi tên Ý nghĩa
🔴 Đỏ Conditional jump không được thực hiện
🟢 Xanh lá Conditional jump được thực hiện
🔵 Xanh dương Unconditional jump
⬆️ Mũi tên lên Vòng lặp (loop)

Cấu hình khuyến nghị (Options → General): - Bật Line prefixes - Đặt Number of Opcode Bytes = 6 → hiển thị địa chỉ bộ nhớ và opcode hex cho từng lệnh - Nếu màn hình bị tràn sang phải: đặt Instruction Indentation = 8

Text Mode¤

Chế độ truyền thống, bắt buộc dùng để xem vùng data của binary.

Text Only
.text:0040105B    83 EC 18    sub    esp, 18h

Hiển thị: địa chỉ bộ nhớ + tên section + opcode hex + lệnh assembly

Arrows window (cột trái): - Đường liền = unconditional jump - Đường đứt = conditional jump - Mũi tên lên = vòng lặp

Auto Comments

Bật tính năng auto comment: Options → General → tích Auto comments. IDA Pro sẽ tự thêm chú thích giải thích từng lệnh — rất hữu ích khi đang học assembly.


3.2 Các Cửa Sổ Phân Tích Quan Trọng¤

Cửa sổ Công dụng
Functions Liệt kê tất cả hàm + độ dài. Flag L = library function (bỏ qua được)
Names Tất cả địa chỉ có tên: hàm, code, data, string
Strings Chuỗi ASCII > 5 ký tự (có thể tùy chỉnh)
Imports Tất cả import của file
Exports Tất cả export — quan trọng khi phân tích DLL
Structures Layout của data structure, tạo template bộ nhớ

Cross-reference từ cửa sổ: Double-click vào import function → dùng cross-reference để tìm tất cả nơi gọi hàm đó trong code.

Khôi phục về mặc định: Windows → Reset Desktop (không ảnh hưởng đến công việc đã làm)


4. Điều Hướng Trong IDA Pro¤

Ba loại link trong disassembly window:

  • Sub links → đầu hàm (VD: printf, sub_4010A0)
  • Loc links → điểm đến của jump (VD: loc_40107E)
  • Offset links → offset trong bộ nhớ

Double-click vào bất kỳ link nào để nhảy đến vị trí đó.

Strings cũng là link — VD: aPrintNumberD → nhảy đến nơi string được định nghĩa.

4.2 Navigation Band¤

Thanh màu ngang ở đáy toolbar — hiển thị toàn bộ address space của binary:

Màu Ý nghĩa
🔵 Xanh nhạt Library code (nhận diện bởi FLIRT)
🔴 Đỏ Compiler-generated code
🔵 Xanh đậm User-written code ← phân tích ở đây
🩷 Hồng Imports
⬜ Xám Defined data
🟫 Nâu Undefined data

4.3 Jump Nhanh¤

  • Phím G → nhảy đến địa chỉ bộ nhớ bất kỳ hoặc named location (VD: sub_401730, printf)
  • Jump → Jump to File Offset → nhảy đến raw file offset (hữu ích khi kết hợp với hex editor)
  • Forward/Back buttons → duyệt lịch sử điều hướng (như trình duyệt web)

4.4 Tìm Kiếm¤

Lệnh Công dụng
Search → Next Code Tìm lệnh assembly tiếp theo khớp
Search → Text Tìm chuỗi bất kỳ trong toàn bộ disassembly
Search → Sequence of Bytes Tìm kiếm nhị phân theo byte order (tìm opcode cụ thể)

Ví dụ thực tế — Crack password:

Text Only
C:\>password.exe
Enter password for this Malware: test
Bad key

Quy trình: 1. Search → Text → tìm "Bad key" 2. Double-click kết quả → nhảy đến 0x401104 3. Truy ngược lên 0x4010F1 → thấy lệnh test eax, eax sau strcmp 4. Tham số của strcmp chứa password: $mab

Text Only
C:\>password.exe
Enter password for this Malware: $mab
Key Accepted!

5. Cross-References (Xref)¤

Cross-reference cho biết một hàm được gọi từ đâu hoặc một chuỗi được dùng ở đâu.

Code Cross-References¤

GAS
00401000 sub_401000 proc near  ; CODE XREF: _main+3↑p
00401003 loc_401003:           ; CODE XREF: sub_401000+19↓j
  • _main+3↑p → hàm này được gọi từ main tại offset +3
  • sub_401000+19↓j → đây là đích nhảy từ lệnh jmp tại offset +0x19

Xem tất cả xref của một hàm: Click vào tên hàm → nhấn X → cửa sổ Xrefs liệt kê toàn bộ (VD: "Line 1 of 64" = được gọi 64 lần)

Data Cross-References¤

GAS
0040C000 dword_40C000 dd 7F000001h  ; DATA XREF: sub_401020+14↑r
0040C004 aHostnamePort db '<Hostname> <Port>'  ; DATA XREF: sub_401000+3↑o

Theo dõi cách data được truy cập — biết ngay hàm nào đang đọc/ghi dữ liệu đó.


6. Phân Tích Hàm¤

IDA Pro tự động nhận diện và đặt nhãn cho local variables và parameters:

GAS
00401020 function proc near    ; CODE XREF: _main+1C↑p
00401020
00401020 var_C = dword ptr -0Ch   ; ← local variable (EBP - 0xC)
00401020 var_8 = dword ptr -8
00401020 var_4 = dword ptr -4
00401020 arg_0 = dword ptr 8      ; ← tham số (EBP + 8)
00401020 arg_4 = dword ptr 0Ch

Quy tắc địa chỉ: - var_X → local variable → offset âm so với EBP - arg_X → tham số → offset dương so với EBP

Khi IDA Pro không nhận diện được hàm: - Nhấn P → tạo hàm thủ công - Nhấn ALT-P → chọn BP Based Frame → đặt Saved Registers = 4 bytes


7. Chỉnh Sửa Disassembly¤

Không có Undo

IDA Pro không có tính năng Undo. Mọi thay đổi là vĩnh viễn trong database.

7.1 Đặt Tên Lại (Rename)¤

Tên tự động như sub_401000 không có ý nghĩa. Đổi thành tên mô tả như ReverseBackdoorThread hoặc DNSrequest.

Lợi ích: IDA Pro tự động cập nhật tên mới ở tất cả nơi tham chiếu → chỉ cần reverse engineer một hàm một lần.

7.2 Thêm Comment¤

Phím Loại comment
: Comment thường tại dòng hiện tại
; Repeatable comment — tự động xuất hiện ở tất cả cross-reference đến địa chỉ đó

7.3 Định Dạng Operand¤

Right-click vào giá trị hex (VD: 62h) → chuyển sang: - 98 (decimal) - 142o (octal) - 1100010b (binary) - 'b' (ASCII)

Phím O → chuyển đổi giữa memory reference và literal value (sửa lỗi IDA Pro gán nhầm số thành địa chỉ)

7.4 Named Constants (Windows API)¤

IDA Pro tích hợp catalog hằng số có tên cho Windows API:

GAS
; Trước khi áp dụng
push 80000000h   ; dwDesiredAccess

; Sau khi áp dụng  
push GENERIC_READ  ; dwDesiredAccess

Right-click → Use Standard Symbolic Constant

Nếu constant không xuất hiện: View → Open Subviews → Type Libraries → load thủ công: - mssdk, vc6win (thường đã auto-load) - ntapi → Native API của Windows NT - gnuunx → Linux binary

7.5 Redefine Code/Data¤

Phím Hành động
U Undefine → chuyển về raw bytes
C Define as Code → disassemble
D Define as Data
A Define as ASCII string

Ứng dụng: Phát hiện shellcode ẩn trong PDF/PE → nhấn C tại offset đó → IDA Pro disassemble shellcode.


8. Đồ Thị (Graphing Options)¤

IDA Pro hỗ trợ 5 loại đồ thị qua WinGraph32 (legacy — không chỉnh sửa được):

Nút Chức năng Dùng khi
Flow chart Luồng thực thi hàm hiện tại Xem chi tiết một hàm
Call graph Toàn bộ function call hierarchy Hiểu tổng thể chương trình
Xrefs to Đường đến identifier được chọn Xem cách đạt đến một hàm
Xrefs from Đường ra từ symbol được chọn Xem hàm này gọi những gì
Custom Đồ thị tùy chỉnh với depth, filter Phân tích sâu theo nhu cầu

Note

Đồ thị của binary có static link lớn có thể quá rối — dùng zoom của WinGraph32 để đào sâu hơn.


9. Mở Rộng IDA Pro¤

9.1 IDC Scripts¤

Ngôn ngữ scripting tích hợp sẵn của IDA Pro. Cú pháp tương tự C:

C
static main(void) {
    auto slotidx;
    slotidx = 1;
    MarkPosition(0x00403108, 0, 0, 0, slotidx + 0, "RIJNDAEL [S] [char]");
    MakeComm(PrevNotTail(0x00403109), "RIJNDAEL [S] [char]\nAES SBOX");
}

Load: File → Script File

9.2 IDAPython¤

Python tích hợp đầy đủ vào IDA Pro hiện đại — mạnh hơn IDC nhiều.

Ba module chính: - idaapi → IDA API - idc → IDC interface - idautils → utility functions

Khái niệm EA (Effective Address) — phương thức tham chiếu chính, không dùng abstract data type.

Ví dụ — Tô màu tất cả lệnh call:

Python
from idautils import *
from idc import *

heads = Heads(SegStart(ScreenEA()), SegEnd(ScreenEA()))
functionCalls = []

for i in heads:
    if GetMnem(i) == "call":
        functionCalls.append(i)

for i in functionCalls:
    SetColor(i, CIC_ITEM, 0xc7fdff)

9.3 Commercial Plug-ins¤

Plug-in Công dụng
Hex-Rays Decompiler Chuyển disassembly → C-like pseudocode → đọc nhanh hơn nhiều
zynamics BinDiff So sánh hai IDA database → tìm điểm khác biệt giữa malware variants, tính similarity rating

10. Tóm Tắt Phím Tắt Quan Trọng¤

Phím Chức năng
Space Chuyển Graph ↔ Text mode
G Jump đến địa chỉ/tên bất kỳ
X Xem tất cả cross-references
P Tạo hàm thủ công
ALT-P Chỉnh sửa thuộc tính hàm
U Undefine code/data
C Define as Code
D Define as Data
A Define as ASCII string
O Chuyển reference ↔ literal value
: Thêm comment
; Thêm repeatable comment