# 08 — Reverse engineering toolchain (Ghidra, Cheat Engine, x64dbg, ReClass)

> Trả lời câu hỏi: **tool có cần Ghidra không?** — Cần, nhưng chỉ cho **giai đoạn recon offline**
> (Phase 1). Bot khi chạy không dùng Ghidra — nó chỉ đọc `configs/offsets.json`.

## 1. Vai trò từng công cụ

| Công cụ | Loại phân tích | Vai trò trong dự án | Chi phí |
|---------|----------------|---------------------|---------|
| **Cheat Engine** | Động (memory scan) | Tìm nhanh địa chỉ HP/MP/pos bằng scan giá trị; tốc độ recon nhanh nhất | Miễn phí |
| **x64dbg** | Động (debugger) | Breakpoint "find out what writes/accesses this address" → dựng pointer chain, hiểu luồng dữ liệu | Miễn phí |
| **ReClass.NET** | Động (struct visualization) | Dựng struct C++ từ địa chỉ đã biết — xem field thay đổi real-time | Miễn phí |
| **Ghidra** | Tĩnh (decompiler) | Đọc pseudocode của game: xác nhận struct, tìm hàm tính damage/state machine của boss, tìm `state_id` enum | Miễn phí (NSA) |
| **RenderDoc/PIX** | Đồ họa | Phương án dự phòng: nếu memory bị chặn, đọc dữ liệu từ frame GPU | Miễn phí |

**Tóm lại:** Ghidra không bắt buộc để bắt đầu (Cheat Engine là điểm khởi động), nhưng cần
Ghidra khi muốn đi sâu — hiểu boss state machine để bot dodge "pro" là thứ scan giá trị
không làm được, phải đọc code decompiled.

## 2. Workflow recon chuẩn (Phase 1)

```mermaid
flowchart TD
    S1["1. CE: scan giá trị HP\n(unknown initial → decrease)"] --> S2["2. CE: pointer scan\n→ chuỗi ứng viên"]
    S2 --> S3["3. x64dbg: breakpoint access\n→ xác nhận chain thật, loại false positive"]
    S3 --> S4["4. ReClass: dựng struct quanh base\nđặt tên field (mp, pos, suit...)"]
    S4 --> S5["5. Ghidra: decompress/decompile module\ntìm refs tới struct → hiểu logic\nboss state machine, cooldown array"]
    S5 --> S6["6. Xuất offsets.json v1\n+ AOB signature cho từng anchor"]
    S6 --> S7["7. Validate: bot chạy 30 phút\nso giá trị đọc với UI game"]
```

## 3. Kỹ thuật cụ thể cần áp dụng

### 3.1 AOB Signature (quan trọng nhất cho bảo trì)
- Với mỗi anchor, tìm **pattern byte ổn định** quanh lệnh truy cập (dùng `??` cho wildcards).
- offsets.json lưu signature; runtime scan lại mỗi lần attach ⇒ sống sót qua ASLR và một phần patch nhỏ.
- Mục tiêu: sau patch nhỏ, chỉ 1–2 signature vỡ, diff tool chỉ điểm danh nào cần làm lại.

### 3.2 Pointer chain
- Ưu tiên chain bắt đầu từ **static base** (module base + offset) — ổn nhất.
- Pointer scan với depth ≤ 4, lọc theo "sống sót sau restart game" (CE có chức năng này).
- Ghi lại cả **alternate chain** dự phòng khi chain chính vỡ sau patch.

### 3.3 Ghidra lưu ý riêng cho project này
- Client chạy qua **Crossplay Launcher** — cần xác định binary game thật (không phải launcher).
- Nếu binary .NET/IL2CPP (thường với game port mobile): dùng **Il2CppDumper** để khôi phục
  metadata class/method rồi load script/ghidra-symbol vào Ghidra — tăng tốc hàng chục lần so với decompile mù.
- Cài plugin: Ghidra-x64dbg bridge hoặc exported symbol map (`.idc`/JSON) để các địa chỉ khớp nhau giữa công cụ.
- Nếu binary packed/obfuscated: dump từ memory lúc runtime (x64dbg + Scyllahide/Scylla) rồi decompile dump.

### 3.4 Đo reaction/tham chiếu người thật
- Dùng CE/x64dbg không làm được — thu bằng **record macro** người chơi thật (log input qua
  chính InputController ở chế độ record) để hiệu chuẩn Humanizer (xem [04-input-module.md](04-input-module.md)).

## 4. Bảo trì offsets sau patch (Phase 5)

1. Chạy game version mới + `tools/scan_sigs.exe` (tự viết): scan lại toàn bộ signature.
2. Signature còn khớp ⇒ offset giữ nguyên hoặc tự tính lại từ instruction rip-relative.
3. Signature vỡ ⇒ diff tool liệt kê; recon lại đúng field đó bằng CE (10–30 phút/anchor).
4. Validate cuối: bot chạy 30 phút, so giá trị memory với UI game.

**KPI bảo trì:** khôi phục toàn bộ offsets sau 1 patch ≤ 2h (đã cam kết trong [07-roadmap.md](07-roadmap.md)).

## 5. Phương án dự phòng khi anti-cheat chặn đọc bộ nhớ

| Triệu chứng | Giải pháp |
|-------------|-----------|
| `OpenProcess` bị từ chối | Chạy bot với quyền phù hợp; nếu game dùng driver bảo vệ → chuyển hẳn sang Vision-first |
| ReadProcessMemory trả rác/bị kill process | Vision-first: Desktop Duplication + template matching HP/MP/cooldown + OCR text |
| Không đọc được boss state | Đọc telegraph bằng **vision trên animation cue** (màu flash, hitbox) — chậm hơn nhưng khả thi |
| Ghi nhớ kiến trúc | DecisionEngine dùng `Perception` hợp nhất, không quan tâm nguồn (xem [06-decision-engine.md](06-decision-engine.md)) |

> Quyết định **memory-first hay vision-first** phải chốt ngay đầu Phase 1 — đây là rủi ro
> lớn nhất của lộ trình (xem bảng rủi ro [07-roadmap.md](07-roadmap.md)).
