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ảnx86x64Bộ xử lý khác
StandardHạn chế
AdvancedNhiề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

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ươngUnconditional jump
⬆️ Mũi tên lênVò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: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

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

Cửa sổCông dụng
FunctionsLiệt kê tất cả hàm + độ dài. Flag L = library function (bỏ qua được)
NamesTất cả địa chỉ có tên: hàm, code, data, string
StringsChuỗi ASCII > 5 ký tự (có thể tùy chỉnh)
ImportsTất cả import của file
ExportsTất cả export — quan trọng khi phân tích DLL
StructuresLayout 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ạtLibrary code (nhận diện bởi FLIRT)
🔴 ĐỏCompiler-generated code
🔵 Xanh đậmUser-written code ← phân tích ở đây
🩷 HồngImports
⬜ XámDefined data
🟫 NâuUndefined 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ệnhCông dụng
Search → Next CodeTìm lệnh assembly tiếp theo khớp
Search → TextTìm chuỗi bất kỳ trong toàn bộ disassembly
Search → Sequence of BytesTìm kiếm nhị phân theo byte order (tìm opcode cụ thể)

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

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
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

00401000 sub_401000 proc near  ; CODE XREF: _main+3↑p
00401003 loc_401003:           ; CODE XREF: sub_401000+19j
  • _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

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

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:

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

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ímLoạ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:

; 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ímHành động
UUndefine → chuyển về raw bytes
CDefine as Code → disassemble
DDefine as Data
ADefine 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útChức năngDùng khi
Flow chartLuồng thực thi hàm hiện tạiXem chi tiết một hàm
Call graphToàn bộ function call hierarchyHiểu tổng thể chương trình
Xrefs toĐường đến identifier được chọnXem cách đạt đến một hàm
Xrefs fromĐường ra từ symbol được chọnXem hàm này gọi những gì
CustomĐồ thị tùy chỉnh với depth, filterPhân tích sâu theo nhu cầu

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:

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:

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-inCông dụng
Hex-Rays DecompilerChuyển disassembly → C-like pseudocode → đọc nhanh hơn nhiều
zynamics BinDiffSo 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ímChức năng
SpaceChuyển Graph ↔ Text mode
GJump đến địa chỉ/tên bất kỳ
XXem tất cả cross-references
PTạo hàm thủ công
ALT-PChỉnh sửa thuộc tính hàm
UUndefine code/data
CDefine as Code
DDefine as Data
ADefine as ASCII string
OChuyển reference ↔ literal value
:Thêm comment
;Thêm repeatable comment