คลัง
reverse

Binary Ninja

Binary Ninja (Binja) เป็น reverse engineering platform ที่เด่นเรื่อง Intermediate Language (BNIL) หลายระดับและ Python API ที่สะอาดที่สุด เหมาะกับงาน automation/deobfuscation บทนี้ลงลึก BNIL แต่ละชั้น, การ navigate, Python API, และเทคนิคแก้โจทย์

IntermediateAdvanced#binary-ninja#binja#reverse#decompiler#il#bnil#api#ctf

1. Binary Ninja คืออะไร

Binary Ninja เป็น reversing platform เชิงพาณิชย์ (ถูกกว่า IDA มาก, มี cloud version ฟรีให้ลอง) จุดเด่นหลักคือ BNIL (Binary Ninja Intermediate Language) หลายระดับ และ Python API ที่สะอาดและทรงพลังที่สุดในบรรดา RE tools — เหมาะกับการเขียน automation, deobfuscation, และ analysis แบบ programmatic

2. BNIL — IL หลายระดับ (จุดเด่น)

Binja แปลง assembly เป็น IL หลายชั้น ให้เลือกดูระดับที่เหมาะกับงาน — ยิ่งสูงยิ่งใกล้ C ยิ่งต่ำยิ่งใกล้ asm:

ระดับ ILลักษณะใช้เมื่อ
Disassemblyassembly ดิบดู instruction จริง
LLIL (Low Level)ใกล้ asm แต่ normalizeวิเคราะห์ระดับ instruction
MLIL (Medium Level)มีตัวแปร, ตัด registerวิเคราะห์ data flow
HLIL (High Level)ใกล้ C ที่สุดอ่าน logic (เหมือน decompiler)
สลับระดับ IL ด้วยปุ่มมุมล่างซ้ายหรือคลิกขวา → เลือก view; HLIL อ่านง่ายสุดเหมือน decompiler, MLIL ดีสำหรับ track data flow ในการเขียน analysis
  • G: goto address; N: rename; Y: change type
  • X: cross-references; double-click = ตามไป
  • Esc / Alt+←: ย้อนกลับ
  • ; comment; Space: สลับ linear/graph view
  • Triage Summary แสดงภาพรวม binary ตอนเปิด

4. Python API (จุดแข็งสุด)

Binary Ninja API
import binaryninja as bn

bv = bn.load("./binary")             # โหลด binary

# วน loop ทุกฟังก์ชัน
for func in bv.functions:
    print(hex(func.start), func.name)

# อ่าน HLIL (ใกล้ C) ของฟังก์ชัน
func = bv.get_functions_by_name("main")[0]
for block in func.hlil:
    for instr in block:
        print(instr)

# อ่าน/เขียน byte (deobfuscate / patch)
data = bv.read(0x402000, 16)
key = 0x42
print(bytes(b ^ key for b in data))
bv.write(0x401234, b'\x90')         # patch NOP

# ใช้ใน console ในตัว (ด้านล่าง) ได้ด้วย — bv พร้อมใช้
API สะอาดสุด เหมาะ automate; console ในตัวมี bv ให้เลย; ใช้ track data flow ผ่าน MLIL/HLIL ได้ลึก

5. เทคนิค CTF + เลือก tool

  • หา flag check: search strings → xref (X) → ไปโค้ด → อ่าน HLIL
  • deobfuscation: จุดแข็ง Binja — เขียน API วน decode/patch ทั้งไฟล์ผ่าน MLIL/HLIL
  • track data flow: MLIL/SSA form ช่วยตามค่าตัวแปรย้อนกลับ (เช่นหาที่มาของ key)
  • reverse algorithm จาก HLIL → เขียน solver
  • เลือก tool: Ghidra (ฟรี), IDA (มาตรฐาน), Binja (เด่น API/IL — งาน scripting/deobfuscation)

