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.
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¤
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:
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
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↑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:
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:
; 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:
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-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 |