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
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:0040105B 83 EC 18 sub esp, 18hHiể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 |
|---|---|
| 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
4.1 Links và Cross-References
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:
C:\>password.exe
Enter password for this Malware: test
Bad keyQuy trình:
- Search → Text → tìm
"Bad key" - Double-click kết quả → nhảy đến
0x401104 - Truy ngược lên
0x4010F1→ thấy lệnhtest eax, eaxsaustrcmp - Tham số của
strcmpchứ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+19↓j_main+3↑p→ hàm này được gọi từmaintại offset +3sub_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+3↑oTheo 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 0ChQuy tắc địa chỉ:
var_X→ local variable → offset âm so với EBParg_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í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:
; Trước khi áp dụng
push 80000000h ; dwDesiredAccess
; Sau khi áp dụng
push GENERIC_READ ; dwDesiredAccessRight-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 NTgnuunx→ 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 |
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 APIidc→ IDC interfaceidautils→ 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-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 |