6. Quick Reference

  • RE platform เด่นเรื่อง BNIL + Python API
  • BNIL: Disassembly → LLIL → MLIL → HLIL (เลือกระดับ)
  • HLIL อ่านง่ายสุด; MLIL ดี track data flow
  • คีย์: G goto, N rename, Y type, X xref
  • API: bn.load(); bv.functions; func.hlil; bv.read/write
  • เด่นงาน automate/deobfuscation; ราคาถูกกว่า IDA, มี Cloud ฟรี

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติอยากได้ Python API ที่สะอาดแบบ Binary Ninja แต่เครื่อง Kali เปล่าๆ ไม่มี Binja ติดตั้ง (ไม่ได้มากับ Kali) ทำตามนี้ทีละขั้น

  1. 1เช็คว่ามี Binary Ninja ในเครื่องไหม (which binaryninja หรือดู path ที่ติดตั้ง)
  2. 2ถ้าไม่มี เริ่มด้วย ghidra ก่อน (มีใน Kali ฟรี) ทำ static ปกติ: file → strings → imports → analyze → main
  3. 3ถ้างานต้องการ automation/scripting เยอะ (decode ทั้งไฟล์, patch หลายจุด) ลองใช้ Ghidra headless + Python (Flat API) แทนไปก่อน
  4. 4ถ้าอยากลองของจริงแบบไม่เสียเงิน สมัคร Binary Ninja Cloud (ฟรี ใช้ผ่านเบราว์เซอร์) แล้วอัพโหลด binary ไปวิเคราะห์
  5. 5ถ้าจำเป็นต้องมี Binja ติดตั้งจริงจัง (โจทย์ deobfuscation หนักๆ) พิจารณา Personal license (ถูกกว่า IDA มาก)
  6. 6ทำงานแบบเดียวกับ ghidra: หา main → อ่าน HLIL (คล้าย pseudo-C) → rename/retype → X ดู xref
  7. 7เขียน Python API script (bn.load, bv.functions, bv.read/write) เพื่อ automate deobfuscation
  8. 8เปรียบเทียบผลกับ ghidra ถ้าอ่านไม่ออกจากตัวหนึ่ง ลองอีกตัว
ไม่มี Binary Ninja ในเครื่อง แล้วไปต่อยังไง
which binaryninja เช็คว่ามี Binja ติดตั้งไหม
❌ ไม่มี (ปกติสำหรับ Kali ล้วนๆ)→ ใช้ ghidra แทนไปก่อน (มีใน Kali ฟรี)
✅ มีติดตั้ง/มี license→ เปิดไฟล์ใน Binja ได้เลย
งานต้องการ automation/scripting หนักแค่ไหน
✅ ต้อง automate เยอะ (decode/patch หลายจุด)→ ใช้ Ghidra headless + Python (Flat API) ก็ทำได้ใกล้เคียง
❌ อยากลอง BNIL/API จริงๆ โดยไม่ติดตั้ง→ ลอง Binary Ninja Cloud (ฟรีผ่านเบราว์เซอร์)
อัพโหลด binary ไป Binary Ninja Cloud หรือ dogbolt.org เทียบ decompiler
ผลที่ได้พอสำหรับโจทย์นี้ไหม
✅ พอแล้ว อ่าน logic ต่อได้→ ทำงานต่อ rename/retype/xref จนเข้าใจ logic
❌ ต้องการ debugger/ปลั๊กอินเฉพาะที่ไม่มีในเวอร์ชันฟรี→ พิจารณาซื้อ Personal license หรือใช้ IDA แทนบางงาน
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
เช็ค type/archfile--
ดึงข้อความเร็วๆstrings-CyberChef
decompiler ที่มีใน Kali (ทดแทน Binja ได้)ghidraapt install ghidradogbolt.org
ลอง Binja จริงโดยไม่ติดตั้ง--Binary Ninja Cloud (cloud.binary.ninja)
เทียบผล decompiler หลายตัว--dogbolt.org
เทียบ assembly กับ compiler--godbolt.org
automate แบบ headless (แทน Binja API)ghidra (Python script)--
debug ค่า runtimegdb + gef/pwndbgapt install gdb-
🚑 ถ้าตันสนิท ลองท่าถัดไป: ghidra — ทางเลือกฟรีที่มีใน Kali อยู่แล้ว ใกล้เคียง Binja มาก; static-analysis — ยัง triage ไม่ครบก่อนเลือกเครื่องมือ; dynamic-analysis — ต้องยืนยันค่า runtime จริง; ida — อีกทางเลือกเชิงพาณิชย์ ถ้าต้องการ debugger ในตัว; binary-patching — เข้าใจ logic แล้วแค่ต้องแก้ให้ผ่าน check

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้